Я использую Vuejs. Я создал два компонента: First
и Second
.
First
рендеринг Second
. Second
имеет именованный слот. First
содержит <template>
, до go в названном слоте Second
. - Внутри
First
s <template>
- есть еще один названный слот. - Внутри
Second
s <slot>
- есть <template>
, до go в First
s <template>
названном слоте.
То, что я получаю First
'<template>
отображается в слоте Second
.
Это правильно, но я бы хотел также видеть Second
' * <template>
, отображаемый внутри <slot>
из First
' с <template>
. Но я не знаю.
Вот код:
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
Могу ли я добиться этого с помощью слотов? Если нет, то может ли это быть достигнуто другим способом, но без создания третьего компонента?
EDIT : возможный реальный сценарий использования: компонент 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>