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

vue 通过插槽来分配内容

通过插槽来分配内容

一些情况下我们会希望能和 HTML 元素一样向组件中传递内容:

<AlertBox>Something bad happened.
</AlertBox>

这可以通过 Vue 的自定义 <slot> 元素来实现:

<template><div class="alert-box"><strong>This is an Error for Demo Purposes</strong><slot /></div>
</template><style scoped>
.alert-box {/* ... */
}
</style>

如上所示,我们使用 <slot> 作为一个占位符,父组件传递进来的内容就会渲染在这里。

动态组件​

有些场景会需要在两个组件间来回切换,比如 Tab 界面:

 

上面的例子是通过 Vue 的 <component> 元素和特殊的 is attribute 实现的:

<!-- currentTab 改变时组件也改变 -->
<component :is="tabs[currentTab]"></component>

 

在上面的例子中,被传给 :is 的值可以是以下几种:

  • 被注册的组件名
  • 导入的组件对象

你也可以使用 is attribute 来创建一般的 HTML 元素。

当使用 <component :is="..."> 来在多个组件间作切换时,被切换掉的组件会被卸载。我们可以通过 <KeepAlive> 组件强制被切换掉的组件仍然保持“存活”的状态。

DOM 内模板解析注意事项​

如果你想在 DOM 中直接书写 Vue 模板,Vue 则必须从 DOM 中获取模板字符串。由于浏览器的原生 HTML 解析行为限制,有一些需要注意的事项。

大小写区分​

HTML 标签和属性名称是不分大小写的,所以浏览器会把任何大写的字符解释为小写。这意味着当你使用 DOM 内的模板时,无论是 PascalCase 形式的组件名称、camelCase 形式的 prop 名称还是 v-on 的事件名称,都需要转换为相应等价的 kebab-case (短横线连字符) 形式:

// JavaScript 中的 camelCase
const BlogPost = {props: ['postTitle'],emits: ['updatePost'],template: `<h3>{{ postTitle }}</h3>`
}
<!-- HTML 中的 kebab-case -->
<blog-post post-title="hello!" @update-post="onUpdatePost"></blog-post>

 

闭合标签​

我们在上面的例子中已经使用过了闭合标签 (self-closing tag):

<MyComponent />

 

这是因为 Vue 的模板解析器支持任意标签使用 /> 作为标签关闭的标志。

然而在 DOM 内模板中,我们必须显式地写出关闭标签:

<my-component></my-component>

这是由于 HTML 只允许一小部分特殊的元素省略其关闭标签,最常见的就是 <input> 和 <img>。对于其他的元素来说,如果你省略了关闭标签,原生的 HTML 解析器会认为开启的标签永远没有结束,用下面这个代码片段举例来说:

<my-component /> <!-- 我们想要在这里关闭标签... -->
<span>hello</span>

将被解析为:

<my-component><span>hello</span>
</my-component> <!-- 但浏览器会在这里关闭标签 -->

元素位置限制​

某些 HTML 元素对于放在其中的元素类型有限制,例如 <ul><ol><table> 和 <select>,相应的,某些元素仅在放置于特定元素中时才会显示,例如 <li><tr> 和 <option>

这将导致在使用带有此类限制元素的组件时出现问题。例如:

<table><blog-post-row></blog-post-row>
</table>

自定义的组件 <blog-post-row> 将作为无效的内容被忽略,因而在最终呈现的输出中造成错误。我们可以使用特殊的 is attribute 作为一种解决方案:

<table><tr is="vue:blog-post-row"></tr>
</table>

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

相关文章:

  • YOLO图像前处理及格式转换
  • ES6 学习(二)-- 字符串/数组/对象/函数扩展
  • 《VMamba》论文笔记
  • 手机真机连接USB调试adb不识别不显示和TCPIP连接问题
  • MySQL分表后,如何做分页查询?
  • 【Deep Learning 11】Graph Neural Network
  • http和https的工作原理是什么?
  • STL中容器、算法、迭代器
  • 深入并广泛了解Redis常见的缓存使用问题
  • nginx界面管理工具之nginxWebUI 搭建与使用
  • linux下 罗技鼠标睡眠唤醒问题的解决
  • 架构师之路--Docker的技术学习路径
  • 【动手学深度学习-pytorch】 9.4 双向循环神经网络
  • 网际协议 - IP
  • DC-9靶场
  • 自定义类型(二)结构体位段,联合体,枚举
  • MySQL5.7源码分析--解析
  • windows10搭建reactnative,运行android全过程
  • 小迪学习笔记(内网安全)(常见概念和信息收集)
  • Python自动连接SSH
  • 机器学习实验------AGNES层次聚类方法
  • HBase常用的Filter过滤器操作
  • 容器安全与防御(德迅蜂巢)
  • 【面经八股】搜广推方向:面试记录(十一)
  • 第十四章 MySQL
  • C++项目——集群聊天服务器项目(七)Model层设计、注册业务实现
  • VBA语言専攻介绍(20240331更新)
  • Golang- 邮件服务,发送邮件
  • C语言:编译和链接
  • JavaEE 初阶篇-深入了解多线程安全问题(出现线程不安全的原因与解决线程不安全的方法)