Вчера я читал документ на официальном сайте vue.Я не очень хорошо разбирался в slot-scope.Сегодня я сделал небольшой пример для облегчения понимания.
Давайте сначала поговорим о наших гипотетических общих сценариях приложений.Мы разработали компонент списка дел, многие модули используются, и теперь он должен быть вНе влияет на работу и отображение модулей, прошедших проверкуслучае, дайтеДобавлен эффект галочки для выполненных задач.
То есть компонент списка дел должен удовлетворять следующим требованиям.
- Предыдущий формат данных и справочный интерфейс остаются неизменными и отображаются нормально.
- Новые функциональные модули добавляют галочки
Решений много, но чтобы объяснить слот области видимости компонента, мы будем использовать slot-scope и напишем код предыдущего компонента.
компонент todo-list.vue
<template>
<ul>
<li v-for="item in todoList" v-bind:key="item.id">
<slot v-bind:itemValue = "item" >
{{ item.test }}
</slot>
</li>
</ul>
</template>
<script>
export default {
name: 'todoList',
props: {
todos: Array
},
data(){
return {
todoList:this.todos
}
}
}
</script>
код компонента
<template>
<ul>
<li v-for="item in todoList" v-bind:key="item.id">
<slot>
{{ item.test }}
</slot>
</li>
</ul>
</template>
<script>
export default {
name: 'todoList',
props: {
todos: Array
},
data(){
return {
todoList:this.todos
}
}
}
</script>
код родительского компонента
<template>
<div id="app">
<h2>之前组件调用</h2>
<todo-list v-bind:todos="todosBefore" ></todo-list>
</div>
</template>
<script>
import todoList from './components/todo-list.vue'
export default {
name: 'app',
data:function(){
return {
todosBefore:[
{
test:'询问时间',
id:12312313123
},
{
test:'代办1',
id:123123123423423
},
{
test:'爱你地方年底见覅',
id:12312313123234234
},
{
test:'时间2',
id:1231231312323333
},
{
test:'师生情是行情',
id:12313333333
}
]
}
},
components: {
todoList
}
}
</script>
Отображение результатов
шаг
Для того, чтобы добиться эффекта добавления галочки к пунктам списка дел, нам нужно настроить структуру данных в данных, добавитьtodosAfter
массив и добавить каждый элементisComplete
логотип.
todosAfter:[
{
test:'询问时间',
isComplete:true,
id:12312313123
},
{
test:'代办1',
isComplete:false,
id:123123123423423
},
{
test:'爱你地方年底见覅',
isComplete:false,
id:12312313123234234
},
{
test:'时间2',
isComplete:true,
id:1231231312323333
},
{
test:'师生情是行情',
isComplete:true,
id:12313333333
}
],
Понимание слотов и передачи данных
Когда я читаю чужие посты, мне трудно понять, какова область применения этого слота и какую функцию он выполняет.Я использую просторечие, чтобы многократно думать. решить две проблемы
- Где написан солт-код слота? Конечно внутри родительского компонента,Solt — это интерфейс, предоставляемый дочерним компонентом родительскому компоненту, который необходимо передать от родительского компонента к дочернему компоненту..
- Область слота, слот области буквально понимается и действует только на слот.
Этот сквозной шаг
- Родительский компонент отправляет данные дочернему компоненту, родитель => дочерний
- Дочерний компонент помещает данные в слот и предоставляет их интерфейсу родительского компонента.
- Родительский компонент вызывает интерфейс слота и данные дочернего компонента
Ранее мы добавили данные в данныеisComplete
свойства, теперь к подкомпонентамitem
Передайте его в слот и выставьте интерфейс данных родительскому компоненту.itemValue
, сфокусироваться наv-bind:itemValue = "item"
это предложение.
<template>
<ul>
<li v-for="item in todoList" v-bind:key="item.id">
<slot v-bind:itemValue = "item" >
{{ item.test }}
</slot>
</li>
</ul>
</template>
Далее идет слот и родительский компонент, вызывающий дочерний компонент.itemValue
данные.
<h2>之前组件调用</h2>
<todo-list v-bind:todos="todosAfter">
<template slot-scope="slotProps">
<!-- 打印itemvalue数据-->
<div style="background:red; border-bottom:2px solid blue;">
{{slotProps.itemvalue}}
</div>
<!-- 根据判断条件展示对号元素 -->
<span v-if="slotProps.itemValue.isComplete">✓</span>
<!-- 显示代办事项名称 -->
{{ slotProps.itemValue.test }}
</template>
</todo-list>
Эффект следующий
Прикрепленный пример кода:github link
Суммировать
На самом деле слот области действия очень похож на функцию параметра, компонент эквивалентен cb, а входной параметр cb эквивалентен параметру, полученному slotProps, но имя и форма изменились.
<!-- 函数 -->
function foo(str,cb){
var msg = str + '你好';
cb(msg);
}
<!-- 调用 -->
foo('愚坤',function(msg){
alert(msg)
})
foo('愚坤',function(msg){
console.log(msg)
})