鍍金池/ 問答/人工智能  HTML/ 為什么使用組件內部 data 的數(shù)據(jù)可以 v-for 雙層嵌套,而用來自父組件的

為什么使用組件內部 data 的數(shù)據(jù)可以 v-for 雙層嵌套,而用來自父組件的 props 里數(shù)據(jù)就不行?

發(fā)現(xiàn) v-for 嵌套 v-for 使用時,如果用的數(shù)據(jù)是自己組件內部 data 里的,就沒有問題;
但是如果用來自父組件傳遞的 props 的數(shù)據(jù), 就會在第二層 v-for 出問題,會渲染不出來。

想知道原因?

父組件代碼

<template>
  <div id="parent">
    <test-v-for :specProps="specAttrs"></test-v-for>
  </div>
</template>

<script>
  import TestVFor from './TestVFor.vue'
  export default {
    name: 'parent',
    components: {TestVFor},
    data () {
      return {
        specAttrs: [
          {name: '尺碼', list: [46, 47, 48, 49, 50]},
          {name: '顏色', list: ['湖藍色']}
        ]
      }
    }
  }
</script>

<style></style>

子組件代碼

<template>
  <div id="child">
    // 使用自己組件內部的 data
    <h1>v-for by own data</h1>
    <dl v-for="item in specs">
      <dt class="fs24 l">{{item.name}}</dt>
      <dd>
        <a href="javascript:;" v-for="(val, index) in item.list">
          <span>{{ val }}</span>
        </a>
      </dd>
    </dl>
    <hr>
    // 使用自己來自父組件傳遞的 data
    <h1>v-for by props data</h1>
    <dl v-for="item in specProps">
      <dt class="fs24 l">{{item.name}}</dt>
      <dd>
        <a href="javascript:;" v-for="(val, index) in item.list">
          <span>{{ val }}</span>
        </a>
      </dd>
    </dl>
  </div>
</template>

<script>
  export default {
    data () {
      return {
        specs: [
          {name: '尺碼', list: [46, 47, 48, 49, 50]},
          {name: '顏色', list: ['湖藍色']}
        ]
      }
    },
    props: {
      specProps: Array
    }
  }
</script>
<style></style>

渲染效果如下
頁面效果

回答
編輯回答
萢萢糖

我完全復制粘貼了你的代碼。。并沒有發(fā)生你所截圖的情況。

clipboard.png

另外 你這注釋的方式。。在template里不是應該遵循h(huán)tml的注釋方式么。你看我這圖里你的注釋都被當成text輸出了。所以你這構建環(huán)境具體怎么樣的和vue版本、package乃至開發(fā)工具都最好貼出來給大家參詳 避免玄學問題。。

2017年4月23日 14:23
編輯回答
萌二代

自己挖的坑自己來填。我后來單獨寫了一個可運行的 github demo,地址為:https://github.com/Emma1075/v...

運行后發(fā)現(xiàn)確實沒有這個問題。

后來反復排查原因,是我在項目中父組件里的數(shù)據(jù)處理出了問題。第二層嵌套的 list 應該是一個數(shù)組,我父組件處理list元素重復值時用了 new Set() 來去重,去重后忘記了把 Set 格式轉換回 Array。

所以導致在我自己項目里第二層list v-for 渲染不出來。

解決方法:list: [...new Set(tempArr)]

2018年2月11日 06:33