一个VueJS组件,带有多个模板
One VueJS Component with multiple templates
如何让一个组件具有多个模板,或者以其他方式将任何方法和数据从任何一个特定模板中分离出来
VueJS中的组件应该是可重用的,不是吗?如果我有一个用户有它的方法和数据,那么它在我的大部分(所有?)UI中的行为肯定是一样的。但是,它的显示方式会有所不同。
我经常通过传递一个道具并使用该道具进行条件渲染来实现这一点。
例如:
<template>
<div>
<div v-if="isActive">RADICAL ACTIVE STATE</div>
<div v-if="!isActive">YOLO NOT ACTIVE</div>
</div>
<template>
<script>
export default {
props: {
isActive: {
type: Boolean,
required: true,
},
},
};
</script>
这可能会让你在80%的时间内到达那里,除非"单根包装器"的东西给你带来了问题。
在这种情况下,你肯定有选择。其中之一可以是使用槽并控制上游的条件呈现。这可能会减少标记。
也许您可以创建两个组件,每个组件都比其他组件更简单。减少圈复杂度总是好的。
您还可以在模板本身<template v-if="">
上抛出v-if。
根据我今天的经验,不能在一个文件组件中使用两个模板(就像我上面展示的代码中的那个)。Vue似乎没有正确解析模板。Vue根本没有执行我的计算道具或方法。它总是呈现第二个模板,因此Vue可能具有内部逻辑,从而加载"最后一个观察到的模板"。
一个人可能会发现阅读很有帮助http://vuejs.org/guide/components.html#Fragment_Instance因为它说明了CCD_ 2实例道具。
它是我见过的最接近React的等价物,相当于一个无状态的哑组件,例如:
const ShowNumber = ({ num }) => (
<div>{num}</div>
)
...
<ShowNumber num={1337} />
如果我在这里的答案让你胃口大开,但你觉得它仍然不是你所需要的,那么谷歌"Vue渲染道具",看看你如何在render
实例道具中执行疯狂的复杂逻辑。它与React的JSX非常相似,但我要说的是,如果你在这个领域,可能有一种更简单的方法
我可能建议只创建两个单独的文件组件,每个组件中有一个模板,或者找到一种使用插槽并从上游控制行为的方法。
像我在上面的例子中所展示的那样,这样做也很安全,因为通过组件的数据流是单向的和确定性的,UI将始终是道具和数据的反映。如果道具或数据发生更改,组件将呈现正确的元素。
您可以在上游父组件中执行此操作:
<large-widget v-if="someState === 'one'"></large-widget>
<small-widget v-else-if="someState === 'two'"></small-widget>
<div v-else>WIDGET IS BORKEN</div>
- 从vuejs中的组件模板访问父方法
- 编辑组件中的Vuejs数据
- 访问Vuejs组件内部的元素
- 带有组件标签的 VueJS 路由不起作用
- 将自定义属性添加到 vuejs 组件
- VueJS组件来运行一个MelonJS游戏
- Vuejs中同级组件之间的通信
- 如何在单文件组件中扩展另一个 VueJS 组件?(ES6 vue-loader)
- Vuejs 在尝试遍历数组数据或 v-for 时无法正确呈现组件
- 有没有在 vuejs 中重置组件初始数据的正确方法
- 如何在 Vuejs 组件中应用过滤器
- 如何使用组件从 vuejs 中获取纯数组
- VueJS - 组件中的组件
- 在VueJS中将父函数传递给子组件
- VueJS在内联模板组件中重新编译HTML
- 带有道具的内联模板中的Vuejs组件插槽
- 为什么我的VueJs组件没有显示在前端
- 一个VueJS组件,带有多个模板
- $el之外的DOM元素的VueJS组件
- Vuejs组件等待facebook sdk加载