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

Vue2篇——第五章 Vue.js 自定义指令与插槽核心

目录

一、自定义指令

二、自定义指令-指令的值

三、自定义指令-v-loading指令的封装

四、插槽-默认插槽

五、插槽-后备内容(默认值)

六、插槽-具名插槽

七、作用域插槽


本文介绍了Vue.js中的自定义指令和插槽功能。自定义指令部分详细讲解了指令的概念、注册语法(全局和局部)、配置项及实际应用场景(如v-focus、v-color指令)。插槽部分系统阐述了默认插槽、具名插槽和作用域插槽的使用方法,包括后备内容设置、多结构定制以及传递数据等特性。文章通过具体代码示例展示了如何封装v-loading指令和表格组件,并总结了两大功能的核心要点:自定义指令用于扩展DOM操作功能,插槽则实现组件结构的灵活定制。这些技术能有效提升开发效率和用户体验。

一、自定义指令

1.指令介绍

  • 内置指令:v-html、v-if、v-bind、v-on... 这都是Vue给咱们内置的一些指令,可以直接使用

  • 自定义指令:同时Vue也支持让开发者,自己注册一些指令。这些指令被称为自定义指令

    每个指令都有自己各自独立的功能

2.自定义指令

概念:自己定义的指令,可以封装一些DOM操作,扩展额外的功能

