>웹 프론트엔드 >View.js >Vue의 슬롯을 분석하는 기사

Vue의 슬롯을 분석하는 기사

青灯夜游
青灯夜游앞으로
2022-05-11 11:23:042844검색

이 글은 vue의 슬롯에 대한 심층적인 이해를 제공하고 Vue 슬롯을 플레이하는 데 도움이 될 것입니다. 모두에게 도움이 되기를 바랍니다!

Vue의 슬롯을 분석하는 기사

Vue에서 슬롯은 패키지된 구성 요소를 훨씬 더 유연하게 만들 수 있는 매우 강력한 기능입니다. 예를 들어 구성 요소를 캡슐화할 때 슬롯을 사용하면 상위 구성 요소가 호출될 때 여기에 있는 콘텐츠가 될 수 있습니다. 구성 요소를 캡슐화할 때 다양한 사용 시나리오를 처리하는 방법을 생각할 필요 없이 상위 구성 요소에 의해 자유롭게 정의됩니다. (학습 동영상 공유: vue 동영상 튜토리얼)

기본 슬롯

이제 슬롯SlotComponentSlotComponent

<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>

在调用时标签之间并没有提供内容,默认值得以渲染,成为一个兜底内容。

Vue의 슬롯을 분석하는 기사

具名插槽

如果在组件中我需要多个地方用到插槽,那就需要给 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 属性的话,就默认namedefault,等同于 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"

slotProps 的解构

作用域插槽的内部工作原理是将你的插槽内容包括在一个传入单个参数的函数里

基于插槽的实现原理,我们也可以使用一些 ES6 的语法来操作 slotProps,比如解构prop重命名赋默认值等。

// 解构
<SlotProp v-slot="{ value1 }">
    {{ value1 }}
</SlotProp>

// 重命名,将 value1 重命名为 name1
<SlotProp v-slot="{ value1: name1 }">
    {{ name1 }}
</SlotProp>

// 赋默认值
<SlotProp v-slot="{ value1 = &#39;这是默认值&#39; }">
    {{ 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>
rrreee

in slot을 캡슐화해야 하는 구성 요소가 있다고 가정해 보겠습니다. 콘텐츠는 상위 구성 요소에서 임의로 정의할 수 있습니다. 구성 요소에 <slot></slot> 요소가 없으면 상위 구성 요소가 호출될 때 구성 요소의 시작 태그와 끝 태그 사이의 내용이 손실됩니다. 🎜🎜slotSlotComponent 컴포넌트에 포함되어 있는데, 상위 컴포넌트에서 호출 시 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>slotname 속성을 ​​추가하면 v-slot:slotName 형식으로 콘텐츠를 배포할 수 있습니다. name 속성이 지정되지 않은 경우 기본 namedefault가 되며 이는 v-slot:default와 동일합니다. code> 또는 가능합니다. 약어는 <code>#default입니다. 🎜🎜🎜 🎜 v-slot 🎜은 🎜 <template> </template>🎜🎜에만 추가할 수 있지만 특별한 경우도 있으므로 나중에 논의하겠습니다. 🎜

🎜슬롯을 통해 하위 구성 요소의 콘텐츠에 액세스하는 방법🎜🎜🎜슬롯을 통해 상위 구성 요소의 하위 구성 요소에 콘텐츠를 추가할 수 있지만 상위-하위 구성 요소의 역할 도메인이 다릅니다. 상위 구성 요소에서 하위 구성 요소의 데이터를 사용하려면 어떻게 해야 합니까? 🎜🎜하위 구성 요소의 <slot></slot> 요소에 속성을 바인딩할 수 있으며, 값은 상위 구성 요소에 전달해야 하는 콘텐츠입니다. 🎜rrreee🎜간단히 말하면 슬롯:key='value' 형식으로 값을 바인딩하는 것입니다. 🎜🎜상위 컴포넌트에서 호출할 때 v-slot: SlotName="slotProps"

이 값을 얻으려면 slotProps 이름을 직접 정의할 수 있습니다. 🎜🎜그런 다음 slotProps[key]를 수행하세요. > 이 값을 가져옵니다. 🎜🎜구성 요소에 기본 템플릿이 하나만 있는 경우 templatev-slot:slotName="slotProps"를 작성할 필요가 없습니다. code>v-slot🎜rrreee🎜위에서 언급한 것처럼 name을 지정하지 않으면 default로 간주됩니다. 여기서는 true이므로 v -slot:default="slotProps"v-slot="slotProps"로 축약될 수 있습니다. 🎜

🎜slotProps의 구조화🎜🎜
🎜범위가 지정된 슬롯의 내부 작동은 단일 인수로 전달되는 함수에 슬롯의 내용을 포함하는 것입니다🎜🎜슬롯의 구현 원리에 따라 🎜destructuring🎜, 🎜prop renaming🎜 및 🎜할당 기본값과 같은 일부 ES6 구문을 사용하여 slotProps를 작동할 수도 있습니다. 가치 🎜등. 🎜rrreee

🎜동적 슬롯 이름🎜🎜🎜슬롯<template v-slot:></template>를 지원합니다. >이것은 동적 슬롯을 구현하는 방법. 🎜🎜때때로 기본 구성 요소의 루프에 여러 슬롯이 삽입됩니다. 예를 들어 🎜rrreee🎜를 호출할 때 🎜동적 슬롯 이름🎜 + 🎜loop🎜을 사용하여 해당 슬롯

🎜
<template
  v-for="item in slotList"
  v-slot:[item]
>
    {{item}}
</template>

(学习视频分享:web前端开发编程基础视频

위 내용은 Vue의 슬롯을 분석하는 기사의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 juejin.cn에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제