如何将 Vue 组件从列表渲染中拆分出来?

Posted

技术标签:

【中文标题】如何将 Vue 组件从列表渲染中拆分出来?【英文标题】:How to split Vue components out of a list-rendering? 【发布时间】:2019-07-10 02:29:39 【问题描述】:

我喜欢 Vue,并且经常使用它在选择框中列出选项(或者有时在弹性框中列出 div)。我想知道是否有办法在 Vue 列表渲染期间将一块从 for 循环中拆分出来。像这样的场景:

我有 3 个选择:

选项 1 - 蓝色 选项 2 - 绿色 选项 3 - 紫色

我想在选择框和选择框下方的 div 中呈现这些,具体取决于选择的选项,不同的 div(在本例中使用所选选项的颜色)。

有没有办法在 Vue-list 渲染中做到这一点?

类似

<select>
    <option v-for="color in colors">color.color</option>
</select>

<div>color.color</div> <--This doesn't work, as it is out of the for loop

我能够解决这个问题的唯一方法是制作一个对象来容纳所有这些东西和一个像这样的“活动元素”:

class ColorHolder
    constructor()
        colors = []
        activeColor = ;
    

然后,我将侦听器放在&lt;option&gt; 框中的每种颜色上,将活动颜色设置为点击的任何颜色。然后我有一个隐藏组件,当他们单击选项列表中的颜色时会显示该组件。

它有效,但似乎必须有更好的方法,因为我必须手动确定单击了哪种颜色并显示正确类型的 &lt;color-div&gt;。我只想使用 Vue 列表渲染来渲染列表之外的组件,使其与列表中的组件保持链接。

【问题讨论】:

【参考方案1】:

您可以通过在 select 元素上使用 v-model 来选择所选选项的值并将其插入到您的 div 中来简化事情。

new Vue(
  el: "#app",
  data: 
    colors: [
    color: 'Red',
    color: 'Green',
    color: 'Blue'
    ],
    selectedColor: 'Red'
  
)
<script src="https://cdn.jsdelivr.net/npm/vue@2.6.6/dist/vue.js"></script>

<div id="app">
  <select v-model="selectedColor">
    <option v-for="color in colors" :value="color.color"> color.color </option>
  </select>
  <div :style="background: selectedColor"> selectedColor </div>
</div>

【讨论】:

【参考方案2】:

支持@husam 的回答

我建议不要使用 selectedColor 值。你应该使用索引(数组)或键(对象),这样你就不会重复数据(在更大的应用程序中)

new Vue(
  el: "#app",
  data: 
    colors: [
    color: 'Red',
    color: 'Green',
    color: 'Blue'
    ],
    colIndex: 0
  
)
<script src="https://cdn.jsdelivr.net/npm/vue@2.6.6/dist/vue.min.js"></script>

<div id="app">
  <select v-model="colIndex">
    <option v-for="color, i in colors" :value="i"> color.color </option>
  </select>
  <div> colors[colIndex].color </div>
</div>

你也可以使用计算值

new Vue(
  el: "#app",
  data: 
    colors: [
    color: 'Red',
    color: 'Green',
    color: 'Blue'
    ],
    colIndex: null
  ,
  computed: 
    selectedColor() 
      return this.colors[this.colIndex] || ;
    
  
)
<script src="https://cdn.jsdelivr.net/npm/vue@2.6.6/dist/vue.min.js"></script>

<div id="app">
  <select v-model="colIndex">
    <option v-for="color, i in colors" :value="i"> color.color </option>
  </select>
  <div> selectedColor.color </div>
</div>

【讨论】:

这是一个不错的解决方案,至少对于选择框。如果不是&lt;option&gt; 元素,而是循环呈现&lt;divs&gt; 怎么办?有没有办法模仿 div 上的v-model

以上是关于如何将 Vue 组件从列表渲染中拆分出来?的主要内容,如果未能解决你的问题,请参考以下文章

如何进行无限滚动,在Vue js中动态渲染列表(仅可见)

如何在vue js中从组件渲染组件

什么时候将一个Vue组件拆分成多个组件(子组件)

变量更改时如何重新渲染 vue.js 组件

Vue.js 3.0 组件是如何渲染为 DOM 的?

Vue 2:如何从渲染函数渲染单个文件组件?