【发布时间】:2019-04-23 21:12:24
【问题描述】:
我已经制作了一个全局组件,它将呈现我们想要的内容。
这个组件很简单
<template>
<section
id="help"
class="collapse"
>
<div class="container-fluid">
<slot />
</div>
</section>
</template>
<script>
export default {
name: 'VHelp',
};
</script>
我在我的基本模板中使用它
<v-help />
我正在尝试使用从另一个单个文件组件向此组件槽添加内容。
<v-help>
<p>esgssthsrthsrt</p>
</v-help>
但这在逻辑上创建了我的 comp 的另一个实例,其中包含 p 标记。这不是我想做的正确事情。
所以我尝试使用虚拟 DOM 和渲染功能,将 slot 替换为 <v-elements-generator :elements="$store.state.help.helpElements" /> 在我的 VHelp 组合中。
helpElements 商店是一个包含对象的简单数组。
{
type: 'a',
config: {
class: 'btn btn-default',
},
nestedElements: [
{
type: 'span',
value: 'example',
},
{
type: 'i',
},
],
},
然后在我的VElementsGenerator comp 中,我有一个渲染函数,该函数在虚拟 DOM 中使用类似对象的渲染元素
<script>
import {
cloneDeep,
isEmpty,
} from 'lodash';
export default {
name: 'VElementsGenerator',
props: {
elements: {
type: Array,
required: true,
},
},
methods: {
iterateThroughObject(object, createElement, isNestedElement = false) {
const generatedElement = [];
for (const entry of object) {
const nestedElements = [];
let elementConfig = {};
if (typeof entry.config !== 'undefined') {
elementConfig = cloneDeep(entry.config);
}
if (entry.nestedElements) {
nestedElements.push(this.iterateThroughObject(entry.nestedElements, createElement, true));
}
generatedElement.push(createElement(
entry.type,
isEmpty(elementConfig) ? entry.value : elementConfig,
nestedElements
));
if (typeof entry.parentValue !== 'undefined') {
generatedElement.push(entry.parentValue);
}
}
if (isNestedElement) {
return generatedElement.length === 1 ? generatedElement[0] : generatedElement;
}
return createElement('div', generatedElement);
},
},
render(createElement) {
if (this.elements) {
return this.iterateThroughObject(this.elements, createElement);
}
return false;
},
};
</script>
第二种方法效果很好,但是如果我想渲染复杂的数据,渲染函数内部使用的对象非常长并且读取起来很复杂。
所以我试图找到另一种方法来将内容添加到基础布局中使用的全局组件,仅当我希望在子组件上使用它时。
我不能在子组件中直接使用这个VHelp 组件,因为 HTML 页面架构会完全错误。
我想知道是否可以将内容(最好是 HTML)从单个文件 comp 添加到组件槽,而无需重新创建组件的新实例?
此外,我认为将 HTML 保存为 Vuex 商店中的字符串非常难看。所以我什至不知道这是否可行,以及我是否需要完全改变我尝试这样做的方式。
有什么想法吗?
【问题讨论】:
标签: javascript vue.js vuejs2 vue-component