鍍金池/ 問答/HTML/ vue遞歸時如何正確更改數據

vue遞歸時如何正確更改數據

嘗試過的方式一:

遞歸組件的父組件中:

<plan-preview :sectionList="sectionList"></plan-preview>

遞歸組件中:

<plan-section-list v-if="section.children" :sectionList="section.children"></plan-section-list>
  name: 'planSectionList',
  props: {
    sectionList: Array
  },
  mounted() {
    _.forEach(this.sectionList, async section => {
      const res = await this.$api.plan.getSectionDetails(section.id);
      this.$set(section, 'details', res.data.data);
    });
  }

嘗試過的方式二:

遞歸組件的父組件中:

<plan-preview :sectionList.sync="sectionList"></plan-preview>

遞歸組件中:

<plan-section-list v-if="section.children" :sectionList.sync="section.children"></plan-section-list>
  name: 'planSectionList',
  props: {
    sectionList: Array
  },
  mounted() {
    _.forEach(this.sectionList, async section => {
      const res = await this.$api.plan.getSectionDetails(section.id);
      this.$set(section, 'details', res.data.data);
    });
    this.$emit('update:sectionList', this.sectionList);
  }

這兩種方式都使數據更新了,但是視圖并沒有得到更新,為什么?

更新:

突然發(fā)現造成視圖不更新的因素了。以下為遞歸組件代碼:

<template>
  <ul class="plan-preview__section-list">
    <li v-for="section in sectionList" :key="section.id">
      <div class="plan-preview__section" @click="section.show = !section.show">
        <h4 class="plan-preview-section__title">{{section.title}}</h4>
        <div v-show="section.show" class="plan-preview-section__body">
          <p class="plan-preview-section__content">{{section.content}}</p>
          <p>測試:{{section.details}}</p>
        </div>
      </div>
      <plan-section-list v-if="section.children" :sectionList.sync="section.children"></plan-section-list>
    </li>
  </ul>
</template>

其中,section.details用來測試視圖是否更新。其父元素v-show="section.show"就是一大坑,刪除它就完全正常了。這是為什么呢?

回答
編輯回答
晚風眠

搞了個大烏龍。遞歸組件的父組件中sectionList也是異步獲取的,未等到sectionList數據獲取完畢,遞歸組件已經mounted了,此時遞歸組件獲取到一個長度為零的sectionList,并沒有發(fā)起獲取details的請求,就更沒有details的數據了。然后其實并不關v-show的事,只是粗心,父組件獲取的到的sectionList數據是一個嵌套的樹形數據,我在父組件遍歷了一遍只給第一層數據設置了show屬性,更深層次的結構沒有show屬性而導致v-show的判斷并不生效(深層的details數據已經獲取到)但一直不會顯示出來,看到第一層沒有數據誤以為深層也是沒有數據。

2017年10月20日 08:21