在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/HTML/ vue遞歸時(shí)如何正確更改數(shù)據(jù)

vue遞歸時(shí)如何正確更改數(shù)據(jù)

嘗試過的方式一:

遞歸組件的父組件中:

<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);
  }

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

更新:

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

<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"就是一大坑,刪除它就完全正常了。這是為什么呢?

回答
編輯回答
晚風(fēng)眠

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

2017年10月20日 08:21