【Vue】自定义指令、插槽

目录

自定义指令

是什么

作用

使用方法

定义

使用 

自定义指令配合绑定数据

语法

自定义指令的简写

语法

使用时机

插槽

什么是插槽

默认(匿名)插槽

​编辑插槽的默认值

具名插槽

使用方法

简写

使用示例 

作用域插槽


自定义指令

是什么

  • 内置指令:是vue3自带的,比如:v-model、v-for、v-if....我们可以直接使用。
  • 自定义指令:相对内置指令而言,我们自己编写的指令,当内置指令无法满足需求的时候,就可以自己编写的指令。

作用

封装一段公共的DOM操作的代码。

与ref属性操作DOM的区别:

  1. ref是作用在单个标签上的,代码无法复用
  2. 自定义指令可以把一段公共的DOM操作代码封装起来,进行复用

使用方法

定义

main.js -> app.directive('指令名',{

        mounted(el){

                //el就是指令所在的DOM元素

        }

})

示例:在main.js文件中

const app=createApp(App)

app.directive('jujiao',{
    mounted(el){
        el.focus()
    }
})

app.mount('#app')

使用 

<XXX v-指令名>

<template>
    <input type="text" v-jujiao/>
</template>

自定义指令配合绑定数据

语法

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

<template>
    <div v-color="colorStr">
        Hello World
    </div>
</template>

<script setup>
    import { ref } from 'vue'

    const colorStr = ref('blue')
</script>

2、通过binding.value可以拿到指令值,指令值修改会触发updated钩子

app.directive('color',{
     //mouted钩子只负责初次渲染,后续指令所在表达式的值变了,该函数不会执行,因此需要引入updated钩子
    mounted(el,binding){
        //el就是指令所在的DOM元素
        //binding:指令绑定的信息对象,通过binding.value获取表达式结果
        el.style.color=binding.value
    },
    updated(el,binding){
        el.style.color=binding.value
    }
})

自定义指令的简写

将上面提到指令的mounted()和updated()两个钩子进行合写,用一个函数来代替,并且这个函数会在mounted()和updated()时机都会执行。

语法

app.directive('color',(el,binding)=>{
    el.style.color=binding.value
})

使用时机

  1. 当自定义指令绑定数据,那么就可以简写(简写的本质=mounted()+updated())
  2. 当自定义指令没有绑定数据,那么就采用非简写的方式。

插槽

什么是插槽

        本质就是一个占位符,今后可以给这个占位符传入想要的组件结构,从而大大提高组件的灵活性和可复用性。

默认(匿名)插槽

作用

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

语法

  1. 在使用组件的时候,把组件写成双标签
  2. 在双标签之间传入想展示的结构,从而替换占位的slot组件

子组件

<script setup></script>
<template>
	<div class="dialog">
		<div class="dialog-header">
			<h3>友情提示</h3>
			<span class="close">✖️</span>
		</div>
		<div class="dialog-content">
			<!-- 1. 在组件内标签不确定位置用 slot 组件 -->
			<slot></slot>
		</div>
		<div class="dialog-footer">
			<button>取消</button>
			<button>确认</button>
		</div>
	</div>
</template>

<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>
    <!-- 在使用组件的时候,给组件传入想展示的结构,从而替换掉组件内的slot组件 -->
    <MyDialog>
        <span>你确定要进行删除操作吗?</span>
    </MyDialog>
    <MyDialog>
        <span>你确定要退出本系统吗?</span>
    </MyDialog>
</template>

<script setup>
    import MyDialog from './components/MyDialog.vue';
</script>

插槽的默认值

如果未传入内容,则显示slot标签内的内容 

<slot> 我是默认内容 </slot>

默认值的生效规则:

  1. 如果没传,就显示默认值,防止页面空白
  2. 如果传入了,就会用传入的,替换掉占位的slot,从而展示实际传入的标签结构

具名插槽

一个组件内有多处结构,需要外部传入标签,进行定制,默认插槽只能定制一处内容。这是给插槽添加name属性,进行区分,添加name属性的插槽就是具名插槽。

使用方法

<slot name="插槽名"> 默认的内容</slot>

<template v-slot:插槽名> 要展示的内容</template> 

简写

<template #插槽名> 要展示的内容</template>

使用示例 

根组件

<template>
    <!-- 在使用组件的时候,给组件传入想展示的结构,从而替换掉组件内的slot组件 -->
    <MyDialog>
        <template v-slot:title>
            <span>删除确认</span>
        </template>
        <template v-slot:content>
            <span>你确定要进行删除操作吗?</span>
        </template>
    </MyDialog>
    
