vue3自定义指令(图文教程)

news2025/1/12 1:55:00

序:

简单,但是没怎么用,但是小伙伴问了,所以做个教程。

自定义指令我只关心3件事

  1. 干啥用的,怎么用的,解决什么痛点
  2. 怎么全局
  3. 博文有查阅及参考过以下文章,
  1.  vue3:自定义指令_vue3自定义指令-CSDN博客 
  2. vue3目录结构详细说明及文件命名规范_vue3目录结构解析-CSDN博客
  3. 自定义指令 | Vue.js

正文

一、干啥用的,怎么用的,解决什么痛点

     简单,举个例子,ul>li结构,我想每个li都显示自己在这个li里面排第几位(index)索引

<template>
	<ul>
		<li>1</li>
		<li>2</li>
		<li>2</li>
	</ul>
</template>

你正常是不是下面这么,这么玩,没毛病吧

<template>
	<ul>
		<li v-for="(v,i) in arr" :key="i" :index="i">1</li>
	</ul>
</template>
<script setup lang="ts" >
	var arr:string[]=[1,2,3]
</script>
<style lang="scss" scoped>
</style>

问题来了,我要每偶数行背景改变,你要么class加个on去判断颜色,要么style去%2,没错吧。来看自定义指令

<template>
	<ul>
		<li v-for="(v,i) in arr" :key="i" :i="i" v-cyc>1</li>
	</ul>
</template>
 
<script setup lang="ts" >
	var arr:number[]=[1,2,3]
	const vCyc={
		mounted: (el:any) => {
			var index=el.getAttribute("i");
			if(index%2==1){
				el.style.backgroundColor = "yellow"
			}
		}
	}
</script>
<style lang="scss" scoped>
	
</style>

有小伙伴就会问了,什么年代,还在dom节点操作,难道我不会把逻辑封装个组件里面吗?这个自定义组件解决什么痛点?有必要吗

是!你完全可以封装在一个组件里。

问题是你能保证一直都是ul和li结构的组件吗,就像说,table列表也要偶数行改北京你是不是还要去改一次table在封装一次?那隔天select的偶数行也要呢?

<template>
	<select>
		<option v-for="(v,i) in arr" :key="i" :i="i" v-cyc>{{v}}</option>
	</select>
</template>
 
<script setup lang="ts" >
	var arr:number[]=[1,2,3]
	const vCyc={
		mounted: (el:any) => {
			var index=el.getAttribute("i");
			if(index%2==1){
				el.style.backgroundColor = "yellow"
			}
		}
	}
</script>
<style lang="scss" scoped>
	
</style>

看明白吗?v-cyc 加上后,自动就去加背景了,不会有哪个公司那么闲,每个个性化的业务都来封装一个组件吧,那得是多大的公司,时间不要钱的吗,肯定是效率第一呀

二、怎么全局

来,先看目录结构,从网上扒下来

my-vue3-project/
├── public/           # 静态资源文件夹,其中的文件会直接复制到构建输出目录中,无需经过编译处理
│   ├── favicon.ico    # 网站图标
│   └── index.html    # 应用程序入口HTML文件,Vue应用将挂载于此文件中的特定元素上

├── src/
│   ├── assets/        # 静态资源目录,包含图片、字体等未经过webpack编译的文件,可使用import导入并在构建时进行处理
│   ├── components/    # 组件目录,按照功能或类别划分存放单文件组件(.vue文件)
│   │   ├── Common/     # 公共组件目录
│   │   ├── Layout/     # 布局组件目录
│   │   └── ...         # 其他分类组件目录
│   ├── directives/    # 自定义指令目录,存放Vue自定义指令实现
│   ├── hooks/         # Vue Composition API 的自定义 Hooks 目录,用于组织和复用可组合的逻辑单元
│   ├── layouts/       # 应用布局相关的组件存放处,例如通用页面布局组件
│   │   ├── AppLayout.vue 
│   │   └── ...         # 其他布局相关页面组件
│   ├── pages/          # 页面组件目录,根据功能模块划分不同页面组件
│   │   ├── Home/       # 主页或首页相关页面组件
│   │   │   ├── Index.vue
│   │   │   └── ...
│   │   ├── User/       # 用户管理相关的页面组件
│   │   │   ├── Profile.vue
│   │   │   ├── Settings.vue
│   │   │   └── ...
│   │   ├── Product/    # 产品管理相关的页面组件
│   │   │   ├── List.vue
│   │   │   ├── Detail.vue
│   │   │   └── ...
│   │   └── ...         # 其他功能模块的页面组件目录
│   ├── plugins/       # Vue 插件配置目录,存放全局注册的插件及其配置
│   ├── router/        # 路由配置目录,主要包含index.js路由文件,用于配置应用程序的路由规则
│   ├── store/         # Vuex 状态管理目录,用于集中管理组件状态和数据流
│   ├── styles/        # 样式文件目录,包括全局样式、主题样式等
│   ├── utils/         # 工具函数和类库目录,存放项目中常用的工具函数、辅助类等
│   ├── App.vue        # 应用程序根组件,整个应用的入口点,通常包含路由视图和其他全局共享组件
│   ├── main.ts        # 应用程序入口脚本,用于初始化Vue实例、引入并配置路由、状态管理等核心模块
│   └── shims-vue.d.ts # TypeScript 类型声明文件,为Vue相关API提供类型支持

