Vue自定义指令

news/2025/2/19 9:08:33/

一、认识自定义指令

目录

一、认识自定义指令

方式一、使用默认实现方式,使用 ref 实现,并抽取到 hooks,方便调用。

 方式二、自定义一个 v-focus 的局部指令

 方式三:自定义一个 v-focus 的全局指令

  • 某些情况,你需要对 DOM 元素进行底层操作,此时会用到自定义指令
  • 自定义指令分为两种:
    • 自定义局部指令
      • 组件中通过 directives 选项,只能在当前组件中使用;
    • 自定义全局指令
      • app 的 directive方法,可以在任意组件中被使用
  • 比如做一个简单的案例:当某个元素挂载完成后可以自定获取焦点
    • 实现方式一:使用默认实现方式
    • 实现方式二:自定义一个 v-focus 的局部指令
    • 实现方式三:自定义一个 v-focus 的全局指令

方式一、使用默认实现方式,使用 ref 实现,并抽取到 hooks,方便调用。

<!-- App.vue -->
<template><div class="app"><input type="text" ref="inputRef" /></div>
</template><script setup>// 1.方法一:定义 ref 绑定到 input 中,调用 focus()
import useInput from './hooks/useInput'
const { inputRef } = useInput()</script><style scoped lang="less"></style>

 新建 hooks/useInput.js

import { ref, onMounted } from 'vue'export default function useInput() {const inputRef = ref()onMounted(() => {inputRef.value?.focus()})return { inputRef }
}

 方式二、自定义一个 v-focus 的局部指令

缺点:只能在局部使用,不能复用。

注意:需要定义一个标识符 v 开头

