이 글은 vue의 슬롯에 대한 심층적인 이해를 제공하고 Vue 슬롯을 플레이하는 데 도움이 될 것입니다. 모두에게 도움이 되기를 바랍니다!
Vue에서 슬롯은 패키지된 구성 요소를 훨씬 더 유연하게 만들 수 있는 매우 강력한 기능입니다. 예를 들어 구성 요소를 캡슐화할 때 슬롯을 사용하면 상위 구성 요소가 호출될 때 여기에 있는 콘텐츠가 될 수 있습니다. 구성 요소를 캡슐화할 때 다양한 사용 시나리오를 처리하는 방법을 생각할 필요 없이 상위 구성 요소에 의해 자유롭게 정의됩니다. (학습 동영상 공유: vue 동영상 튜토리얼)
이제 슬롯
에 SlotComponent
SlotComponent
<template> <div>这是一个slot:<slot> </slot></div> </template>
<SlotComponent>来自父组件的内容</SlotComponent>
在 slot
中的内容就可以在父组件中任意定义。要是组件中没有<slot></slot>
元素,那么在父组件调用时,组件起始和结束标签之间的内容就都会丢失掉。
既然 slot
是在 SlotComponent
组件中的,那在父组件中调用的时候能否能使用 SlotComponent
组件里的数据呢 ? 显然是不能的,因为他们所处的作用域并不相同。
父级模板里的所有内容都是在父级作用域中编译的;子模板里的所有内容都是在子作用域中编译的。
插槽也可以设置默认的内容,这有点像 es6
中函数参数的默认值,当父组件调用时并没有提供内容,那么这个默认值就会被渲染出来。提供了内容的话,则会替代默认内容。
<template> <div> <slot>这是slot的默认内容</slot> </div> </template>
<DefaultSlot></DefaultSlot>
在调用时标签之间并没有提供内容,默认值得以渲染,成为一个兜底内容。
如果在组件中我需要多个地方用到插槽,那就需要给 slot
添加 name
,来区分内容渲染到什么地方。
// named slot,名字叫 NamedSlot <template> <div> 这是具名插槽 <div> <slot name="slot1"></slot> </div> <div> <slot name="slot2"></slot> </div> <div> <slot name="slot3"></slot> </div> </div> </template> // 在父组件中调用 <NamedSlot> <template v-slot:slot1>这是插入slot1的内容</template> <template v-slot:slot2>这是插入slot2的内容</template> <template v-slot:slot3>这是插入slot3的内容</template> </NamedSlot>
给 slot
加上 name
属性后,可以通过 v-slot:slotName
的形式分发内容。不给 name
属性的话,就默认name
为 default
,等同于 v-slot:default
,也可以缩写为#default
。
注意, v-slot
只能添加在 <template> </template>
上 ,但是也有特殊情况,后面会讲到。
通过 slot
,我们可以在父组件为子组件添加内容,但是父子组件的作用域是不同的,我们想在父组件使用子组件的数据该怎么办呢?
可以在子组件 <slot></slot>
元素上绑定属性,值为你需要传递给父组件的内容。
// 子组件 组件名称为 SlotProp <div> <slot name="slot1" :value1="child1"></slot> <slot name="slot2" :value2="child2"></slot> </div> //调用 <SlotProp> <template v-slot:slot1="slotProps"> {{ slotProps.value1 }} </template> <template v-slot:slot2="slotProps"> {{ slotProps.value2 }} </template> </SlotProp>
简单来说,就是在 slot
上通过 :key='value'
的形式绑定一个值,
在父组件调用时,通过v-slot:slotName="slotProps"
的形式拿到这个值,slotProps
名称可以自己定义,
再通过 slotProps[key]
去拿到这个值。
如果组件只有一个默认模版的话,是可以不用在 template
上写 v-slot:slotName="slotProps"
的,可以直接在组件名称上写 v-slot
<SlotProp v-slot:default="slotProps"> {{ slotProps.value1 }} </SlotProp>
上面提到过,未指定 name
就会被认为是 default
,这里也是同理,v-slot:default="slotProps"
可以简写成 v-slot="slotProps"
。
作用域插槽的内部工作原理是将你的插槽内容包括在一个传入单个参数的函数里
基于插槽的实现原理,我们也可以使用一些 ES6
的语法来操作 slotProps
,比如解构,prop重命名和赋默认值等。
// 解构 <SlotProp v-slot="{ value1 }"> {{ value1 }} </SlotProp> // 重命名,将 value1 重命名为 name1 <SlotProp v-slot="{ value1: name1 }"> {{ name1 }} </SlotProp> // 赋默认值 <SlotProp v-slot="{ value1 = '这是默认值' }"> {{ value1 }} </SlotProp>
slot
支持通过 <template v-slot:></template>
这样的方式来实现动态插槽。
有时在一个基础组件中循环了插入了多个 slot
,比如这样
<div v-for="item in slotList" :key="item"> <slot :name="item"></slot> </div>
在调用的时候就可以使用动态插槽名 + 循环来动态渲染相应的 slot
<template v-for="item in slotList" v-slot:[item] > {{item}} </template>rrreeein
slot
을 캡슐화해야 하는 구성 요소가 있다고 가정해 보겠습니다. 콘텐츠는 상위 구성 요소에서 임의로 정의할 수 있습니다. 구성 요소에 <slot></slot>
요소가 없으면 상위 구성 요소가 호출될 때 구성 요소의 시작 태그와 끝 태그 사이의 내용이 손실됩니다. 🎜🎜slot
은 SlotComponent
컴포넌트에 포함되어 있는데, 상위 컴포넌트에서 호출 시 SlotComponent
컴포넌트에 있는 데이터를 사용할 수 있나요? 당연히 범위가 다르기 때문에 불가능합니다. 🎜🎜상위 템플릿의 모든 콘텐츠는 상위 범위에서 컴파일됩니다. 하위 템플릿의 모든 콘텐츠는 하위 범위에서 컴파일됩니다. 🎜
es6 기본값. 상위 구성 요소가 호출될 때 콘텐츠를 제공하지 않으면 이 기본값이 렌더링됩니다. 콘텐츠가 제공되면 기본 콘텐츠가 대체됩니다. 🎜rrreeerrreee🎜호출시 태그 사이에 콘텐츠가 제공되지 않습니다. 기본값이 렌더링되어 은폐 콘텐츠가 됩니다. 🎜🎜<img src="https://img.php.cn/upload/image/887/992/545/1652239130210398.png" title="1652239130210398.png" alt="Vue의 슬롯을 분석하는 기사">🎜<h2 data-id="heading-2">🎜이름이 지정된 슬롯🎜🎜🎜구성 요소의 여러 위치에서 슬롯을 사용해야 하는 경우 <code>슬롯
코드에 이름을 추가해야 합니다. >, 콘텐츠가 렌더링되는 위치를 구별합니다. 🎜rrreee🎜<code>slot
에 name
속성을 추가하면 v-slot:slotName
형식으로 콘텐츠를 배포할 수 있습니다. name
속성이 지정되지 않은 경우 기본 name
은 default
가 되며 이는 v-slot:default와 동일합니다. code> 또는 가능합니다. 약어는 <code>#default
입니다. 🎜🎜🎜 🎜 v-slot
🎜은 🎜 <template> </template>
🎜🎜에만 추가할 수 있지만 특별한 경우도 있으므로 나중에 논의하겠습니다. 🎜슬롯
을 통해 상위 구성 요소의 하위 구성 요소에 콘텐츠를 추가할 수 있지만 상위-하위 구성 요소의 역할 도메인이 다릅니다. 상위 구성 요소에서 하위 구성 요소의 데이터를 사용하려면 어떻게 해야 합니까? 🎜🎜하위 구성 요소의 <slot></slot>
요소에 속성을 바인딩할 수 있으며, 값은 상위 구성 요소에 전달해야 하는 콘텐츠입니다. 🎜rrreee🎜간단히 말하면 슬롯
에 :key='value'
형식으로 값을 바인딩하는 것입니다. 🎜🎜상위 컴포넌트에서 호출할 때 v-slot: SlotName="slotProps"slotProps
이름을 직접 정의할 수 있습니다. 🎜🎜그런 다음 slotProps[key]
를 수행하세요. > 이 값을 가져옵니다. 🎜🎜구성 요소에 기본 템플릿이 하나만 있는 경우 template
에 v-slot:slotName="slotProps"
를 작성할 필요가 없습니다. code>v-slot🎜rrreee🎜위에서 언급한 것처럼 name
을 지정하지 않으면 default
로 간주됩니다. 여기서는 true이므로 v -slot:default="slotProps"
는 v-slot="slotProps"
로 축약될 수 있습니다. 🎜🎜범위가 지정된 슬롯의 내부 작동은 단일 인수로 전달되는 함수에 슬롯의 내용을 포함하는 것입니다🎜🎜슬롯의 구현 원리에 따라 🎜destructuring🎜, 🎜prop renaming🎜 및 🎜할당 기본값과 같은 일부ES6
구문을 사용하여slotProps
를 작동할 수도 있습니다. 가치 🎜등. 🎜rrreee🎜동적 슬롯 이름🎜🎜🎜
슬롯
은<template v-slot:></template>
를 지원합니다. >이것은 동적 슬롯을 구현하는 방법. 🎜🎜때때로 기본 구성 요소의 루프에 여러슬롯
이 삽입됩니다. 예를 들어 🎜rrreee🎜를 호출할 때 🎜동적 슬롯 이름🎜 + 🎜loop🎜을 사용하여 해당 슬롯
<template v-for="item in slotList" v-slot:[item] > {{item}} </template>
위 내용은 Vue의 슬롯을 분석하는 기사의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!