【发布时间】:2020-05-19 19:22:49
【问题描述】:
我正在使用 Vuejs。
我创建了两个组件:First 和 Second。
-
First渲染Second。 -
Second有一个命名槽。 -
First包含一个<template>,用于进入Second的命名槽。 - 在
First的<template>内部 - 还有另一个命名槽。 - 在
Second的<slot>内部 - 有一个<template>,用于进入First的<template>的命名槽。
我得到的是First 的<template> 渲染在Second 的插槽内。
这是正确的,但我还希望看到Second 的<template> 呈现在First 的<template> 的<slot> 内。但我没有。
代码如下:
var First = Vue.extend({
template: `
<div>
In first<br/>
<second>
<template slot="slot1">
In template of First
<slot name="slot2">
</slot>
</template>
</second>
</div>
`
})
Vue.component('first', First)
var Second = Vue.extend({
template: `
<div>
In second<br/>
<slot name="slot1">
<template slot="slot2">
In template of Second
</template>
</slot>
</div>
`
})
Vue.component('second', Second)
这是输出:
In first
In second
In template of First
这里是 jsfiddle:https://jsfiddle.net/obeobe/f98kr4ye/
我想得到这个输出:
In first
In second
In template of First
In template of Second
我可以通过插槽实现这一点吗?如果没有,是否可以通过其他方式实现,但无需创建第三个组件?
编辑:一个可能的现实用例:一个 List 组件,它允许每个项目的 HTML 内容由其宿主定义,并且可以在宿主的内部注入一些自己的内容内容,在主持人指定的地点。
例如,像这样的:
主机组件:
<div class="myList">
<list v-bind:items="usersArray">
<template slot="itemSlot" slotScope="item">
<div>{{ item.name }}</div>
<div>{{ item.country }}</div>
<div>{{ item.phone }}</div>
<slot name="actions"> <--------- the spot for the List component to inject generic actions
</slot>
<div>{{ item.age }}</div>
</template>
</list>
</div>
“列表”组件:
<div>
<div v-for="(anItem, idx) in items">
<div>{{ idx }}</div>
<slot name="itemSlot" v-bind:item="anItem">
<template slot="actions">
<a v-on:click="duplicateItem(anItem)">Duplicate</a> <---------- the "duplicateItem" method would be implemented inside this List component
<a>Edit</a>
<a>Delete</a>
</template>
</slot>
</div>
</div>
【问题讨论】:
-
嗨@obe 我只是添加我的答案,这听起来有点傻,所以不确定我是否正确理解你的情况。
标签: vue.js vuejs-slots