【问题标题】:Vue.js Two-Way sync Data Binding using vue-property-decorator使用 vue-property-decorator 的 Vue.js 双向同步数据绑定
【发布时间】:2018-05-01 02:24:07
【问题描述】:

我正在使用带有 TypeScript 和 vue-property-decorator 的 Vue.js。我想在父组件和子组件之间执行一些双向数据绑定。这是我想要做的一个简单的想法:

父组件

<template>
  <progress :is-loaded.sync="isLoaded"/>
</template>

@Component
export default class ParentComponent extends Vue {
  get isLoaded() { return Store.getters["isLoaded"]; }
  set isLoaded(value: boolean) { Store.commit("isLoaded", value); }
}

子组件

<template>
 <progress :value="_value" min="0" max="100"></progress>
 {{_isLoaded}}
</template>

@Component
export default class ChildComponent extends Vue {
  @Prop()
  public isLoaded: boolean;

  public _isLoaded: boolean;
  public _value: number;

  public mounted() {
    this._isLoaded = this.isLoaded;
    this._value = this.value;
  }

  @Watch("isLoaded")
  public onIsLoadedChanged() {
    if (!isLoaded) {
      // Animate _value from 0 to 100.
      this._isLoaded = true;
      this.$emit("update:isLoaded", this._isLoaded);
    }
  }
}

我真的必须使用两个字段isLoaded_isLoaded 以及使用this.$emitupdate:isLoaded 的魔术字符串吗?所有这些语法似乎都很冗长,有没有更简单的方法?有什么方法可以封装其中的一些吗?

【问题讨论】:

    标签: typescript vue.js vuejs2 vue-component two-way-binding


    【解决方案1】:

    isLoaded 的值在您的应用程序中的哪一点发生变化?如果它仅在父级中发生更改,则不需要发出备份事件,并且可以只使用不带 @Watch 和不带 _isLoaded 变量的道具。 如果 isLoaded 在孩子中发生变化,则不需要道具和重复变量。您可以只发出一个loaded 事件并在父级中侦听该事件。

    这是一个简化的例子,当父级更改时子级的样式会发生变化isLoaded

    父母

    <template>
      <progress :is-loaded="isLoaded"/>
    </template>
    
    @Component
    export default class ParentComponent extends Vue {
      public isLoaded: boolean = false
      created(){
        setInterval(()=>this.updateStatus(), 500)
      }
      this.updateStatus(){
        this.isLoaded = true
      }
    }
    

    孩子

    <template>
     <div :class="{ full: isLoaded }">Loaded is {{ isLoaded }}</div>
    </template>
    
    @Component
    export default class ChildComponent extends Vue {
      @Prop()
      isLoaded: boolean;
    }
    
    <css>
       .full {width:100%}
    </css>
    

    【讨论】:

    • 它可以在父母和孩子中改变。父母可以随时更改它,但孩子会运行一些动画,然后将其设置为false
    • 在那种情况下,我认为你做对了 :) 但是你可能会考虑在多个组件中进行状态更改是否是一种好的架构。为什么进度条能够改变加载状态?它应该只显示状态...
    • 我正在尝试对处于中间状态的进度条进行建模,即当 isLoaded 在父级中设置为 false 时,它​​会将另一个 value 属性从 0 设置为 100,但从未达到 100。最终,isLoaded 在父级中设置为 true,value 属性设置为 100。或者,父级可以更改 value。我很想知道我是否想错了。
    • 刚刚更新了例子,看来我必须使用mounted而不是this._isLoaded = this.isLoaded
    • 理想情况下,您应该尝试将state 仅保留在一个组件中。 child 的功能应该是显示 parent 的状态,仅此而已。 (至少在理想世界中)。为什么你想让你的进度条自己做决定:)
    猜你喜欢
    • 2018-09-14
    • 2019-05-19
    • 2019-01-29
    • 2020-12-27
    • 1970-01-01
    • 1970-01-01
    • 2020-06-11
    • 2020-10-28
    • 1970-01-01
    相关资源
    最近更新 更多