vue.js - 如何为列表中的项目设置自定义模板,而不是在“v-for”循环中使用它?
问题描述
我想要实现的是:
<li v-for="(item, index) in items" :key="index>
<div v-if="item.Component">
<item.Component :value="item.value" />
</div>
<div v-else>{{ item.value }}</div>
</li>
但无论如何,我根本不喜欢这个解决方案。为项目列表中的项目定义Component
键的想法很难维护,因为至少很难以模板样式的方式编写它(通常我们在里面谈论太长的 HTML)。我也不喜欢包裹item.Component
在里面div
。
data() {
return {
list: [{
value: 'abc',
Component: {
props: ['value'],
template: `123 {{ value }} 312`
}
}]
};
}
有谁知道这方面的最佳实践解决方案以及 Vue 在他们的文档中描述这种情况的地方?
解决方案
您可以使用 Vue 的<component/>
标签在列表中动态设置组件。
<li v-for="(item, index) in items" :key="index>
<component v-if="item.Component" :is="item.Component" :value="item.value"></component>
<div v-else>{{ item.value }}</div>
</li>
<script>
...,
data: () => ({
list: [{
value: 'abc',
Component: {
props: ['value'],
template: `<div>123 {{ value }} 312</div>` // must be enclosed in a element.
}
}]
})
</script>
你也可以导入一个组件,这样你就可以创建一个新文件并将你的模板和脚本放在那里。
父.vue
<script>
import SomeComponent from "@/components/SomeComponent.vue"; //import your component here.
export default {
data() {
return {
list: [
{
value: "abc",
Component: SomeComponent // define your imported component here.
},
]
};
}
};
</script>
SomeComponent.vue
<template>
<div>123 {{ value }} 312</div>
</template>
<script>
export default {
name: "SomeComponent",
props: ["value"]
};
</script>
这是一个演示。
推荐阅读
- java - 如何指定要由 Java Sax Parser 解析的 XML 文件的一部分?
- elasticsearch - Elasticsearch:固定数据和预搜索所有字符串组合?
- javascript - Cordova Native Storage Plugin 在应用程序 iOS 中未定义
- php - 如何在没有迁移的情况下使用 Phinx?
- c++ - 带有模板参数的 Lambda 函数,而不是函数参数
- python - Python混淆矩阵中的模型精度为0%
- r - 如何为闪亮列表中的单个列表元素渲染数据表或渲染表
- excel - 计数返回 0 的 Sumproduct
- mysql - 没有使用 spring boot 和 jpa 在多方关系中添加实体
- swift - 为什么 UITextView 滚动在 tvOS 上不起作用?