</template>

<script setup>
    import MyDialog from './components/MyDialog.vue';
</script>

子组件(插槽) 

<script setup></script>
<template>
	<div class="dialog">
		<div class="dialog-header">
			<slot name="title"></slot>
			<span class="close">✖️</span>
		</div>
		<div class="dialog-content">
			<!-- 1. 在组件内标签不确定位置用 slot 组件 -->
			<slot name="content"></slot>
		</div>
		<div class="dialog-footer">
			<button>取消</button>
			<button>确认</button>
		</div>
	</div>
</template>

<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>

作用域插槽

带数据的插槽,用slot占位的同时,还可以给slot绑定数据,也就是说数据来源于插槽,但是怎么展示这些数据由自定义结构决定。

接收插槽数据

这里的obj就代表对应slot标签绑定的所有数据的对象

<template v-slot:content="obj">
    <span>obj.a={{ obj.a }}</span>
</template>

上面是使用一个对象进行接收,我们也可以对接收的数据进行解构,直接获取指定的数据,如下:

<template v-slot:content="{a}">
    <span> a={{ a }}</span>
</template>

slot绑定数据

<div class="dialog-content">
	<slot name="content" a="123" b="456"></slot>
</div>

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

顺序队列的实现及其应用

一、概念 队列是允许在两端&#xff08;队头、队尾&#xff09;进行插入和读出操作的线性表 默认情况下&#xff0c;队尾插入&#xff0c;队头读出&#xff08;这一点和排队很像&#xff09;&#xff0c;先进先出FIFO 队中没有元素时称为空队 当队列两端都允许插入、读出时&…

Web安全深度剖析

1.Web安全简介 ​ 攻击者想要对计算机进行渗透&#xff0c;有一个条件是必须的&#xff0c;就是攻击者的计算机与服务器必须能够正常通信&#xff0c;服务器与客户端进行通信依靠的就是端口。 ​ 如今的web应该称之为web应用程序&#xff0c;功能强大&#xff0c;离不开四个要…

C# 探险之旅:第九节 - 循环(for):无限循环的魔法轮盘!

嘿&#xff0c;勇敢的探险家们&#xff0c;欢迎回到C#的神秘世界&#xff01;在这一节里&#xff0c;我们将踏上一场关于循环的奇妙冒险&#xff0c;特别是那个能带我们无限次探险的“for循环”&#xff01;准备好了吗&#xff1f;让我们一起揭开for循环的神秘面纱&#xff0c;…

解决Logitech G hub 无法进入一直转圈的方案(2024.12)

如果你不是最新版本无法加载尝试以下方案&#xff1a;删除AppData 文件夹下的logihub文件夹 具体路径&#xff1a;用户名根据实际你的请情况修改 C:\Users\Administrator\AppData\Local 如果你有通过lua编译脚本&#xff0c;记得备份&#xff01;&#xff01; ↓如果你是最新…

如何使用 Docker Compose 创建 LAMP 环境 ?

现如今&#xff0c;通过 Docker 容器化部署环境已经逐渐成为主流&#xff0c;特别是在部署像 LAMP (Linux、Apache、MySQL、PHP) 这样的复杂环境时。本教程旨在带您完成使用 Docker-Compose 建立 LAMP 环境的整个过程&#xff0c;同时还包括定制 PHP 环境的步骤&#xff0c;安装…

12.1【JAVA EXP4】next项目

next项目构建问题 详解一下这个页面 什么是Node选项&#xff1f; Node选项是指在运行Node.js应用程序时可以传递给Node.js进程的一系列命令行参数。这些选项可以让开发者控制Node.js的行为&#xff0c;例如设置内存限制、启用或禁用某些功能、指定调试端口等 --inspect 和 --i…

PyTorch3D 可视化

PyTorch3D是非常好用的3D工具库。但是PyTorch3D对于可用于debug&#xff08;例如调整cameras参数&#xff09;的可视化工具并没有进行系统的介绍。这篇文章主要是想介绍我觉得非常使用的PyTorch3D可视化工具。 1. 新建一个Mesh 从hugging face上下载一个glb文件&#xff0c;例…

内网穿透讲解

什么是内网穿透 内网穿透是一种网络技术&#xff0c;它允许外网或者其他局域网的用户来访问这个局域网的服务器资源&#xff0c;让资源的利用率更高&#xff0c;更加灵活&#xff0c;但是也要确保网络安全。 工作原理 如果你在公司&#xff0c;但是你需要使用到你家里的那台电…