├── tests/             # 测试相关文件目录,存放单元测试、集成测试等代码
├── .env.*             # 环境变量配置文件,根据不同环境如开发、生产等设置不同的环境变量
├── .eslintrc.js       # Eslint 配置文件,用于定义项目的代码风格规范和错误检查规则
├── .gitignore         # Git 忽略文件,列出不需要添加到版本控制的文件或目录
├── package-lock.json       #  npm 包管理器中用于锁定项目依赖版本的文件
├── package.json       # npm 包配置文件,包括项目依赖、脚本命令、项目信息等元数据
├── vite.config.ts     # Vite 构建工具的配置文件,用于定制Vite的构建行为(如果使用Vite构建系统)
├── README.md          # 项目文档和说明文件,介绍项目结构、启动方式及注意事项等
├── tsconfig.json          # TypeScript 项目的核心配置文件,用于指定编译选项、包含的源文件、排除的文件等信息
├── tsconfig.node.json          # 针对 Node.js 应用程序进行更细粒度的 TypeScript 编译设置
├── .prettierrc        # Prettier 代码格式化配置文件,定义代码格式化规则
├── .ls-lint.yml       # Linting 规则配置文件,例如针对Less预处理器的代码风格检查规则
└── changelog.md       # 更新日志文件,记录项目的版本迭代和更新内容

好,来看明白每,在src下新建个directives文件夹,在新建个index.ts、和cyc.ts

index.ts

import registerFocus from './cyc'; // 获取焦点
export default function registerDirectives(app: any) {
    registerFocus(app);
}

cyc.ts

export default function(app: any) {
app.directive("cyc", {
    mounted(el: any) {
		let index=el.getAttribute("i");
		if(index%2==1){
			el.style.backgroundColor = "yellow"
		}
    }
  })
}

然后呢?

main.ts,加这两个东西,位置如下图,app是createApp(App),你不一样的话记得改

import registerDirectives from './directives'
registerDirectives(app)

你记得把你原来test.vue这个测试页面的代码删了,就留下这样

<template>
	<ul>
		<li v-for="(v,i) in arr" :key="i" :i="i" v-cyc>1</li>
	</ul>
</template>
 
<script setup lang="ts" >
	var arr:number[]=[1,2,3]
</script>
<style lang="scss" scoped>
	
</style>

好了,差不多可以了 

来,我在上个指令的周期

const myDirective = {
  // 在绑定元素的 attribute 前
  // 或事件监听器应用前调用
  created(el, binding, vnode, prevVnode) {
    // 下面会介绍各个参数的细节
  },
  // 在元素被插入到 DOM 前调用
  beforeMount(el, binding, vnode, prevVnode) {},
  // 在绑定元素的父组件
  // 及他自己的所有子节点都挂载完成后调用
  mounted(el, binding, vnode, prevVnode) {},
  // 绑定元素的父组件更新前调用
  beforeUpdate(el, binding, vnode, prevVnode) {},
  // 在绑定元素的父组件
  // 及他自己的所有子节点都更新后调用
  updated(el, binding, vnode, prevVnode) {},
  // 绑定元素的父组件卸载前调用
  beforeUnmount(el, binding, vnode, prevVnode) {},
  // 绑定元素的父组件卸载后调用
  unmounted(el, binding, vnode, prevVnode) {}
}

