Vue ⑤-自定义指令 || 插槽

在这里插入图片描述

自定义指令

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

全局注册

语法:

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

局部注册

语法:

directives: {"指令名": {inserted () {// 可以对 el 标签,扩展额外功能el.focus()}}
}

需求: 当页面加载时,让元素将获得焦点

<template><div><h1>自定义指令</h1><input v-focus ref="inp" type="text"></div>
</template><script>
export default {// mounted () {//   this.$refs.inp.focus()// }// 2.局部注册指令directives: {// 指令名:指令的配置项focus: {inserted (el) {el.focus()}}}
}
</script><style>
</style>

或者全局注册

main.js

import Vue from 'vue'
import App from './App.vue'Vue.config.productionTip = false// 1.全局注册指令
Vue.directive('focus', {// inserted会在指令所在的元素,被插入到页面中时触发inserted (el) {// el就是指令所绑定的元素el.focus()}
})new Vue({render: h => h(App),
}).$mount('#app')

指令的值

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

<template><div><h1 v-color="color1">指令的值1测试</h1><h1 v-color="color2">指令的值2测试</h1></div>
</template><script>
export default {data () {return {color1: 'purple',color2: 'red'}},directives: {color: {// inserted提供的时元素被添加到页面中时的逻辑inserted (el, binding) {el.style.color = binding.value},// update提供的是指令的值修改的时候触发update (el, binding) {el.style.color = binding.value}}}
}
</script><style>
</style>

v-loading 指令封装

需求:实现一个 v-loading 指令,可以给元素添加一个 loading 效果

<template><div class="main"><div class="box" v-loading="isLoading"><ul><li v-for="item in list" :key="item.id" class="news"><div class="left"><div class="title">{{ item.title }}</div><div class="info"><span>{{ item.source }}</span><span>{{ item.time }}</span></div></div><div class="right"><img :src="item.img" alt=""></div></li></ul></div></div>
</template><script>
// 安装 axios =>  yarn add axios
import axios from 'axios'// 接口地址:http://hmajax.itheima.net/api/news
// 请求方式:get
export default {data () {return {list: [],isLoading: true}},async created () {// 1. 发送请求获取数据const res = await axios.get('http://hmajax.itheima.net/api/news')setTimeout(() => {// 2. 更新到 list 中this.list = res.data.datathis.isLoading = false}, 2000)},directives: {loading: {inserted (el, binding) {binding.value ? el.classList.add('loading') : el.classList.remove('loading')},update (el, binding) {binding.value ? el.classList.add('loading') : el.classList.remove('loading')}}}
}
</script><style>
</style>
  • inserted 钩子中,binding.value 判断指令的值,设置默认状态
  • update 钩子中,binding.value 判断指令的值,更新类名状态

插槽

默认插槽

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

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

问题:组件的内容部分,不希望写死,希望能使用的时候自定义。怎么办?
在这里插入图片描述

插槽基本语法:

  • 组件内需要定制的结构部分,改用 <slot></slot> 占位
  • 使用组件时,<MyDialog></MyDialog> 标签内部, 传入结构替换 slot

App.vue

<template><div><!-- 在使用组件时,组件标签内插入内容 --><MyDialog>你确认要删除吗<div>你确认要删除吗</div></MyDialog><MyDialog>你确认要退出吗<p>你确认要退出吗</p></MyDialog></div>
</template>

MyDialog.vue

<template><div class="dialog"><div class="dialog-header"><h3>友情提示</h3><span class="close">✖️</span></div><div class="dialog-content"><!-- 在需要定制的地方插入的内容 --><slot></slot></div><div class="dialog-footer"><button>取消</button><button>确认</button></div></div>
</template>

后备插槽

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

能否给插槽设置 默认显示内容 呢?
在这里插入图片描述

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

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

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

<MyDialog></MyDialog>

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

<MyDialog>你确认要删除吗</MyDialog>

MyDialog.vue

<template><div class="dialog"><!-- 默认值 --><slot>我是后背内容</slot></div>
</template>

具名插槽

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

默认插槽:一个的定制位置
在这里插入图片描述

具名插槽语法:

  • 多个slot使用name属性区分名字:
<div class="dialog"><div class="dialog-header"><!-- 一旦插槽取了名字,就是具名插槽,只会定向分发 --><slot name="head"></slot></div><div class="dialog-content"><slot name="content"></slot></div><div class="dialog-footer"><slot name="footer"></slot></div>
</div>
  • template 配合 v-slot:名字来分发对应标签
  • v-slot:插槽名 可以简化成 #插槽名
<MyDialog><!-- 需要通过 template标签,包裹成一个整体 --><template v-slot:head><div>我是大标题</div></template><template v-slot:content>我是内容</template><template #footer><button>确认</button><button>取消</button></template>
</MyDialog>

作用域插槽

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

场景:封装表格组件

  1. 父传子,动态渲染表格内容
  2. 利用默认插槽,定制操作列
  3. 删除或查看都需要用到 当前项的 id,属于 组件内部的数据 通过 作用域插槽 传值绑定,进而使用
    在这里插入图片描述

基本使用步骤:

  1. 给 slot 标签, 以 添加属性的方式传值
<slot :id="item.id" msg="测试文本"></slot>
  1. 所有添加的属性, 都会被收集到一个对象中
{ id: 3, msg: '测试文本' }

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

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

App.vue

<template><div><MyTable :data="list"><!-- 通过 template #插槽名="变量名" 接受传过来的数据 --><template #default="obj"><button @click="del(obj.item.id)">删除</button></template></MyTable><MyTable :data="list2"><!-- 对象解构 --><template #default="{ item }"><button @click="view(item)">查看</button></template></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},methods: {del (id) {this.list = this.list.filter(item => item.id != id)},view (item) {console.log(item)alert(`姓名:${item.name}; 年龄:${item.age};`)}}
}
</script>

MyTable.vue

<template><table class="my-table"><thead><tr><th>序号</th><th>姓名</th><th>年纪</th><th>操作</th></tr></thead><tbody><tr v-for="(item, index) in data" :key="item.id"><td>{{ index + 1}}</td><td>{{ item.name }}</td><td>{{ item.age }}</td><td><!-- 给 slot标签,添加属性的方式传值 --><slot :item="item" msg="test"><!-- 会将所有的属性添加到一个对象中 --></slot></td></tr></tbody></table>
</template><script>
export default {props: {data: Array,},
}
</script><style scoped>
</style>
tem, index) in data" :key="item.id"><td>{{ index + 1}}</td><td>{{ item.name }}</td><td>{{ item.age }}</td><td><!-- 给 slot标签,添加属性的方式传值 --><slot :item="item" msg="test"><!-- 会将所有的属性添加到一个对象中 --></slot></td></tr></tbody></table>
</template><script>
export default {props: {data: Array,},
}
</script><style scoped>
</style>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/pingmian/84154.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java HttpClient实现简单网络爬虫

今天我将使用Java的HttpClient&#xff08;在Java 11及以上版本中内置&#xff09;来编写一个入门级的网络爬虫示例。 这个示例将演示如何发送HTTP GET请求&#xff0c;获取响应内容&#xff0c;并处理可能出现的异常。 以下是一个基于Java HttpClient&#xff08;Java 11&…

图表类系列各种样式PPT模版分享

图标图表系列PPT模版&#xff0c;柱状图PPT模版&#xff0c;线状图PPT模版&#xff0c;折线图PPT模版&#xff0c;饼状图PPT模版&#xff0c;雷达图PPT模版&#xff0c;树状图PPT模版 图表类系列各种样式PPT模版分享&#xff1a;图表系列PPT模板https://pan.quark.cn/s/20d40aa…

Sonic EVM L1:沉睡的雄狮已苏醒

Sonic 链 , 是 Fantom 基金会升级后的Layer-1区块链&#xff0c;继承了 Fantom Opera 的高性能特性&#xff0c;并通过全面技术优化成为EVM兼容的高吞吐量公链。 官方网站 : https://www.soniclabs.com 一、Sonic 链概述 1. 为什么从 Fantom 更名为 Sonic Sonic 链是 Fant…

篮球杯软件赛国赛C/C++ 大学 B 组补题

3.gcd 模拟 map<pair<int,int>,int>m; void solve(){int n;cin>>n;forr(i,1,n){int ux,uy,vx,vy;cin>>ux>>uy>>vx>>vy;int dxvx-ux,dyvy-uy;if(dx!0&&dy!0){int gabs(__gcd(dx,dy));dx/g,dy/g;//dxdy中除去公共部分(gcd) 就…

技术栈RabbitMq的介绍和使用

目录 1. 什么是消息队列&#xff1f;2. 消息队列的优点3. RabbitMQ 消息队列概述4. RabbitMQ 安装5. Exchange 四种类型5.1 direct 精准匹配5.2 fanout 广播5.3 topic 正则匹配 6. RabbitMQ 队列模式6.1 简单队列模式6.2 工作队列模式6.3 发布/订阅模式6.4 路由模式6.5 主题模式…

项目部署到Linux上时遇到的错误(Redis,MySQL,无法正确连接,地址占用问题)

Redis无法正确连接 在运行jar包时出现了这样的错误 查询得知问题核心在于Redis连接失败&#xff0c;具体原因是客户端发送了密码认证请求&#xff0c;但Redis服务器未设置密码 1.为Redis设置密码&#xff08;匹配客户端配置&#xff09; 步骤&#xff1a; 1&#xff09;.修…

Linux边缘智能:物联网的终极进化

Linux边缘智能&#xff1a;物联网的终极进化 从数据中心到万物终端的智能革命 引言&#xff1a;边缘计算的范式转变 随着物联网设备的爆炸式增长&#xff0c;传统的云计算架构已无法满足实时性、隐私保护和带宽效率的需求。边缘智能应运而生&#xff0c;将计算能力从云端下沉到…

Linux Shell 中的 dash 符号 “-”

Shell中的-&#xff1a;小符号的大智慧 在Unix/Linux系统中&#xff0c;-符号是一个约定俗成的特殊标记&#xff0c;它表示命令应该使用标准输入或标准输出而非文件。这个看似简单的短横线&#xff0c;完美诠释了Unix"一切皆文件"的设计哲学。 作为标准输入/输出的…

JMeter 实现 MQTT 协议压力测试 !

想象一下&#xff0c;你的智能家居系统连接了上千个设备&#xff0c;传感器数据通过 MQTT 协议飞速传输&#xff0c;但突然服务器崩溃&#xff0c;灯光、空调全失控&#xff01;如何确保你的 MQTT 经纪人能承受高负载&#xff1f;答案是 JMeter&#xff01;通过安装 MQTT 插件&…

CKA考试知识点分享(6)---PriorityClass

CKA 版本&#xff1a;1.32 第六套题是涉及PriorityClass相关。 注意&#xff1a;本文不是题目&#xff0c;只是为了学习相关知识点做的实验。仅供参考 实验目的 创建一套PriorityClass &#xff0c;验证PriorityClass的运作策略。 1 环境准备 创建2个pc&#xff0c;一个为高…

暴力破解篇补充-字典

在皮卡丘靶场的第二期&#xff0c;暴力破解模块中&#xff0c;我相信大家短暂的接触了字典这个概念&#xff0c;字典事实上就是包含了大量弱口令的txt文本文件 所以这篇文章用于分享一些字典&#xff1a;https://wwhc.lanzoue.com/ihdl12ybhbhi&#xff08;弱口令字典&#xff…

关于VS2022中C++导入第三方库的方式

首先&#xff0c;新建一个Cpp项目(控制台项目即可&#xff0c;其他项目也无所谓)&#xff0c;右键点击项目名称(Test1)选择属性或者在VS2022工具栏选择调试标签->属性按钮打开属性页。 注意点: 在开始其他操作前请注意先进行 配置和平台选项框的选择。配置选框选定了是配置…

C++中vector类型的介绍和使用

文章目录 一、vector 类型的简介1.1 基本介绍1.2 常见用法示例1.3 常见成员函数简表 二、vector 数据的插入2.1 push_back() —— 在尾部插入一个元素2.2 emplace_back() —— 在尾部“就地”构造对象2.3 insert() —— 在任意位置插入一个或多个元素2.4 emplace() —— 在任意…

在Vue或React项目中使用Tailwind CSS实现暗黑模式切换:从系统适配到手动控制

在现代Web开发中&#xff0c;暗黑模式(Dark Mode)已成为提升用户体验的重要功能。本文将带你使用Tailwind CSS在React项目(Vue项目类似)中实现两种暗黑模式控制方式&#xff1a; 系统自动适配 - 根据用户设备偏好自动切换手动切换 - 通过按钮让用户自由选择 一、项目准备 使…

Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信

文章目录 Linux C语言网络编程详细入门教程&#xff1a;如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket&#xff08;服务端和客户端都要&#xff09;2. 绑定本地地址和端口&#x…

Tomcat 安装和配置

一、Tomcat官网 Apache Tomcat - Welcome! 选择解压到任意一个盘&#xff01;&#xff01; 二、Tomcat配置 1&#xff09;在系统变量处新建一个变量CATALINA_HOME。CATALINA_HOME环境变量的值&#xff0c;设置为Tomcat的解压安装目录 2&#xff09;找到系统变量Path&#xff0…

动态规划 熟悉30题 ---上

本来是要写那个二维动态规划嘛&#xff0c;但是我今天在问题时候&#xff0c;一个大佬就把他初一时候教练让他练dp的30题发出来了&#xff08;初一&#xff0c;啊虽然知道计算机这一专业&#xff0c;很多人从小就学了&#xff0c;但是我每次看到一些大佬从小学还是会很羡慕吧或…

基于stm32F10x 系列微控制器的智能电子琴(附完整项目源码、详细接线及讲解视频)

注&#xff1a;成品使用演示、项目源码、项目文档在文章末尾网盘链接中自取 所用硬件&#xff1a;STM32F103C8T6、无源蜂鸣器、44矩阵键盘、flash存储模块、OLED显示屏、RGB三色灯、面包板、杜邦线、usb转ttl串口 stm32f103c8t6 面包板 …

时间同步技术在电力系统中的应用

随着电力自动化技术的发展&#xff0c;时间同步不仅可以为电力系统的事后故障分析提供支持&#xff0c;而且已经参与到电力系统的实时控制中来&#xff0c;其可靠性对电力系统的稳定运行影响越来越大。在电力系统中&#xff0c;时间同步技术广泛应用于调度控制中心、发电厂、变…

XMLGregorianCalendar跟Date、localDateTime以及String有什么区别

1. java.util.Date&#xff08;已过时&#xff0c;不推荐新代码使用&#xff09; 特点 表示时间戳&#xff1a;存储自 1970-01-01 00:00:00 UTC&#xff08;Unix 纪元&#xff09; 以来的毫秒数。 问题&#xff1a; 不区分日期和时间&#xff0c;也没有时区支持&#xff08;依…