Python中PyTorch详解

文章目录 Python中PyTorch详解一、引言二、PyTorch核心概念1、张量&#xff08;Tensor&#xff09;1.1、创建张量1.2、张量操作 2、自动求导&#xff08;Autograd&#xff09;2.1、自动求导示例 三、构建神经网络1、使用nn模块2、优化器&#xff08;Optimizer&#xff09; 四、…

Linux之网络配置

一、检查虚拟机和本机通不通 测试虚拟机和本机是否通不通 winR&#xff0c;运行本机cmd&#xff0c;输入ipconfig&#xff0c;拿到本机ip地址 在虚拟机上ping一下这个地址(ctrlshitv)可以把复制的文本粘贴进虚拟机。 可以看到&#xff0c;不通&#xff0c;解决方法在最后&am…

细说Flash存储芯片W25Q128FW和W25Q16BV

目录 一、Flash存储芯片W25Q128FW 1、W25Q128硬件接口和连接 2、存储空间划分 3、数据读写的原则 4、操作指令 &#xff08;1&#xff09;“写使能”指令 &#xff08;2&#xff09;“读数据”指令 &#xff08;3&#xff09;“写数据”指令 5、状态寄存器SR1 二、Fl…

33.攻防世界upload1

进入场景 看看让上传什么类型的文件 传个木马 把txt后缀改为png 在bp里把png改为php 上传成功 用蚁剑连接 在里面找flag 得到

鸿蒙元服务上架

鸿蒙元服务上架 一、将代码打包成 .app 文件1. 基本需求2. 生成密钥和证书请求文件3. 申请发布证书4. 申请发布Profile5. 配置签名信息6. 更新公钥指纹7. 打包项目成 .app 文件 二、发布元服务1. 进入应用信息页面2. 上传软件包3. 配置隐私协议4. 配置版本信息5. 提交审核&…

ansible自动化运维(二)playbook模式详解

相关文章ansible自动化运维&#xff08;一&#xff09;简介及清单,模块-CSDN博客ansible自动化运维&#xff08;三&#xff09;jinja2模板&&roles角色管理-CSDN博客ansible自动化运维&#xff08;四&#xff09;运维实战-CSDN博客 一.Ansible中的playbook模式 Playbo…

图像分割数据集海洋水体船只分割数据集labelme格式6123张3类别

数据集格式&#xff1a;labelme格式(不包含mask文件&#xff0c;仅仅包含jpg图片和对应的json文件) 图片数量(jpg文件个数)&#xff1a;6123 标注数量(json文件个数)&#xff1a;6123 标注类别数&#xff1a;3 标注类别名称:["water","sea_obstacle",&…

python爬虫知识

文章目录 安装requests安装BeautifulSoup4text函数 数据存储Excel操作操作Excel依赖安装 CSV文件操作 安装requests pip install requests安装BeautifulSoup4 pip install BeautifulSoup4示例&#xff1a; res requests.get(url,headersheaders)if res.status_code 200:bs…

Comparator.comparing 排序注意

1. 对数字型字符串排序 List<String> values new ArrayList<>();values.add("10");values.add("6");values.add("20");values.add("30");values.add("50");//方法1 &#xff08;正确的排序方法&#xff09;//倒…

Go有限状态机实现和实战

Go有限状态机实现和实战 有限状态机 什么是状态机 有限状态机&#xff08;Finite State Machine, FSM&#xff09;是一种用于建模系统行为的计算模型&#xff0c;它包含有限数量的状态&#xff0c;并通过事件或条件实现状态之间的转换。FSM的状态数量是有限的&#xff0c;因此称…

Linux shell的七大功能 --- history

1.直接输入“history” 这个命令可以显示出曾经使用过的命令&#xff08;最近时间的500条&#xff09; history 2.“history”命令也可以搭配其他命令一起使用。 例&#xff1a;history | grep "vim"&#xff0c;找出所有包含“vim”的记录&#xff1b; 也可以搭配…

精品基于Python实现的微信小程序校园导航系统-微信小程序

[含文档PPT源码等] [包运行成功永久免费答疑辅导] 《django微信小程序校园导航系统》该项目采用技术Python的django框架、mysql数据库 &#xff0c;项目含有源码、文档、PPT、配套开发软件、软件安装教程、项目发布教程、核心代码介绍视频等 软件开发环境及开发工具&#xf…