Vueでは、サブコンポーネントが親コンポーネントから渡されたPropを変更できないのはなぜですか.変更した場合、Vueはプロパティの変更をどのように監視し、警告を与えますか.

5085 ワード

  • サブコンポーネントはなぜ親コンポーネントが伝達するProp一方向データストリームを修正できないのか、データの流れを監視しやすく、エラーが発生した場合、エラーが発生した位置により迅速に位置決めできる.変更された場合、Vueはどのように属性の変更を監視し、警告を与えますか.
  • 修正された場合、Vueはどのように属性の修正を監視し、警告を与えるか.
  • 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のプロパティを変更するとプロンプトはトリガーされず、親コンポーネントのデータソースのデータは変更されます.