我也是写给自己看的,你要是卡到,去公众号:”程序员员野区"。留言,我看到回你,也可以直接公众号回复加群,来加雪狼的粉丝群

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

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

相关文章

深度学习实战82-新的研究方向:大模型与图模型结合生成大型图模型,大图模型相关挑战和机遇的观点

大家好,我是微学AI,今天给大家介绍一下深度学习实战82-新的研究方向:大模型与图模型结合生成大型图模型,大图模型相关挑战和机遇的观点。随着人工智能的飞速发展,大型模型已成为人工智能领域最新的突破性成就。在图方面,大型模型尚未取得与自然语言处理和计算机视觉等其他…

14-15 为什么我们现在对阅读如此难以接受

写出来感觉很奇怪&#xff0c;但最近我感觉自己失去了阅读能力。长篇文本对我来说尤其具有挑战性。句子很难读完。更别提章节了。章节有很多段落&#xff0c;而段落又由许多句子组成。 啊。 即使在极少数情况下&#xff0c;我读完了一章&#xff0c;下一页上已经有另一章等着…

Next.js 实战 (一):项目搭建指南

前言 时间过得好快&#xff0c;一下就来到2024下半年了。 上半年我为了学习 Nuxt3&#xff0c;从 0 到 1 开发了一个导航网站&#xff1a;Dream Site&#xff0c;目前主要的功能都已完成了&#xff0c;后续有时间再慢慢添加有趣的功能。 下半年开始进攻 Next.js&#xff0c;…

关于 VuePress 的插件

插件就好比第三方功能&#xff0c;例如增加一个阅读进度条、增加光标效果等。VuePress 官网对插件的介绍&#xff1a;插件通常会为 VuePress 添加全局功能。 这里简单介绍几个本站用的插件吧&#xff01; ‍ ‍ 插件就好比第三方功能&#xff0c;例如增加一个阅读进度条、增…

计算机提示找不到xinput1_3.dll缺失,七个详细不同修复方法

在电脑中下载或许启动运行游戏时候我相信各位都会遇到xinput1_3.dll丢失或许找不到xinput1_3.dll文件问题&#xff0c;当遇到这个问题时候要如何修复呢&#xff1f;今天我就给大家详细讲解一下xinput1_3.dll是什么与xinput1_3.dll作用和丢失原因以及xinput1_3.dll丢失要怎么处理…

嵌入式c语言2——预处理

在c语言中&#xff0c;头部内容&#xff0c;如include与define是不参与编译而直接预先处理的 如include相当于把头文件扩展&#xff0c;define相当于做了替换 c语言大型工程创建时&#xff0c;会有调试版本与发行版本&#xff0c;发行时不希望看到调试部分内容&#xff0c;此时…

【数据分享】国家级旅游休闲街区数据(Excel/Shp格式/免费获取)

之前我们分享过从我国文化和旅游部官网整理的2018-2023年我国50个重点旅游城市星级饭店季度经营状况数据&#xff08;可查看之前的文章获悉详情&#xff09;&#xff01;文化和旅游部官网上也分享有很多与旅游相关的常用数据&#xff0c;我们基于官网发布的名单文件整理得到全国…

汇聚全球智慧 上海打造人工智能“核爆点”和“新风口”

以下文章来源&#xff1a;证券时报 “以共商促共享 以善治促善智”为主题的世界人工智能大会暨人工智能全球治理高级别会议将于7月4日—6日在上海召开。证券时报记者注意到&#xff0c;大会自2018年创办以来已成功举办六届&#xff0c;成为全球人工智能最具影响力的综合性会议。…

浏览器无法联网问题

浏览器无法联网问题 电脑联网正常&#xff0c;但是服务器显示网络出错或者代理服务器拒绝连接&#xff0c;无法使用浏览器 解决方法 打开电脑【设置】→【网络和Internet】 点击【手动设置代理】→【设置】 关闭【使用代理服务器】&#xff0c;并【保存】 打开【自动检测设…

Day9:逆波兰表达式求值150 滑动窗口最大值239 前 K 个高频元素347

