You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
defineReactive(props,key,value,()=>{if(!isRoot&&!isUpdatingChildComponent){warn(`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: "${key}"`,vm)}})
首先,第一个问题,不能修改父组件传进来的属性props,主要是为了做到保障单向数据流。
假设在这里我们可以随意修改的话,如果在父组件中这一状态值传递给了多个子组件,其中任意一个子组件的修改都会影响其他子组件的状态,而这样会造成我们的组件关系混乱,数据流向不可控,子组件的状态也不可预测。
所以,vue在内部如果监听到有子组件想要修改父组件传过来的值的时候,便会发出警告。不建议这样操作。
第二个问题,vue内部又是怎样做到监听修改,给出警告的呢?
在vue的源码中可以找到, /src/core/instance/state.js中,初始化props的时候,在开发环境的时候,是这样定义props的每一项值的,
如上所示,defineReactive接收的第四个值是一个默认的setter,
如果在开发环境的时候,会调用这个setter,给出warning。
The text was updated successfully, but these errors were encountered: