当前位置: 首页 > news >正文

vue 插槽(二)

渲染作用域​

插槽内容可以访问到父组件的数据作用域,因为插槽内容本身是在父组件模板中定义的。举例来说:

<span>{{ message }}</span>
<FancyButton>{{ message }}</FancyButton>

这里的两个 {{ message }} 插值表达式渲染的内容都是一样的。

插槽内容无法访问子组件的数据。Vue 模板中的表达式只能访问其定义时所处的作用域,这和 JavaScript 的词法作用域规则是一致的。换言之:

父组件模板中的表达式只能访问父组件的作用域;子组件模板中的表达式只能访问子组件的作用域。

默认内容​

在外部没有提供任何内容的情况下,可以为插槽指定默认内容。比如有这样一个 <SubmitButton> 组件:

<button type="submit"><slot></slot>
</button>
<button type="submit"><slot>Submit <!-- 默认内容 --></slot>
</button>

 现在,当我们在父组件中使用 <SubmitButton> 且没有提供任何插槽内容时:

<SubmitButton />

 “Submit”将会被作为默认内容渲染:

<button type="submit">Submit</button>

但如果我们提供了插槽内容:

<SubmitButton>Save</SubmitButton>

那么被显式提供的内容会取代默认内容:

<button type="submit">Save</button>

具名插槽​

有时在一个组件中包含多个插槽出口是很有用的。举例来说,在一个 <BaseLayout> 组件中,有如下模板:

<div class="container"><header><!-- 标题内容放这里 --></header><main><!-- 主要内容放这里 --></main><footer><!-- 底部内容放这里 --></footer>
</div>

对于这种场景,<slot> 元素可以有一个特殊的 attribute name,用来给各个插槽分配唯一的 ID,以确定每一处要渲染的内容:

<div class="container"><header><slot name="header"></slot></header><main><slot></slot></main><footer><slot name="footer"></slot></footer>
</div>

这类带 name 的插槽被称为具名插槽 (named slots)。没有提供 name 的 <slot> 出口会隐式地命名为“default”。

在父组件中使用 <BaseLayout> 时,我们需要一种方式将多个插槽内容传入到各自目标插槽的出口。此时就需要用到具名插槽了:

要为具名插槽传入内容,我们需要使用一个含 v-slot 指令的 <template> 元素,并将目标插槽的名字传给该指令:

<BaseLayout><template v-slot:header><!-- header 插槽的内容放这里 --></template>
</BaseLayout>

动态插槽名​

动态指令参数在 v-slot 上也是有效的,即可以定义下面这样的动态插槽名:

<base-layout><template v-slot:[dynamicSlotName]>...</template><!-- 缩写为 --><template #[dynamicSlotName]>...</template>
</base-layout>

作用域插槽​

在上面的渲染作用域中我们讨论到,插槽的内容无法访问到子组件的状态。

然而在某些场景下插槽的内容可能想要同时使用父组件域内和子组件域内的数据。要做到这一点,我们需要一种方法来让子组件在渲染时将一部分数据提供给插槽。

我们也确实有办法这么做!可以像对组件传递 props 那样,向一个插槽的出口上传递 attributes:

<!-- <MyComponent> 的模板 -->
<div><slot :text="greetingMessage" :count="1"></slot>
</div>
<MyComponent v-slot="slotProps">{{ slotProps.text }} {{ slotProps.count }}
</MyComponent>

http://www.lryc.cn/news/328816.html

相关文章:

  • 【Java】MyBatis快速入门及详解
  • Matlab将日尺度数据转化为月尺度数据
  • 【技巧】PyTorch限制GPU显存的可使用上限
  • 深度理解文件操作
  • 【搜索引擎2】实现API方式调用ElasticSearch8接口
  • 配置小程序的服务器域名
  • 政安晨:【深度学习神经网络基础】(一)—— 逐本溯源
  • 技巧 Win10电脑打开SMB协议共享文件,手机端查看
  • java实现MP4视频压缩
  • 云电脑安全性怎么样?企业如何选择安全的云电脑
  • 【python】pygame游戏框架
  • 计算机OSI7层协议模型
  • 书生·浦语大模型实战营之全链路开源体系
  • /.git/config文件目录
  • MySQL 8.0 新特性之不可见主键
  • kubernetes-networkpolicies网络策略问题
  • wps没保存关闭了恢复数据教程
  • Android9.0以后不允许HTTP访问的解决方案
  • nvm安装以后,node -v npm 等命令提示不是内部或外部命令
  • SBA架构5G核心网
  • 上位机图像处理和嵌入式模块部署(qmacvisual图像拼接)
  • 关于对postcss安装和使用比较详细
  • uniApp使用XR-Frame创建3D场景(4)金属度和粗糙度
  • 使用itext-core生成PDF
  • 接口自动化框架搭建(四):pytest的使用
  • 蓝桥杯算法基础(34)深度优先搜索DFS(数独游戏)(部分和)(水洼数目)(八皇后问题)(素数环)(困难的串)
  • 蓝桥杯备考随手记: Math 类中常用方法
  • 外包干了4年,技术退步明显。。。。
  • 亚远景科技-Hardware Engineering SPICE课程大纲
  • JDK8的下载安装与环境变量配置教程