代码比较简单,直接如下
<template>
<div id="app">
<button @click="_add">父组件按钮点击</button>
<ul>
<li v-for="(item,index) in message" :key="index">
{{item.name}}
</li>
</ul>
<hr>
<children v-model="message"></children>
</div>
</template>
<script>
import children from './components/children'
export default {
name: 'app',
components: {
children
},
data(){
return{
message: []
}
},
methods: {
_add(){
this.message.push({
name:'name1'
})
},
},
}
</script>
<template>
<div class="children">
<button @click="_add">子组件按钮点击</button>
<ul>
<li v-for="(item,index) in message" :key="index">
{{item.name}}
</li>
</ul>
</div>
</template>
<script>
export default {
name: "children",
props: {
value: {
type: Array
},
},
data() {
return {
message: []
}
},
watch:{
value(newVal){
this.message = newVal
}
},
methods: {
_add(){
this.message.push({
name:'name2'
})
},
},
};
</script>
点击父按钮会正常传递数据到子组件,如图:
只点击子组件因为没有 emit 传值显示也是正常,如图:
但是问题来了,如果先点击一次父按钮,再点击子组件里面的按钮,这时为什么会触发父组件数据更新?如图:
其中的 name1 是第一次先点击父组件的结果,name2 是第二次点击子组件按钮出现的结果。
在官网的介绍当中,说如果要更新父组件的数据,需要手动 emit 触发更新,目前遇到的这种情况不是很明白为什么会自动触发更新数据。
请前辈们解答下这个疑问~~~
如上改用非复杂数据类型不会出现题主说的问题