作用
为了让封装的组件更加具有扩展性; 让使用决定组件呢不展示的内容。
基本使用
使用标签 栗子:
移动开发中,几乎每个页面都有导航栏; 导航栏一般都会封装成一个插件,比如nav-bar组件; 多个页面复用封装好的组件。 京东app中多个页面使用的导航栏
组件如何封装
提取共性,保留不同;
将共性抽取到组件中,将不同暴露给插槽; 若预留插槽,让使用者根据自己需求,决定插槽中显示的内容; 如搜索框、文字、菜单等,均由调用者决定。 项目中如何使用插槽
<slot>
标签中的内容显示,若在该组件中未插内容,就默认显示该内容;可在父组件中使用
<div id = 'app'>
< cpn> < button> 按钮</ button> </ cpn>
< cpn> < span> 内容</ span> </ cpn>
< cpn> < i> 样式</ i> </ cpn>
</ div>
<template id = 'cpn'>
< div>
< h2> 我是组件中h2</ h2>
< p> 我是组件内容</ p>
< slot> </ slot>
</ div>
</ template>
<div id = 'app'>
< cpn> </ cpn>
< cpn> < span> 哈哈哈</ span> </ cpn>
< cpn> < i> 呵呵呵</ i> </ cpn>
< cpn> </ cpn>
</ div>
<template id = 'cpn'>
< div>
< h2> 我是组件</ h2>
< p> 我是组件,哈哈哈哈</ p>
< slot> < button> 按钮</ button> </ slot>
</ div>
</ template>
具名插槽
使用插槽时,给插槽定义name
属性; 调用的时候要写slot="nameValue"
。如下:
<div id = 'app'>
< cpn> <span slot = 'center'>标题</ span> </ cpn>
< cpn> <button slot = 'left'>返回</ button> </ cpn>
< cpn> </ cpn>
</ div>
<template id = 'cpn'>
< div>
< slot> <span name = 'left'>左边</ span> </ slot>
< slot> <span name = 'center'>中间</ span> </ slot>
< slot> <span name = 'right'>右边</ span> </ slot>
</ div>
</ template>
编译作用域
什么是编辑作用域
类似Java方法中变量的作用域; 官方准则:父组件模板的所有东西都会在父级作用域内编译;子组件模板的所有东西都会在自己作用域内编译。
作用域插槽
组件模板在使用变量的时候会从优先从当前模板拿数据; 父组件模板的所有东西都会在父级作用域内编译; 子组件模板的所有东西都会在子级作用域内编译。 栗子(父组件替换插槽标签,内容由子组件来提供):
需求:
子组件中包括一组数据,如: computer_language:['JavaScript', 'Phthon', 'Swift', 'Go', 'C++'];
需要在多个界面以不同方式展示,如: 水平形式、列表形式、数组形式 内容在子组件,父组件决定展示形式。 使用slot作用域插槽解决
通过<template slot-scope="slotProps">
获取slotProps属性; 再通过slotProps.data
获取传入的data。
< div id = " app" >
< cpn>
< template slot-scope = " slotProps" >
//在父组件使用模板标签然后用slot-scope="slot"引入插槽元素
//调用模板数据的时候用join函数用于分割
< span v-for = " item in slotProps.data.join(' -' )" > {{item}}</ span>
</ template>
</ cpn>
< cpn>
< template slot-scope = " slotProps" >
< ul>
< li v-for = " info in slotProps.data" > {{info}}</ li>
</ ul>
</ template>
</ cpn>
</ div>
< template id = " cpn" >
< div>
< slot :data = " computer_language" >
//在插槽标签中,绑定当前模板所在作用域的数据
< ul>
< li v-for = " item in computer_language" > {{item}}</ li>
</ ul>
</ slot>
</ div>
</ template>
< script>
const vm= new Vue ( {
el: '#app' ,
data: {
message: 'hello'
} ,
components: {
cpn: {
template: '#cpn' ,
data ( ) {
return {
computer_language: [ 'JavaScript' , 'Phthon' , 'Swift' , 'Go' , 'C++' ]
}
}
}
}
} )
< / script>