gpt4 book ai didi

javascript - 在 Vue JS 组件中使用同步进行双向 prop 数据绑定(bind)

转载 作者:行者123 更新时间:2023-12-01 00:53:00 25 4
gpt4 key购买 nike

我有一组嵌套的 Vue JS 组件,我正在其上实现双向 prop 绑定(bind),但我无法正常工作。

有一个 DataTable 子组件 嵌套在 FoodCat 父组件 中。我在 FoodCat 父组件 中有一个名为 selected 的属性,我通过 props 将其传递给 DataTable 。我想使用 .sync 方法在 prop 上实现双向绑定(bind)。

FoodCats.vue - 父组件:

<template>
<admin-data-table
:dataTable="dataTable"
:modelName="modelName"
:collection="collection"
:tblShowFields="tblShowFields"
:selectedList.sync="selected"
></admin-data-table>
</template>

<script>
import { MessageBox } from '../../MessageBox.js';
import { crudFunctionsMixin } from './mixins/crud-functions.js';

Vue.component('admin-data-table', require('../components/Admin/DataTable').default);

export default {
mixins: [ crudFunctionsMixin ],
data() {
return {
model: "food-cat",
modelName: "Food Category",
modelNamePlural: "Food Categories",
form: {
inputs: {
id: {
val: '', save: true,
hide: true
},
title: {
val: '', save: true, add: true,
gridSize: 12,
icon: 'business',
placeholder: 'Title'
},
slug: {
val: '', save: true, add: true
}
},
titleText: "Add Food Category",
errors: false
},
formSearch: {
inputs: {
keywords: {
show: true,
val: "",
icon: "keyboard",
placeholder: "Keywords"
}
}
},
toolbar: {
btns: [],
menuItems: []
},
dataTable: {
headers: [
{ text: 'ID', value: 'id', sortable: true },
{ text: 'Title', value: 'title', sortable: true },
{ text: 'Slug', value: 'slug', sortable: true },
{ sortable: false }
],
pagination: {
sortBy: 'title'
},
rowButtons: []
}
}
},
watch: {
selected: function(newSelectedList) {
this.$root.selected = newSelectedList;
}
}
}
</script>

DataTable.vue - 子组件:

<template>
<v-flex xs12>
<v-progress-linear :indeterminate="true" :height="3" color="#c79121" :active="dataTable.loadingVal" class="mb-0 mt-5"></v-progress-linear>
<v-data-table :ref="modelName + 'Table'" v-model="selectedList" :headers="dataTable.headers" :items="collection" :pagination.sync="dataTable.pagination" select-all item-key="id" class="elevation-1" >
<template v-slot:headers="props">
<tr>
<th><v-checkbox :input-value="props.all" color="#c79121" :indeterminate="props.indeterminate" primary hide-details @click.stop="toggleAllSelected"></v-checkbox></th>
<th v-for="header in props.headers" :key="header.text"
:class="['column sortable', dataTable.pagination.descending ? 'desc' : 'asc', header.value === dataTable.pagination.sortBy ? 'active' : '']"
@click="changeSort(header.value)">
<v-icon small>arrow_upward</v-icon>
{{ header.text }}
</th>
</tr>
</template>
<template v-slot:items="props">
<tr :active="props.selected">
<td class="text-center align-middle" @click="props.selected = !props.selected">
<v-checkbox :input-value="props.selected" primary hide-details color="#c79121"></v-checkbox>
</td>
<td v-for="(field, key) in props.item" v-if="tblShowFields.includes(key)">{{ field }}</td>
<td class="text-right align-middle">
<v-btn title="Edit" color="primary" fab small @click="edit(props.item.id)"><v-icon>edit</v-icon></v-btn>
<v-btn title="Delete" color="error" fab small class="text-white" @click="remove(props.item.id)"><v-icon>delete_outline</v-icon></v-btn>
</td>
</tr>
</template>
<template slot="no-data">
<p class="text-xs-center">No Data</p>
</template>
</v-data-table>
</v-flex>
</template>

<script>
export default {
name: "admin-data-table",
props: [
'dataTable',
'collection',
'modelName',
'collection',
'selectedList',
'tblShowFields'
],
watch: {
selectedList: function(newList) {
this.$emit('update:selectedList', newList);

}
}
}
</script>
<小时/>

目前,DataTable 子组件 内的 selectedList 对象与表格复选框正常工作,并且更改已正确同步到> FoodCat 父 组件中的选定 对象,以及 $root 实例。

但是我仍然收到 vue 警告,告诉我不要直接修改 selectedList 属性。

Avoid mutating a prop directly since the value will be overwritten whenever the parent component re-renders. Instead, use a data or computed property based on the prop's value. Prop being mutated: "selectedList"

<小时/>

为什么我仍然收到此警告?我是否错误地执行了此操作?

最佳答案

罪魁祸首是:

v-model="selectedList"

这相当于

:value="selectedList" @input="selectedList = $event"

如您所见,您将在 input 事件的处理程序中分配给 selectedList

当您以这种方式设计组件时,请确保不要将 props 与 v-model 绑定(bind),而是必须显式处理 input 事件:

:value="selectedList" @input="$emit('update:selectedList', $event)"

我也不明白观察者的目的? prop 应该只从父级更改为子级,那么为什么您需要向父级发送更新作为响应呢?

关于javascript - 在 Vue JS 组件中使用同步进行双向 prop 数据绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56821679/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com