vue中直接修改props中的值并未给出警告,为啥

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

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

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

阅读 17.7k
4 个回答

?栗子来了,请查收

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

接着往下看

在两种情况下,我们很容易忍不住想去修改 prop 中数据:

Prop 作为初始值传入后,子组件想把它当作局部数据来用;

Prop 作为原始数据传入,由子组件处理成其它数据输出。

对这两种情况,正确的应对方式是:

定义一个局部变量,并用 prop 的值初始化它:

props: ['initialCounter'],
data: function () {
  return { counter: this.initialCounter }
}
定义一个计算属性,处理 prop 的值并返回:

props: ['size'],
computed: {
  normalizedSize: function () {
    return this.size.trim().toLowerCase()
  }
}

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

单向数据浏览不允许你做修改操作,如果可以修改,每个组件都能对数据进行操作,这样无法有效的追踪数据的变化

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