Vues.js组件中的DRY初始化

时间:2017-03-31 07:10:57

标签: javascript vue.js

初始化组件时,我运行数据回调,如:

data(){
    return {
        name: myNameGetter(),
        age: myAgeGetter(),
        // etc...
    }
},

然后警告一些父组件关于此组件的逻辑:

created(){
    this.$emit('personFullName', this.getFullName());
},

然后我的观察者也有同样的逻辑:

watch: {
    person: function(){
        this.name = myNameGetter();
        this.age = myAgeGetter();
        this.$emit('personFullName', this.getFullName());
    }
}

有没有办法干这个?

我想出的唯一想法是:

watch: {
    person: function(){
        const data = this.data();
        for (let key in data) this[key] = data[key];
        this.$emit('personFullName', this.getFullName());
    }
}

但感觉还有点不爽。社区如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

  

所以这是一个例子,真实生活应用程序是一个日历。在容器中我有日历标题。然后我有月,星期和日视图的子组件。容器中的标题由子组件设置。因此,如果它的月份视图,孩子将发出" 2017年3月和#34;,如果是日视图,则其他子组件将发出" 3月31日"。等等。问题是我必须在组件初始化时调用数据中的getter函数,也可以在监视时调用,并在创建时将其发送到父级。这就是我想干的原因。

之前我在Vue中创建了一个日期/时间选择器,它类似于您的Calendar组件,因为有一个容器组件(DateTimePicker),它有2个子组件(DatePicker和TimePicker)。根据是否正在编辑日期或时间,一次只能看到一个子组件。

我认为重组组件共享数据的方式会更好。听起来像儿童组件紧密耦合到日历组件(这很好)。我不确定您的日历组件是用于用户输入(用户可以选择日期吗?),还是仅显示特定日期。

为什么子组件有责任确定标题?每个子组件共享相同的日期,因此日历组件可以根据可见的子组件轻松确定标题,如:

<div class="calendar">
  <div class="cal-title">{{ title }}</div>
  <day v-if="view === 'day'" :value="date" @input="onInput"></day>
  <week v-if="view === 'week'" :value="date" @input="onInput"></week>
  <month v-if="view === 'month'" :value="date" @input="onInput"></month>
</div>
{
  props: ['date'],

  data() {
    return {
      view: 'day',
      // This component has no internal state for the date
    };
  },

  computed: {
    title() {
      switch (this.view) {
        case 'day': return this.date.format('day'); break;
        case 'week': return this.date.format('week'); break;
        case 'month': return this.date.format('month'); break;
      }
    },
  },

  methods: {
    onInput(date) {
      this.$emit('input', date);
    },
  },
}