目录
自定义指令
基本语法 (全局&局部注册)
指令的值
练习:v-loading 指令封装
总结:
插槽(slot)
默认插槽
插槽 - 后备内容(默认值)
具名插槽
具名插槽基本语法:
具名插槽简化语法:
作用域插槽
综合案例:商品列表
自定义指令:自己定义的指令, 可以封装一些 dom 操作, 扩展额外功能
全局注册 :
Vue.directive('focus',{
"inserted" (el) {
el.focus()
}
})
局部注册:
// 局部的自定义属性
directives: {
//定义一个局部的focus指令
"focus" :{
inserted (el) {
el.focus()
}
},
//定义一个局部的color指令,且内容值修改时也会发生变化
"color" :{
inserted (el,bingding) {
console.log(bingding.value);
el.style.color = bingding.value
},
update(el,bingding){
// console.log(bingding.value);
el.style.color = bingding.value
}
}
}
需求:实现一个 color 指令 - 传入不同的颜色, 给标签设置文字颜色
场景:实际开发过程中,发送请求需要时间,在请求的数据未回来时,页面会处于空白状态 => 用户体验不好
需求:封装一个 v-loading 指令,实现加载中的效果
分析:
1. 本质 loading 效果就是一个蒙层,盖在了盒子上
2. 数据请求中,开启loading状态,添加蒙层
3. 数据请求完毕,关闭loading状态,移除蒙层
实现:
1. 准备一个 loading 类,通过伪元素定位,设置宽高,实现蒙层
2. 开启关闭 loading 状态(添加移除蒙层),本质只需要添加移除类即可
3. 结合自定义指令的语法进行封装复用
自定义指令的作用?
封装一些 dom 操作,扩展额外功能,例如获取焦点
自定义指令的使用步骤?
1. 注册 (全局注册 或 局部注册)
在 inserted 钩子函数中,配置指令dom逻辑
2. 标签上 v-指令名 使用
指令值的语法:
① v-指令名 = "指令值",通过 等号 可以绑定指令的值
② 通过 binding.value 可以拿到指令的值
③ 通过 update 钩子,可以监听指令值的变化,进行dom更新操作
作用:让组件内部的一些 结构 支持 自定义
需求: 将需要多次显示的对话框, 封装成一个组件
问题:组件的内容部分,不希望写死,希望能使用的时候自定义。怎么办?
插槽基本语法:
1. 组件内需要定制的结构部分,改用
2. 使用组件时,
通过插槽完成了内容的定制,传什么显示什么, 但是如果不传,则是空白
能否给插槽设置 默认显示内容 呢?
插槽后备内容:封装组件时,可以为预留的 `
需求:一个组件内有多处结构,需要外部传入标签,进行定制
默认插槽:一个的定制位置
作用域插槽: 定义 slot 插槽的同时, 是可以传值的。给 插槽 上可以 绑定数据,将来 使用组
场景:封装表格组件
1. 父传子,动态渲染表格内容
2. 利用默认插槽,定制操作列
3. 删除或查看都需要用到 当前项的 id,属于 组件内部的数据
通过 作用域插槽 传值绑定,进而使用
基本使用步骤:
1. 给 slot 标签, 以 添加属性的方式
2. 所有添加的属性, 都会被收集到一个对象中
3. 在template中, 通过 ` #插槽名= "obj" ` 接收,默认插槽名为 default
需求说明:
1. my-tag 标签组件封装
(1) 双击显示输入框,输入框获取焦点
(2) 失去焦点,隐藏输入框
(3) 回显标签信息
(4) 内容修改,回车 → 修改标签信息
2. my-table 表格组件封装
(1) 动态传递表格数据渲染
(2) 表头支持用户自定义
(3) 主体支持用户自定义
MyTable
MyTag
{{value}}
App.vue
编号
图片
名称
标签
{{index+1}}
{{item.name}}