题目150. 逆波兰表达式求值 - 力扣&#xff08;LeetCode&#xff09; class Solution { public:int evalRPN(vector<string>& tokens) {//使用栈来消除stack<string> st;for(int i0;i<tokens.size();i){if(tokens[i]""||tokens[i]"-"|…

【CUDA】 归约 Reduction

Reduction Reduction算法从一组数值中产生单个数值。这个单个数值可以是所有元素中的总和、最大值、最小值等。 图1展示了一个求和Reduction的例子。 图1 线程层次结构 在Reduction算法中&#xff0c;线程的常见组织方式是为每个元素使用一个线程。下面将展示利用许多不同方…

三菱A系列网络连接

寄存器名 读写 寄存器类型 变量类型 寄存器范围 说明 X##1 R/W BIT I/O离散 0&#xff0d;7FF Input Y##1 R/W BIT I/O离散 0&#xff0d;7FF Output M##1 R/W BIT I/O离散 0&#xff0d;9255 Internal relay B##1 R/W BIT I/O离散 0&#xff0d;3FF Link relay F##1 R/W BIT I…

EPS绘制甘家寨地形图

1、数据准备 &#xff08;1&#xff09;外业采集的数据点&#xff1b; &#xff08;2&#xff09;地形草图 2、软件准备 这里准备的是EPS2021版本的绘图软件&#xff0c;如下&#xff1a; 3、开始绘图 &#xff08;1&#xff09;打开软件&#xff0c;如上图&#xff0c;选择【…

不同行业如何选择适合自己行业的项目管理工具?

在当今的信息化时代&#xff0c;项目管理软件已成为各行各业不可或缺的工具。然而&#xff0c;由于各行业具有不同的特点和需求&#xff0c;因此选择合适的项目管理软件成为了一个重要问题。本文将探讨不同行业在选择项目管理软件时需要考虑的因素&#xff0c;希望能帮助大家更…

8.12 矢量图层面要素单一符号使用十四(标记符号渲染边界)

前言 本章介绍矢量图层线要素单一符号中标记符号渲染边界&#xff08;Outline: Marker line&#xff09;的使用说明&#xff1a;文章中的示例代码均来自开源项目qgis_cpp_api_apps 标记符号渲染边界&#xff08;Outline: Marker line&#xff09; Outline系列只画边界&#…

HarmonyOS ArkUi 官网踩坑:单独隐藏导航条无效

环境&#xff1a; 手机&#xff1a;Mate 60 Next版本&#xff1a; NEXT.0.0.26 导航条介绍 导航条官网设计指南 setSpecificSystemBarEnabled 设置实际效果&#xff1a; navigationIndicator&#xff1a;隐藏导航条无效status&#xff1a;会把导航条和状态栏都隐藏 官方…

深入理解策略梯度算法

策略梯度&#xff08;Policy Gradient&#xff09;算法是强化学习中的一种重要方法&#xff0c;通过优化策略以获得最大回报。本文将详细介绍策略梯度算法的基本原理&#xff0c;推导其数学公式&#xff0c;并提供具体的例子来指导其实现。 策略梯度算法的基本概念 在强化学习…

Ajax异步请求 axios

Ajax异步请求 axios 1 axios介绍 原生ajax请求的代码编写太过繁琐,我们可以使用axios这个库来简化操作&#xff01; 在后续学习的Vue(前端框架)中发送异步请求,使用的就是axios. 需要注意的是axios不是vue的插件,它可以独立使用. axios说明网站&#xff1a;(https://www.kancl…

猫头虎分享[可灵AI」官方推荐的驯服指南-V1.0

猫头虎分享[可灵AI」官方推荐的驯服指南-V1.0 猫头虎是谁&#xff1f; 大家好&#xff0c;我是 猫头虎&#xff0c;别名猫头虎博主&#xff0c;擅长的技术领域包括云原生、前端、后端、运维和AI。我的博客主要分享技术教程、bug解决思路、开发工具教程、前沿科技资讯、产品评…

云服务器安装部署LAMP网站Web环境教程

搭建网站如何安装LAMP环境&#xff0c;以腾讯云轻量应用服务器为例&#xff0c;应用模板直接选择“LAMP”镜像即可&#xff0c;打开腾讯云轻量应用服务器页面&#xff0c;在应用模板中选择LAMP即可&#xff0c;如下图&#xff1a; 轻量服务器“LAMP”镜像 腾讯云的LAMP应用镜像…