<!-- App.vue --><template><div class="app"><!-- 方式二、自定义指令 --><input type="text" v-focus /></div>
</template><!-- <script>
export default {directives: {focus: {// focus: {} 这个对象里放的是生命周期的函数(自定义指令),会把元素 el 传过来mounted(el) {// 当v-focus应用到 input上,input被挂载到DOM上后,就会回调 mounted 生命周期函数console.log('v-focus 应用到元素被挂载了', el)el?.focus()}}}
}
</script> -->
<script setup>
// 2.方式二:自定义指令(局部指令)
// 注意:定一个标识符,v开头
const vFocus = {mounted(el) {// 当v-focus应用到 input上,input被挂载到DOM上后,就会回调 mounted 生命周期函数,console.log('v-focus 应用到元素被挂载了', el)el?.focus()}
}
</script><style scoped lang="less"></style>

 方式三:自定义一个 v-focus 的全局指令

  •  为方便复用,写在 main.js 里
import { createApp } from 'vue'
import App from './01_自定义指令/App.vue'const app = createApp(App)
// 自定义全局指令,需要定义个名称
app.directive('focus', {mounted(el) {// 当v-focus应用到 input上,input被挂载到DOM上后,就会回调 mounted 生命周期函数,console.log('v-focus 应用到元素被挂载了', el)el?.focus()}
})
app.mount('#app')
  • 但是有时候自定义指令会有很多,所以可以单独抽取出来,新建文件夹 directives

1. 先抽取到 focus.js 里

export default function directiveFocus(app) {// 自定义全局指令,需要定义个名称app.directive('focus', {mounted(el) {// 当v-focus应用到 input上,input被挂载到DOM上后,就会回调 mounted 生命周期函数,console.log('v-focus 应用到元素被挂载了', el)el?.focus()}})
}

 2.新建一个index.js

  • 在这里导出所有的自定义指令,方便直接在mian.js中使用
import directiveFocus from './focus'export default function useDirectives(app) {directiveFocus(app)
}

 3.main.js

import { createApp } from 'vue'
import App from './01_自定义指令/App.vue'
import useDirectives from './01_自定义指令/directives/index'const app = createApp(App)
// 自定义指令
useDirectives(app)
app.mount('#app')

二、生命周期-自定义指令的生命周期 

一个指令定义到对象,vue提供了如下的几个钩子函数:

  • created:在绑定元素的 attribute 或事件监听器被应用之前调用;
  • beforeMount:当指令第一次绑定到元素并且在挂载父组件之前调用;
  • mounted:在绑定元素的父组件被挂载后调用;
  • beforeUpdate:在更新包含组件的 VNode 之前调用;
  • updated:在包含组件的 VNode 及其子组件的 VNode 更新后调用;
  • beforeUnmount:在卸载绑定元素的父组件之前调用;
  • unmounted: 当指令与元素解除绑定并且父组件已卸载时,只调用一次;
<template><div class="app"><div class="title" v-if="showTitle" v-why>当前计数{{ counter }}</div><button @click="counter++">+1</button><button @click="showTitle = false">隐藏</button></div>
</template><script setup>
import { ref, reactive, onMounted } from 'vue'const counter = ref(0)
const showTitle = ref(true)
const vWhy = {created() {console.log('created -- 绑定前')},beforeMount() {console.log('beforeMount -- 挂载前')},mounted() {console.log('mounted -- 挂载后')},beforeUpdate() {console.log('beforeUpdate -- 更新前')},updated() {console.log('updated -- 更新后')},beforeUnmount() {console.log('beforeUnmount---卸载前')},unmounted() {console.log('unmounted')}
}
</script><style scoped></style>


http://www.ppmy.cn/news/41426.html

相关文章

基于Spring Boot和Vue3的博客平台:用户管理、文章审核与管理、专栏审核与管理、数据统计与分析模块

目录 一、用户管理 1.查询用户列表 2.修改用户信息 二、文章审核与管理 1.查询待审核文章列表 2.审核文章 三、专栏审核与管理 1.查询待审核专栏列表 2.审核专栏 四、数据统计与分析 1.用户注册统计 2.文章发布统计 五、评论管理与审核 1.查询评论列表 3.删除评…

【随笔记】Win11、RTX3070、CUDA117的深度学习机器学习环境配置

文章目录一、创建深度学习 Conda 虚拟环境二、安装 Pytorch-Gpu三、安装 PyTorch Geometric四、安装 Sklearn五、Jupyter 配置5.1 将虚拟环境加入内核5.2 插件配置5.3 主题、字体、字号配置假设你已经安装了Anaconda3&#xff08;最新Anaconda3的安装配置及使用教程&#xff08…

Bayesian Rstan学习资料推荐

RStan 官方文档&#xff1a;RStan 官方文档是学习 RStan 的起点。它提供了详细的安装说明、基本用法和示例。 RStan 文档: https://mc-stan.org/rstan/ RStan User’s Guide: https://mc-stan.org/docs/2_27/rstan-guide/index.html Stan 用户指南&#xff1a;Stan 用户指南详…

代码随想录Day50

昨天因为准备面试所以咕咕了一天。今天继续学习动规算法&#xff0c;尽管背包问题已经结束但其中的各类思想仍需要进一步理解。 198.打家劫舍 你是一个专业的小偷&#xff0c;计划偷窃沿街的房屋。每间房内都藏有一定的现金&#xff0c;影响你偷窃的唯一制约因素就是相邻的房…

异步编程

异步编程 一、FutureTask应用&源码分析 1.1 FutureTask介绍 FutureTask是一个可以取消异步任务的类。FutureTask对Future做的一个基本实现。可以调用方法区开始和取消一个任务。 一般是配合Callable去使用。 异步任务启动之后,可以获取一个绑定当前异步任务的FutureT…

【kubernetes云原生】k8s资源管理命令与Namespace使用详解

目录 一、前言 二、k8s概述 三、k8s常用操作管理命令 3.1 kubectl 命令用法 3.2 常用控制台管理命令演示 3.2.1 获取全部节点信息 3.2.2 获取当前集群下全部pod 3.2.3 查看某个pod信息 3.2.4 获取当前集群下的所有namespace信息 3.2.5 查看当前集群下已创建的资源 3…

Spring Boot 3.0系列【26】应用篇之参数校验

有道无术,术尚可求,有术无道,止于术。 本系列Spring Boot版本3.0.5 源码地址:https://gitee.com/pearl-organization/study-spring-boot3 文章目录 1. 概述2. Bean Validation3. 常用注解4. 入门案例5. 分组校验6. 自定义校验注解6.1 原生注解6.2 实现验证器接口6.3 创建…

中间表示- 控制流图

基本概念 基本块&#xff1a;是语句的一个序列&#xff0c;从第一条执行到最后一条 不能从中间进入&#xff0c;不能从中间退出&#xff0c;即跳转指令只能出现在最后 控制流图&#xff1a;控制流图是一个有向图G(V&#xff0c;E) 节点V&#xff1a;是基本块边E&#xff1a;…