3.自定义指令语法

  • 全局注册

    //在main.js中
    Vue.directive('指令名', {"inserted" (el) {// 可以对 el 标签,扩展额外功能el.focus()}
    })

  • 局部注册

    //在Vue组件的配置项中
    directives: {"指令名": {inserted () {// 可以对 el 标签,扩展额外功能el.focus()}}
    }

  • 使用指令

    注意:在使用指令的时候,一定要先注册再使用,否则会报错使用指令语法: v-指令名。如:<input type="text" v-focus/>

    注册指令时不用v-前缀,但使用时一定要加v-前缀

4.指令中的配置项介绍

inserted:被绑定元素插入父节点时调用的钩子函数

el:使用指令的那个DOM元素

5.代码示例

需求:当页面加载时,让元素获取焦点(autofocus在safari浏览器有兼容性

App.vue

 <div><h1>自定义指令</h1><input v-focus ref="inp" type="text"></div>

6.总结

1.自定义指令的作用是什么?

自己定义的指令,可以封装一些DOM操作,扩展额外的功能

2.使用自定义指令的步骤是哪两步?

(1)使用全局注册或者局部注册

(2)使用指令语法: v-指令名

二、自定义指令-指令的值

1.需求

实现一个 color 指令 - 传入不同的颜色, 给标签设置文字颜色

2.语法

1.在绑定指令时,可以通过“等号”的形式为指令 绑定 具体的参数值

<div v-color="color">我是内容</div>

2.通过 binding.value 可以拿到指令值,指令值修改会 触发 update 函数

directives: {color: {inserted (el, binding) {el.style.color = binding.value},update (el, binding) {el.style.color = binding.value}}
}

3.代码示例

App.vue<template><div><!--显示红色--> <h2 v-color="color1">指令的值1测试</h2><!--显示蓝色--> <h2 v-color="color2">指令的值2测试</h2><button>改变第一个h1的颜色</button></div>
</template>
​
<script>
export default {data () {return {color1: 'red',color2: 'blue'}}
}
</script>
​
<style>
​
</style>

三、自定义指令-v-loading指令的封装

1.场景

实际开发过程中,发送请求需要时间,在请求的数据未回来时,页面会处于空白状态 => 用户体验不好

2.需求

封装一个 v-loading 指令,实现加载中的效果

3.分析

1.本质 loading效果就是一个蒙层,盖在了盒子上

2.数据请求中,开启loading状态,添加蒙层

3.数据请求完毕,关闭loading状态,移除蒙层

4.实现

1.准备一个 loading类,通过伪元素定位,设置宽高,实现蒙层

2.开启关闭 loading状态(添加移除蒙层),本质只需要添加移除类即可

3.结合自定义指令的语法进行封装复用

.loading:before {content: "";position: absolute;left: 0;top: 0;width: 100%;height: 100%;background: #fff url("./loading.gif") no-repeat center;
}

四、插槽-默认插槽

1.作用

让组件内部的一些 结构 支持 自定义

2.需求

将需要多次显示的对话框,封装成一个组件

3.问题

组件的内容部分,不希望写死,希望能使用的时候自定义。怎么办

4.插槽的基本语法

  1. 组件内需要定制的结构部分,改用<slot></slot>占位

  2. 使用组件时, <MyDialog></MyDialog>标签内部, 传入结构替换slot

  3. 给插槽传入内容时,可以传入纯文本、html标签、组件

5.代码示例

MyDialog.vue<template><div class="dialog"><div class="dialog-header"><h3>友情提示</h3><span class="close">✖️</span></div>
​<div class="dialog-content">您确定要进行删除操作吗?</div><div class="dialog-footer"><button>取消</button><button>确认</button></div></div>
</template>
​
<script>
export default {data () {return {
​}}
}
</script>
​
<style scoped>
* {margin: 0;padding: 0;
}
.dialog {width: 470px;height: 230px;padding: 0 25px;background-color: #ffffff;margin: 40px auto;border-radius: 5px;
}
.dialog-header {height: 70px;line-height: 70px;font-size: 20px;border-bottom: 1px solid #ccc;position: relative;
}
.dialog-header .close {position: absolute;right: 0px;top: 0px;cursor: pointer;
}
.dialog-content {height: 80px;font-size: 18px;padding: 15px 0;
}
.dialog-footer {display: flex;justify-content: flex-end;
}
.dialog-footer button {width: 65px;height: 35px;background-color: #ffffff;border: 1px solid #e1e3e9;cursor: pointer;outline: none;margin-left: 10px;border-radius: 3px;
}
.dialog-footer button:last-child {background-color: #007acc;color: #fff;
}
</style>
App.vue<template><div><MyDialog></MyDialog></div>
</template>
​
<script>
import MyDialog from './components/MyDialog.vue'
export default {data () {return {
​}},components: {MyDialog}
}
</script>
​
<style>
body {background-color: #b3b3b3;
}
</style>

6.总结

场景:组件内某一部分结构不确定,想要自定义怎么办?

​                 用插槽slot占位封装

使用:插槽的步骤分为哪几步?

​         1.先在组件内使用slot占位

        ​ 2.使用组件时,传入具体标签内容插入

五、插槽-后备内容(默认值)

1.问题

通过插槽完成了内容的定制,传什么显示什么, 但是如果不传,则是空白

能否给插槽设置 默认显示内容 呢?

2.插槽的后备内容

封装组件时,可以为预留的 <slot> 插槽提供后备内容(默认内容)。

3.语法

在 <slot> 标签内,放置内容, 作为默认显示内容

4.效果

  • 外部使用组件时,不传东西,则slot会显示后备内容

  • 外部使用组件时,传东西了,则slot整体会被换掉

5.代码示例

App.vue<template><div><MyDialog></MyDialog><MyDialog>你确认要退出么</MyDialog></div>
</template>
​
<script>
import MyDialog from './components/MyDialog.vue'
export default {data () {return {
​}},components: {MyDialog}
}
</script>
​
<style>
body {background-color: #b3b3b3;
}
</style>

六、插槽-具名插槽

1.需求

一个组件内有多处结构,需要外部传入标签,进行定制

上面的弹框中有三处不同,但是默认插槽只能定制一个位置,这时候怎么办呢?

2.具名插槽语法

  • 多个slot使用name属性区分名字

  • template配合v-slot:名字来分发对应标签

3.v-slot的简写

v-slot写起来太长,vue给我们提供一个简单写法 v-slot —> #

4.总结

  • 组件内 有多处不确定的结构 怎么办?

    使用具名插槽

  • 具名插槽的语法是什么?

    ​ 1.slot占位,给name属性起名字来区分

    ​ 2.template配合v-slot:插槽名分发内容

  • v-slot:插槽名可以简化成什么?

    #:插槽名

七、作用域插槽

1.插槽分类

  • 默认插槽(组件内定制一处结构)

  • 具名插槽

    插槽只有两种,作用域插槽不属于插槽的一种分类

2.作用

定义slot 插槽的同时, 是可以传值的。给 插槽 上可以 绑定数据,将来 使用组件时可以用

3.场景

封装表格组件

4.使用步骤

  1. 给 slot 标签, 以 添加属性的方式传值

    <slot :id="item.id" msg="测试文本"></slot>

  2. 所有添加的属性, 都会被收集到一个对象中

    { id: 3, msg: '测试文本' }

  3. 在template中, 通过 #插槽名= "obj" 接收,默认插槽名为 default

    <MyTable :list="list"><template #default="obj"><button @click="del(obj.id)">删除</button></template>
    </MyTable>

5.代码示例

MyTable.vue<template><table class="my-table"><thead><tr><th>序号</th><th>姓名</th><th>年纪</th><th>操作</th></tr></thead><tbody><tr><td>1</td><td>赵小云</td><td>19</td><td><button>查看    </button></td></tr><tr><td>1</td><td>张小花</td><td>19</td><td><button>查看    </button></td></tr><tr><td>1</td><td>孙大明</td><td>19</td><td><button>查看    </button></td></tr></tbody></table>
</template>
​
<script>
export default {props: {data: Array}
}
</script>
​
<style scoped>
.my-table {width: 450px;text-align: center;border: 1px solid #ccc;font-size: 24px;margin: 30px auto;
}
.my-table thead {background-color: #1f74ff;color: #fff;
}
.my-table thead th {font-weight: normal;
}
.my-table thead tr {line-height: 40px;
}
.my-table th,
.my-table td {border-bottom: 1px solid #ccc;border-right: 1px solid #ccc;
}
.my-table td:last-child {border-right: none;
}
.my-table tr:last-child td {border-bottom: none;
}
.my-table button {width: 65px;height: 35px;font-size: 18px;border: 1px solid #ccc;outline: none;border-radius: 3px;cursor: pointer;background-color: #ffffff;margin-left: 5px;
}
</style>
App.vue<template><div><MyTable :data="list"></MyTable><MyTable :data="list2"></MyTable></div>
</template>
​
<script>import MyTable from './components/MyTable.vue'export default {data () {return {list: [{ id: 1, name: '张小花', age: 18 },{ id: 2, name: '孙大明', age: 19 },{ id: 3, name: '刘德忠', age: 17 },],list2: [{ id: 1, name: '赵小云', age: 18 },{ id: 2, name: '刘蓓蓓', age: 19 },{ id: 3, name: '姜肖泰', age: 17 },]}},components: {MyTable}}
</script>

6.总结

1.作用域插槽的作用是什么?

​ 可以给插槽上绑定数据,供将来使用组件时使用

2.作用域插槽的使用步骤是什么?

​ (1)给slot标签,以标签属性的方式传值

​ (2)所有属性都会被收集到一个对象中

​ (3)template中,通过`插槽名="obj"来接收

http://www.dtcms.com/a/337536.html

相关文章:

  • 【序列晋升】:9 Service Mesh微服务通信的基础设施革命
  • 电子元器件-电容终篇:基本原理、参数解读、电路作用、分类及区别、应用场景、选型、降频及实战案例
  • Linux 系统~存储高级技术
  • C++ 中的 delete 与 default 关键字详解
  • diffusion model(1.4) 相关论文阅读清单
  • 遥感数字图像处理教程——第三章课后习题
  • flutter项目适配鸿蒙
  • 人工智能 | 基于大数据的皮肤病症状数据可视化分析系统(matlab源码)
  • Java设计模式-桥接模式
  • Alibaba Cloud Linux 3 在 Apple M 芯片 Mac 的 VMware Fusion 上部署的完整密码重置教程(二)
  • API 接口在电商中的重要应用​||关于API接口接入
  • 构建者设计模式 Builder
  • python学习DAY45打卡
  • 【运维实战】系统全链路监测方案~架构到实践
  • 【HTML】document api
  • 【每天学点‘音视频’】前向纠错 和 漏包重传
  • 图像分类精度评价的方法——误差矩阵、总体精度、用户精度、生产者精度、Kappa 系数
  • 在 PyCharm Notebook 中安装 YOLO
  • Google 的 Opal:重新定义自动化的 AI 平台
  • 【项目】分布式Json-RPC框架 - 项目介绍与前置知识准备
  • ARM架构下的cache transient allocation hint以及SMMUv2的TRANSIENTCFG配置详解
  • kafka 冲突解决 kafka安装
  • 如何解决pip安装报错ModuleNotFoundError: No module named ‘pygame’问题
  • 数据赋能(401)——大数据——持续学习与优化原则
  • 删除并获得点数
  • 线程间通信(互斥锁,死锁,信号量)
  • 148-基于Python的2024物流年度销售收入数据可视化分析系统
  • PYTHON让繁琐的工作自动化-函数
  • 功能测试相关问题
  • 使用空模型实例调用辅助函数,确定在量化过程中哪些层会被跳过(43)