【问题标题】:Vue propsData not updating dynamicallyVue propsData 没有动态更新
【发布时间】:2018-07-17 15:30:24
【问题描述】:

我已经为这个问题苦苦挣扎了好几个小时: 我在父组件中动态实例化了一个子 vue 组件,并传入 propsData 一些父组件的数据。当父级更新时,动态创建的子级属性似乎没有更新。

请查看我创建的example 以便更好地理解(来自 chinchang 的示例)

如您所见,我正在动态和静态地实例化 Button 组件。按钮的颜色取决于 type 属性。我将父级的数据(类型属性)作为道具传递给动态和静态创建的实例。当您插入一个新按钮时,通过单击“单击以插入”按钮,将使用父级的当前类型创建一个新按钮。在点击事件之后,我切换了父类的 type 属性。正如您所见,静态创建的按钮实例(在页面顶部)改变了颜色,但动态实例化的按钮实例保持不变。

您能指出我的错误并帮助找到解决方案吗?

谢谢, 阿贝尔

【问题讨论】:

  • 我得到一排交替颜色的按钮。您是否希望每次插入新的时它们都会改变颜色?
  • 是的,我愿意,根据父级中定义的类型属性,它们都应该是相同的类型,所以它们应该在每次点击时都切换颜色。就像静态实例化的 Hello 按钮一样。

标签: javascript vue.js vuejs2


【解决方案1】:

来自the docs

在创建过程中将 props 传递给实例。这主要是 旨在使单元测试更容易。

设置propsData 不会创建父子关系。它只是向组件提供(非反应性)数据。简而言之,您选择了一种不太 Vue 的方法。你不应该关心创建组件,你应该在视图模型中有数据项,然后 Vue 会为其创建组件。

  export default {
    name: 'app',
    components: { Button },
    data(){
      return {
        type: 'secondary',
        buttons: []
      };
    },
    methods: {
      onClick() {
        this.buttons.push(true);
        if(this.type === 'primary'){
          this.type = 'secondary';
        } else {
          this.type = 'primary';
        }
      }
    }
  }

  <div ref="container">
    <button @click="onClick">Click to insert</button>
    <Button v-for="b in buttons" :type="type">Click me!</Button>
  </div>

Fixed demo

【讨论】:

  • 感谢您的回答,所以它不会以这种方式工作。我的示例没有显示我正在努力解决的现实用例,只是为了表明 propsData 不是反应性的。在我的项目中,我想将自定义标签/徽章添加到不同的(动态)Vue 组件。为了实现这一点,我创建了一个 mixin,它根据与之混合的组件的属性实例化一个 LabelComponent,并将标签元素附加到组件 $el 上。这样我就不必在需要的每个组件中都包含和连接一个 ,我只需要使用 mixin 是否有更好的方法?
  • 这值得提出一个新问题。一个好的答案需要详细说明您希望事情如何运作。
猜你喜欢
  • 2020-04-09
  • 2015-07-26
  • 1970-01-01
  • 1970-01-01
  • 2021-05-09
  • 2016-01-12
  • 2018-01-05
  • 1970-01-01
  • 2017-07-04
相关资源
最近更新 更多