使用 Vuejs 嵌套 v-for 循环

Posted

技术标签:

【中文标题】使用 Vuejs 嵌套 v-for 循环【英文标题】:Nested v-for loop with Vuejs 【发布时间】:2020-04-04 12:37:22 【问题描述】:

我在 Vuejs 中需要一个嵌套的 v-for 循环,但对如何做、如何组织我的数据和 v-for 循环有疑问。

这是数据。我希望能够遍历修饰符,而无需精确调用修饰符1、修饰符2。

想法是第一个 v-for 循环遍历修饰符对象,嵌套的 v-for 循环将遍历内部的不同块。像这样,我有一个自动嵌套的 v-for 循环。

modifiers1: 
  block1: 
    class: 'doc_button--green',
    description: 'Primary Button'
  ,
  block2: 
    class: 'doc_button--orange',
    description: 'Secondary Button'
  ,
  block3: 
    class: 'doc_button--red',
    description: 'Tertiary Button'
  
,
modifiers2: 
  block1: 
    class: 'doc_button--small',
    description: 'Small Button'
  ,
  block2: 
    class: 'doc_button--big',
    description: 'Big Button'
  

我想到的一个简单的循环例子是:

<div v-for="(modifier) in modifiers" :key="modifier">
 <ul v-for="(block) in blocks" :key="block">
   <li></li>
 </ul>
</div>

有没有可能,如果有,怎么做? 我需要将我的数据组织成一个嵌套数组吗? 谢谢

【问题讨论】:

首先,您需要名为 modifiersblocks 的数据 什么是修饰符和方块? @JaromandaX 这是一个例子。我尝试了不同的东西,但没有奏效。这是我正在考虑的嵌套循环。但不知道如何组织我的数据来获得这个。 嗯,循环是错误的,因为blocksmodifiers 没有关系 【参考方案1】:

您还可以将 Object 转换为一个修饰符数组,每个修饰符都有一个嵌套的块数组:

const data = 
  modifiers1: 
    block1: 
      class: 'doc_button--green',
      description: 'Primary Button'
    ,
    block2: 
      class: 'doc_button--orange',
      description: 'Secondary Button'
    ,
    block3: 
      class: 'doc_button--red',
      description: 'Tertiary Button'
    
  ,
  modifiers2: 
    block1: 
      class: 'doc_button--small',
      description: 'Small Button'
    ,
    block2: 
      class: 'doc_button--big',
      description: 'Big Button'
    
  

const modifiers = Object.keys(data).map(modifierName => (
  name: modifierName,
  blocks: Object.keys(data[modifierName]).map(blockName => (
    ...data[modifierName][blockName],
    name: blockName
  ))
));


console.log(modifiers);

然后你可以像这样循环嵌套数组:

<div v-for="(modifier) in modifiers" :key="modifier.name">
 <ul v-for="(block) in modifier.blocks" :key="block.name">
   <li></li>
 </ul>
</div>

【讨论】:

【参考方案2】:

一种方法是创建一个计算属性来自引用 $data...

computed:
    myData() 
        return this.$data
    
,

然后在模板中...

<div v-for="(modifier) in myData" :key="modifier">
    <ul v-for="(block,k) in modifier" :key="k">
        <li> block.description </li>
    </ul>
</div>

Demo

【讨论】:

【参考方案3】:

假设您的数据结构存储在变量modifiers 中,您只需调整第二个v-for 以从第一个v-for 循环遍历modifier 变量。

实际上你的代码会变成这样(扩展以突出使用循环中数据的更多方法):

let modifiers = 
  modifier1: 
    block1: 
      class: 'doc_button--green',
      description: 'Primary Button'
    ,
    block2: 
      class: 'doc_button--orange',
      description: 'Secondary Button'
    ,
    block3: 
      class: 'doc_button--red',
      description: 'Tertiary Button'
    
  ,
  modifier2: 
    block1: 
      class: 'doc_button--small',
      description: 'Small Button'
    ,
    block2: 
      class: 'doc_button--big',
      description: 'Big Button'
    
  

<div v-for="(blocks, modifier) in modifiers" :key="modifier">
  <ul v-for="(block, name) in blocks" :key="name">
    <li v-for="(value, key) in block" :key="key">key: value</li>
  </ul>
</div>

【讨论】:

以上是关于使用 Vuejs 嵌套 v-for 循环的主要内容,如果未能解决你的问题,请参考以下文章

使用 Vuejs 嵌套 v-for

如何使用vue js循环嵌套的json响应

在嵌套对象上使用 for 循环

Vue.js v-for中能不能嵌套使用v-if

Vue.js v-for中能不能嵌套使用v-if

Vue.js v-for中能不能嵌套使用v-if