- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我制作了一个全局组件来呈现我们想要的内容。
这个组件很简单
<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>
但这在逻辑上创建了我的组件的另一个实例,其中包含 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 存储中的字符串非常丑陋。所以我什至不知道这是否可能,以及我是否需要完全改变我尝试这样做的方式。
有什么想法吗?
最佳答案
在商店中,您应该只存储数据而不是 HTML 结构。解决这个问题的方法是将 v-help 组件内容的当前状态存储在商店中。然后,您将有一个 v-help
带有插槽的组件(就像您已经提出的那样)。您应该根据商店中的状态传递不同的内容。这是一个抽象的例子:
<v-help>
<content-one v-if="$store.state.content === 'CONTENT_ONE' />
<content-two v-else-if="$store.state.content === 'CONTENT_TWO' />
<content-fallback v-else />
</v-help>
其他地方的子元素:
<div>
<button @click="$store.commit('setContentToOne')">Content 1</button>
</div>
Vuex 商店:
state: {
content: null
},
mutations: {
setContentToOne(state) {
state.content = 'CONTENT_ONE';
}
}
当然,这取决于您的要求,特别是取决于使用了多少种不同的场景,如果这是实现这一目标的最佳方式。如果我没理解错的话,您就是在将帮助元素保存到商店中。您还可以在其中保存一组当前选定的帮助元素,并直接在 v-help
中显示它们。组件。
编辑:
当然你也可以只在store中保存静态组件(或者它的名字)。然后,您可以在子组件中动态决定哪些内容显示在v-help
中。 .这是一个例子:
<v-help>
<component :is="$store.state.helpComponent" v-if="$store.state.helpComponent !== null" />
</v-help>
测试组件:
<template>
test component
</template>
<script>
export default {
name: 'test-component'
};
</script>
其他地方的子元素(变体 1,将名称存储在 Vuex 中):
<div>
<button @click="$store.commit('setHelpComponent', 'test-component')">Set v-help component to 'test-component'</button>
</div>
其他地方的子元素(变体 2,将整个组件存储在 Vuex 中):
<template>
<button @click="$store.commit('setHelpComponent', testComponent)">Set v-help component to testComponent (imported)</button>
</template>
<script>
import TestComponent from '@/components/TestComponent';
export default {
name: 'some-child-component',
computed: {
testComponent() {
return TestComponent;
}
}
};
</script>
其他地方的子元素(变体 3,存储名称,从导入的组件派生,在 Vuex 中;我会选择这个变体):
<template>
<button @click="$store.commit('setHelpComponent', testComponentName)">Set v-help component to 'test-component'</button>
</template>
<script>
import TestComponent from '@/components/TestComponent';
export default {
name: 'some-child-component',
computed: {
testComponentName() {
return TestComponent.name;
}
}
};
</script>
Vuex 商店:
state: {
helpComponent: null
},
mutations: {
setHelpComponent(state, value) {
state.helpComponent = value;
}
}
另请参阅动态组件的文档(<component :is="">
语法):https://v2.vuejs.org/v2/guide/components.html#Dynamic-Components
关于javascript - 是否可以从单个文件 comp 向全局 Vue 组件添加内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53409713/
我有一个 if 语句,如下所示 if (not(fullpath.lower().endswith(".pdf")) or not (fullpath.lower().endswith(tup
然而,在 PHP 中,可以: only appears if $foo is true. only appears if $foo is false. 在 Javascript 中,能否在一个脚
XML有很多好处。它既是机器可读的,也是人类可读的,它具有标准化的格式,并且用途广泛。 它也有一些缺点。它是冗长的,不是传输大量数据的非常有效的方法。 XML最有用的方面之一是模式语言。使用模式,您可
由于长期使用 SQL2000,我并没有真正深入了解公用表表达式。 我给出的答案here (#4025380)和 here (#4018793)违背了潮流,因为他们没有使用 CTE。 我很欣赏它们对于递
我有一个应用程序: void deleteObj(id){ MyObj obj = getObjById(id); if (obj == null) { throw n
我的代码如下。可能我以类似的方式多次使用它,即简单地说,我正在以这种方式管理 session 和事务: List users= null; try{ sess
在开发J2EE Web应用程序时,我通常会按以下方式组织我的包结构 com.jameselsey.. 控制器-控制器/操作转到此处 服务-事务服务类,由控制器调用 域-应用程序使用的我的域类/对象 D
这更多是出于好奇而不是任何重要问题,但我只是想知道 memmove 中的以下片段文档: Copying takes place as if an intermediate buffer were us
路径压缩涉及将根指定为路径上每个节点的新父节点——这可能会降低根的等级,并可能降低路径上所有节点的等级。有办法解决这个问题吗?有必要处理这个吗?或者,也许可以将等级视为树高的上限而不是确切的高度? 谢
我有两个类,A 和 B。A 是 B 的父类,我有一个函数接收指向 A 类型类的指针,检查它是否也是 B 类型,如果是将调用另一个函数,该函数接受一个指向类型 B 的类的指针。当函数调用另一个函数时,我
有没有办法让 valgrind 使用多个处理器? 我正在使用 valgrind 的 callgrind 进行一些瓶颈分析,并注意到我的应用程序中的资源使用行为与在 valgrind/callgrind
假设我们要使用 ReaderT [(a,b)]超过 Maybe monad,然后我们想在列表中进行查找。 现在,一个简单且不常见的方法是: 第一种可能性 find a = ReaderT (looku
我的代码似乎有问题。我需要说的是: if ( $('html').attr('lang').val() == 'fr-FR' ) { // do this } else { // do
根据this文章(2018 年 4 月)AKS 在可用性集中运行时能够跨故障域智能放置 Pod,但尚不考虑更新域。很快就会使用更新域将 Pod 放入 AKS 中吗? 最佳答案 当您设置集群时,它已经自
course | section | type comart2 : bsit201 : lec comart2 :
我正在开发自己的 SDK,而这又依赖于某些第 3 方 SDK。例如 - OkHttp。 我应该将 OkHttp 添加到我的 build.gradle 中,还是让我的 SDK 用户包含它?在这种情况下,
随着 Rust 越来越充实,我对它的兴趣开始激起。我喜欢它支持代数数据类型,尤其是那些匹配的事实,但是对其他功能习语有什么想法吗? 例如标准库中是否有标准过滤器/映射/归约函数的集合,更重要的是,您能
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎与 help center 中定义的范围内的编程无关。 . 关闭 9 年前。 Improve
我一直在研究 PHP 中的对象。我见过的所有示例甚至在它们自己的对象上都使用了对象构造函数。 PHP 会强制您这样做吗?如果是,为什么? 例如: firstname = $firstname;
...比关联数组? 关联数组会占用更多内存吗? $arr = array(1, 1, 1); $arr[10] = 1; $arr[] = 1; // <- index is 11; does the
我是一名优秀的程序员,十分优秀!