Vueでは、サブコンポーネントが親コンポーネントから渡されたPropを変更できないのはなぜですか.変更した場合、Vueはプロパティの変更をどのように監視し、警告を与えますか.
5085 ワード
if (process.env.NODE_ENV !== 'production') {
var hyphenatedKey = hyphenate(key);
if (isReservedAttribute(hyphenatedKey) ||
config.isReservedAttr(hyphenatedKey)) {
warn(
("\"" + hyphenatedKey + "\" is a reserved attribute and cannot be used as component prop."),
vm
);
}
defineReactive$$1(props, key, value, function () {
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
);
}
});
}
InitPropsではdefineReactiveで開発環境にいるか否かを判断し、開発環境であればsetをトリガしたときにこのkeyがupdatingChildrenで修正されているか否かを判断し、そうでなければこの修正がサブコンポーネントから来ていることを説明し、warning提示をトリガする.
特に、サブコンポーネントから変更したpropがベースタイプに属している場合、プロンプトがトリガーされます.この場合、親コンポーネントのデータソースを変更することはできません.ベース・タイプが値コピーされているためです.このkeyに直接別の非ベースタイプ(Object,array)を割り当てると、objectのプロパティを変更するとプロンプトはトリガーされず、親コンポーネントのデータソースのデータは変更されます.