目录
1.插槽
1.1默认插槽/简单插槽
父组件调用子组件提供一个模板
<div id="app">
<my-a>我是父组件传递给子组件得模块</my-a>
</div>
<script>
// 定义组件
let myA = {
template: `
<div>
子组件A
<slot></slot>
</div>
`
}
new Vue({
components: {
'my-a': myA
},
el: "#app",
})
</script>
1.2具名插槽
指定父组件提供子组件的模板渲染到指定插槽
<div id="app">
<my-a>
<div>我是父组件传递给子组件的模块</div>
<template class="header" #header>头部的内容</template>
<template class="center" v-slot:center>中间得内容</template>
<template class="footer" #footer>底部得内容</template>
</my-a>
</div>
<script>
// 定义组件
let myA = {
template: `
<div>
<slot></slot>
<hr>
<slot name='header'></slot>
<slot name='center'></slot>
</div>
`
}
new Vue({
components: {
'my-a': myA
},
el: "#app",
})
</script>
1.3作用域插槽
子组件传递给父组件,使用插槽,父组件获取插槽传递的值。
<div id="app">
<my-a :arr="arr">
<template slot-scope="scope">
{{scope}}
</template>
</my-a>
</div>
<script>
// 定义组件
let myA = {
props: ['arr'],
template: `
<div>
<ul>
<li v-for='item in arr'>
<slot :subSmg='subMsg' :row='item'></slot>
</li>
</ul>
</div>
`,
data() {
return {
subMsg: '我是子组件'
}
}
}
new Vue({
components: {
'my-a': myA
},
el: "#app",
data: {
arr: [
{
id: 1,
name: 'a',
},
{
id: 2,
name: 'b',
},
{
id: 3,
name: 'c',
}
]
}
})
</script>
2.自定义指令
2.1全局自定义指令
<div id="app">
用户名:<input type="text" v-focus>
<input type="text" v-focus="bgColor">
</div>
<script>
// 自定义指令 指令名称 options 配置对象
// 使输入框聚焦
Vue.directive('focus', {
inserted(el, bingding) {
el.focus();
},
// 执行一次性的初始化设置
bind(el, binding, vnode) {
el.style.backgroundColor = binding.value
}
})
new Vue({
el: "#app",
data: {
bgColor: 'red',
},
})
</script>
2.2局部自定义指令
<div id="app">
用户名:<input type="text" v-focus>
<input type="text" v-myshow="msg">
</div>
<script>
new Vue({
el: "#app",
data: {
msg: 'hello'
},
// 局部自定义组件
directives: {
// 指令名称:{配置对象}
'myshow': {
inserted(el) {
},
bind(el, binding, vnode) {
el.value = binding.value
}
}
}
})
</script>
3.render函数
render函数跟template一样都是创建html模板的,但是有些场景中使用template实现起来代码冗长繁琐而且有大量重复,render更接近于js编程。
<div id="app">
<my-a></my-a>
</div>
<script>
let myA = {
// render编译模板
// h- createElement创建节点
render(h) {
return h('div', {}, this.msg);
},
data() {
return {
msg: "我是一个div标签",
}
},
}
new Vue({
components: {
'my-a': myA
},
el: "#app",
data: {
},
methods: {}
})
</script>
<div id="app">
<my-a>列表</my-a>
</div>
<script>
let myA = {
// render编译模板
// h- createElement创建节点
render(h) {
let lis = this.arrs.map(item => {
return h('li', {}, item.name)
})
return h('ul', {}, [this.$slots.default, ...lis])
},
data() {
return {
arrs: [
{ id: 1, name: 'zhangsan', age: 12 },
{ id: 2, name: 'lisi', age: 13 },
{ id: 3, name: 'wangwu', age: 14 },
]
}
},
}
new Vue({
components: {
'my-a': myA
},
el: "#app",
data: {
},
methods: {}
})
</script>
4.过滤器
4.1全局注册
<script src="https://cdn.jsdelivr.net/npm/vue@2.7.10"></script>
<script src="https://cdn.bootcdn.net/ajax/libs/moment.js/2.29.4/moment.min.js"></script>
<div id="app">
<!-- 过滤器如何使用 | 过滤器 -->
{{time | fmtDate}}
<br>
{{time | fmtTime}}
<br>
{{msg | upper}}
</div>
<script>
// 全局注册过滤器 过滤器名称 过滤器格式处理函数
Vue.filter('fmtDate', function (val) {
// 将时间戳转换为年月日时分秒 momentjs库
return moment(val).format('YYYY-MM-DD HH:mm:ss')
});
Vue.filter('fmtTime', function (val) {
// 将时间戳转换为年月日 momentjs库
return moment(val).format('YYYY-MM-DD')
});
new Vue({
el: "#app",
data: {
time: new Date().getTime(),
msg: "hello"
},
methods: {}
})
</script>
4.2局部注册
<div id="app">
<!-- 过滤器如何使用 | 过滤器 -->
{{time | fmtData}}
<br>
{{msg | upper}}
</div>
<script>
new Vue({
filters: {
fmtData(val) {
return moment(val).format('MM-DD')
},
upper(val) {
return val.toUpperCase()
}
},
el: "#app",
data: {
time: new Date().getTime(),
msg: "hello"
},
methods: {}
})
</script>