vue官网在讲解props的单向数据流时提到:

额外的,每次父级组件发生更新时,子组件中所有的 prop 都将会刷新为最新的值。这意味着你不应该在一个子组件内部改变 prop。如果你这样做了,Vue 会在浏览器的控制台中发出警告。

但是我测试,直接修改props的值,并未给出任何警告。
大家有遇到吗?


···回复:

🌰栗子来了,请查收

父组件

<template>
    <div>
        <child :data="data" :obj="obj"/>
        <h1>data: {{data}}</h1>
        <h1>objData: {{obj.data}}</h1>
    </div>
</template>

<script>
import child from './child'
export default {
    data(){
        return {
            data: '',
            obj: {
                data: ''
            }
        }
    },
    components: { child }
}
</script>

子组件

<template>
    <div>
        <button @click="change">click to change prop data</button>
        <button @click="changeObjData">click to chnage prop objData</button>
    </div>
</template>
<script>
export default {
    props: ['data', 'obj'],
    methods: {
        change(){
            this.data = Math.random()
        },
        changeObjData(){
            this.obj.data = Math.random()
        }
    }
}
</script>

两个按钮,一个是改变值类型的prop,一个是改变引用类型的prop,你会发现,第一个按钮按了会报错,值不会被改变,但是按了第二个,值改变了,并且没有报错,那是因为你父组件传递过去的只是一个引用,说白了就是传了一个内存地址(指针)过去,子组件改变上面的值,并没有改变指针,所以系统认为他没有引起父组件的值改变,于是就没有报错提示了。


···回复:

如果props传入的值是引用类型,在子组件中改变其元素,不改变引用,那么不报错。
如果是普通类型,那么在修改时浏览器控制台会有报错信息

发表评论

电子邮件地址不会被公开。 必填项已用*标注

Scroll Up