【问题标题】:Vue: Make sure the component cannot modify props (even if it is a reference object)?Vue:确保组件不能修改 props(即使是引用对象)?
【发布时间】:2020-09-08 21:09:00
【问题描述】:

我知道vue模型是props的单向数据流。

但是,当 prop 为引用对象时,组件可以直接修改其属性。这是错误的,但vue不会检查它。

希望有一种机制保证组件不能修改props(即使是引用对象),而不是被开发者检查。

例如,我有一个组件

<template>
  <input v-model="obj.text" />
</template>

<script>
export default {
  props: ['obj']
};
</script>

以及使用它的页面

<template>
  <my-template :obj="myobj"></my-template>
</template>

<script>
export default {
  data() {
    myobj: {
      text: "hello";
    }
  }
};
</script>

当 'input' 中的数据发生变化时,myobj.text 会一起变化。这违反了单向数据流。

当然,如答案所示,我可以使用“computed”的“get”和“set”方法。

但我必须注意不要将 'obj.someProperty' 写入任何 'v-model',但这需要我自己注意。

我希望有一个机制在我犯错时给出提示。

【问题讨论】:

    标签: vue.js


    【解决方案1】:

    找不到现有的副本,所以这里有一个答案。如果有人能找到,请告诉我,我会将其设为社区 wiki


    使用带有 gettersetter 的计算属性来表示您的 v-model 值。

    getter 从 prop 中获取值,setter 将新值发送给父级。

    例如

    <input v-model="computedProp">
    
    props: ['referenceObject'],
    computed: {
      computedProp: {
        get () {
          return this.referenceObject.someProperty
        },
        set (val) {
          this.$emit('updated', val)
        }
      }
    }
    

    在父级中

    <SomeComponent :reference-object="refObject" @updated="updateRefObject">
    
    data: () => ({ refObject: { someProperty: 'initial value' } }),
    methods: {
      updateRefObject (newVal) {
        this.refObject.someProperty = newVal
      }
    }
    

    【讨论】:

    • 感谢您的回答,但这不是我想要的。我想要一种方法来确保作为道具传入的“referenceObject”(及其“属性”)在组件中不可修改。而不是创建计算属性。如果我不小心将referenceObject.someProperty 用作组件中的“v-model”,我可以对其进行修改。当然,我可以构造一个计算属性(比如你的例子中的计算属性),但这需要我自己注意。在 v-model 中写“calculatedProp”而不是“referenceObject”。我希望有一个机制在我犯错时给出提示。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-16
    • 2017-11-08
    • 2013-06-12
    • 1970-01-01
    • 2019-07-16
    • 2021-04-30
    • 2012-01-29
    相关资源
    最近更新 更多