我是Vue JS的新手,我遇到了这个问题,我试图通过将父道具传递给孩子来制作数据表
我犯了这个错误
[Vue warn]:避免直接改变道具,因为每当父组件重新渲染时,该值将被覆盖。相反,使用基于道具值的数据或计算属性。道具正在变异:“editem”
这是我的密码
这是我的页面:
<template >
<v-container >
<v-col>
<Datatables
:headers="this.headers"
:items="items"
:editedItem="this.editedItem"
:defaultItem="defaultItem"
sort-by="calories"
class="elevation-1" />
</v-col>
<v-spacer></v-spacer>
<br>
<v-col>
</v-col>
</v-container >
</template>
<script>
import Datatables from '../../components/Datatable/CrudDatatable'
export default {
components:{
Datatables
},
data() {
return {
headers: [
{
text: 'Dessert (100g serving)',
align: 'start',
sortable: false,
value: 'name',
},
{ text: 'Calories', value: 'calories' },
{ text: 'Fat (g)', value: 'fat' },
{ text: 'Carbs (g)', value: 'carbs' },
{ text: 'Protein (g)', value: 'protein' },
{ text: 'Actions', value: 'action', sortable: false },
],
items: [],
editedItem: {
name: '',
calories: 0,
fat: 0,
carbs: 0,
protein: 0,
},
defaultItem: {
name: '',
calories: 0,
fat: 0,
carbs: 0,
protein: 0,
},
}
},
created () {
this.initialize()
},
methods: {
initialize () {
this.items = [
{
name: 'Frozen Yogurt',
calories: 159,
fat: 6.0,
carbs: 24,
protein: 4.0,
},
{
name: 'Ice cream sandwich',
calories: 237,
fat: 9.0,
carbs: 37,
protein: 4.3,
},
]
},
},
}
</script>
<style>
</style>
这是我的组件:
<template>
<v-data-table :headers="headers" :items="items" sort-by="calories" class="elevation-1">
<template v-slot:top>
<v-toolbar flat color="white">
<v-toolbar-title>My CRUD</v-toolbar-title>
<v-divider class="mx-4" inset vertical></v-divider>
<v-spacer></v-spacer>
<v-dialog v-model="dialog" max-width="500px">
<template v-slot:activator="{ on }">
<v-btn color="primary" dark class="mb-2" v-on="on">New Item</v-btn>
</template>
<v-card>
<v-card-title>
<span class="headline">{{ formTitle }}</span>
</v-card-title>
<v-card-text>
<v-container>
<v-row>
<v-col cols="12" sm="6" md="4">
<v-text-field v-model="editedItem.name" label="Dessert name"></v-text-field>
</v-col>
<v-col cols="12" sm="6" md="4">
<v-text-field v-model="editedItem.calories" label="Calories"></v-text-field>
</v-col>
<v-col cols="12" sm="6" md="4">
<v-text-field v-model="editedItem.fat" label="Fat (g)"></v-text-field>
</v-col>
<v-col cols="12" sm="6" md="4">
<v-text-field v-model="editedItem.carbs" label="Carbs (g)"></v-text-field>
</v-col>
<v-col cols="12" sm="6" md="4">
<v-text-field v-model="editedItem.protein" label="Protein (g)"></v-text-field>
</v-col>
</v-row>
</v-container>
</v-card-text>
<v-card-actions>
<v-spacer></v-spacer>
<v-btn color="blue darken-1" text @click="close">Cancel</v-btn>
<v-btn color="blue darken-1" text @click="save">Save</v-btn>
</v-card-actions>
</v-card>
</v-dialog>
</v-toolbar>
</template>
<template v-slot:item.action="{ item }">
<v-icon small class="mr-2" @click="editItem(item)">mdi-pencil</v-icon>
<v-icon small @click="deleteItem(item)">mdi-delete</v-icon>
</template>
<template v-slot:no-data>
<v-btn color="primary" @click="initialize">Reset</v-btn>
</template>
</v-data-table>
</template>
<script>
export default {
props: {
headers: {
type: Array
},
items: {
type: Array
},
editedItem: {
type: Object
},
defaultItem: {
type: Object
}
},
data: () => ({
dialog: false,
editedIndex: -1,
}),
computed: {
formTitle() {
return this.editedIndex === -1 ? "New Item" : "Edit Item";
}
},
watch: {
dialog(val) {
val || this.close();
}
},
created () {
this.getParentItem()
},
methods: {
getParentItem(){
},
editItem(item) {
this.editedIndex = this.items.indexOf(item);
this.editedItem = Object.assign({}, item);
this.dialog = true;
},
deleteItem(item) {
const index = this.items.indexOf(item);
confirm("Are you sure you want to delete this item?") &&
this.items.splice(index, 1);
},
close() {
this.dialog = false;
setTimeout(() => {
this.editedItem = Object.assign({}, this.defaultItem);
this.editedIndex = -1;
}, 300);
},
save() {
if (this.editedIndex > -1) {
Object.assign(this.items[this.editedIndex], this.editedItem);
} else {
this.items.push(this.editedItem);
}
this.close();
}
}
};
</script>
添加一些数据变量,这些数据变量设置为组件的创建的
中的prop变量。比如:
this.internalItems = this.items
this.internalEditedItem = this.editedItem
然后在方法中编辑这些变量,而不是prop变量。
this.internalEditedItem = Object.assign({}, item);
...
Object.assign(this.items[this.editedIndex], this.internalEditedItem);
...etc
如果您计划从父级修改道具,您还需要添加一个监视变量以将其重置为新值。
我得到警告: app.js:87486[Vue警告]:避免直接更改prop,因为每当父组件重新呈现时,该值将被覆盖。相反,使用基于道具值的数据或计算属性。被变异的道具:“喜欢计数” 我的刀锋 Vue代码
如何解决此错误消息: [Vue warn]:避免直接改变道具,因为每当父组件重新渲染时,该值将被覆盖。相反,使用基于道具值的数据或计算属性。道具变异:“抽屉” 父组件: 子组件:
我有一个组件,我想在不同的页面上使用。嗯,它在第一次切换之前工作良好。它显示像以前一样,但是当我单击“关闭”按钮时,它会关闭,但是控制台输出: [Vue warn]:避免直接改变道具,因为每当父组件重新渲染时,该值将被覆盖。相反,使用基于道具值的数据或计算属性。道具变异:“可见” 发现于 --- 在那之后点击就不显示了 有办法解决这个问题吗? Snackbar.vue 我ogin.vue
升级到Vue 2.0我有很常见的问题 我得到警告: 避免直接改变道具,因为每当父组件重新渲染时,该值将被覆盖。相反,使用基于道具值的数据或计算属性。正在变异的道具:“用户名”(在组件中找到) 我读了很多次文档,但仍然不明白如何修复它。 和在主Vue应用中声明。 这是我的代码: 我尝试了,但它似乎不起作用,我不明白为什么。它应该将该值绑定到父级(主Vue应用程序)
我试图重用我在组件文件中创建的自定义下拉列表,其中道具是下拉列表中的值选项。当我开始选择下拉列表时,我意识到一个vue warn msg: [Vue warn]:避免直接改变道具,因为每当父组件重新渲染时,该值将被覆盖。相反,使用基于道具值的数据或计算属性。道具变异:“道具” 最佳做法是什么
我有一个带有道具的组件,我想将值从false修改为true,但我有一个消息表单chrome控制台 在父组件中,我有一个函数(myFunction),它接受一个参数(value)。 我需要像这样保留我的参数,但我还需要从子组件检索emit的值,以更改myData的值,而不改变child中的props。 https://codesandbox.io/s/distracted-wiles-w8vwf 谢