二十二、插槽(slot)
组件的插槽
- 组件的插槽时为了让我们封装的组件更加具有扩展性
- 让使用者可以决定组件内部的一些内容到底展示什么
■如何去封装这类的组件
- 它们也很多区别,但是也有很多共性。
- 如果,我们每一个单独去封装一个组件,显然不合适:比如每个页面都返回,这部分内容我们就要重复去封装。
- 但是,如果我们封装成一个,好像也不合理:有些左侧是菜单,有些是返回,有些中间是搜索,有些是文字等等。
■如何封装合适,抽取共性,保留不同。
- 最好的封装方式就是将共性抽取到组件中,将不同暴露为插槽。
- 一旦我们预留了插槽,就可以让使用者根据自己的需求,决定插槽中插入什么内容。
- 是搜索框,还是文字,还是菜单。由调用者自己来决定。
1. 插槽的基本使用:<slot></slot>
2. 插槽的默认值:<slot>button<slot>
3. 如果有多个值,同时放入到组件进行替换时,一起作为替换元素
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | <!-- 1.插槽的基本使用:<slot></slot> 2.插槽的默认值:<slot>button<slot> 3.如果有多个值,同时放入到组件进行替换时,一起作为替换元素 --> <div id= "app" > <my_con><button>按钮</button></my_con> <my_con><span>哈哈哈</span></my_con> <my_con> <i>呵呵呵</i> <div>我是div元素</div> <p>我是p元素</p> </my_con> <my_con></my_con> <my_con></my_con> </div> <template id= "cpnC" > <div> <p>我是组件<i>我是组件,哈哈哈</i></p> <!-- 预备插槽 --> <slot><button>按钮</button></slot> </div> </template> <script> const app = new Vue({ el: "#app" , data: { message: "Hellow World" }, components:{ my_con: { template: "#cpnC" }, } }); </script> |
具名插槽
使用name属性对插槽进行定义,并使用 slot="" ,对指定的插槽进行调用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | <div id= "app" > <my_cpn> <div slot= "center" > <span>标题</span> </div> <div slot= "left" > <button>按钮</button> </div> </my_cpn> </div> <template id= "cpnC" > <div> <slot name= "left" ><span>左边</span></slot> <slot name= "center" ><span>中间</span></slot> <slot name= "right" ><span>右边</span></slot> </div> </template> <script> const app = new Vue({ el: "#app" , data: { message: "Hellow World" }, components:{ my_cpn:{ template: "#cpnC" } } }); </script> |
作用域插槽(父组件替换插槽的标签,但是内容由子组件来提供)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 | <!DOCTYPE html> <html> <head> <meta charset= "UTF-8" > <title></title> <script src= "../Js/vue.min.js" ></script> </head> <body> <!-- 父组件替换插槽的标签,但是内容由子组件来提供 --> <div id= "app" > <my_cpn></my_cpn> <my_cpn> <!-- <span>JavaScript-</span> <span>c++-</span> --> <!-- 目的是获取子组件中的pLanguages --> <template slot-scope= "slot" > <span> {{ slot.data. join ( " - " ) }} </span> <!-- <span v- for = "item in slot.data" >{{item}}- </span> --> </template> </my_cpn> <my_cpn> <!-- <span>JavaScript-</span> <span>c++-</span> --> <!-- 目的是获取子组件中的pLanguages --> <template slot-scope= "obj" > <span v- for = "item in obj.data" >{{item}}* </span> </template> </my_cpn> </div> <template id= "cpnC" > <div> <slot :data= "pLanguages" > <ul> <li v- for = "item in pLanguages" > {{ item }} </li> </ul> </slot> </div> </template> <script> const app = new Vue({ el: "#app" , data: { message: "Hellow World" }, components: { my_cpn: { template: "#cpnC" , data(){ return { pLanguages: [ "JavaScript" , "C++" , "Java" , "c#" , "Python" , "go" , "swift" ], } } } } }); </script> </body> </html> |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现