vue2自定义指令

本节目标

  • 快速入门
  • v-loading

快速入门

指令对比

基本语法

  1. 使用: v-指令名="指令值"
  2. 定义: 通过 directives 局部定义或者全局定义
  3. 通过事件对象 el 可以拿到指令所在元素
  4. 通过形参 binding 可以拿到指令的传值
  5. 通过update钩子, 可以监听指令值的变化,进行更新操作

局部注册

复制代码
<template>
  <div id="app">
    <input v-focus type="text" />
  </div>
</template>

<script>
export default {
  // 局部注册自定义指令
  directives: {
    focus: {
      // 指定的生命周期: 指令所在的元素, 挂载完毕后触发
      inserted(el) {
        // el就是指令绑定的元素
        el.focus();
      },
    },
  },
};
</script>

全局注册

复制代码
... ...

Vue.directive('focus', {
  // 指定所在的元素被加载后执行
  inserted: function (el) {
    // el就是所绑定的元素
    el.focus()
  }
})
  
... ...

指令传值

复制代码
<template>
  <div id="app">
    <h2 v-color="color1">我是一个标题</h2>
    <h2 v-color="color2">我是一个标题</h2>
  </div>
</template>

<script>
export default {
  data() {
    return {
      color1: "red",
      color2: "blue",
    }
  },
  // 局部注册自定义指令
  directives: {   
    color: {
      inserted(el, binding) {
        el.style.color = binding.value;
      },
      // 指令的值(binding)修改时触发
      update(el,binding) {
        el.style.color = binding.value;
      }
    }
  },
};
</script>

v-loading

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

分析

  1. 本质loading效果就是一个蒙层, 盖在盒子上
  2. 数据请求时, 开启loading状态, 添加蒙层
  3. 数据请求完毕, 关闭loading状态, 移除蒙层

实现

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

  2. 开启关闭loading状态, 本质只需要添加和移除类名即可

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

相关推荐
用户83134859306988 分钟前
Cesium实现动态流动火烧云晚霞效果(可用slider调整火烧云浓度)
vue.js·webgl·cesium
专业抄代码选手10 分钟前
01|从手写 DOM 到虚拟 DOM:把 UI 从“操作”变成“描述”
前端·javascript·react.js
喜欢睡觉10 分钟前
单词管理系统
前端·后端
YHL18 分钟前
向量数据库入门(二):Embedding → 语义搜索 → RAG 日记助手
前端·架构
码视野19 分钟前
基于 Vue3 + Element Plus 的【青少年心理健康智能测评与 AI 情绪树洞陪护干预系统】设计与实现(含PRD/三端源码/大屏)
前端·vue.js·人工智能·vue3
专业抄代码选手20 分钟前
03|React 为什么需要协调:比较两棵树,而不是重建页面
前端·javascript·react.js
灯澜忆梦23 分钟前
【基于GO的Web开发11】gin获取URL‑Path 路径参数
前端·后端·golang·html·gin
王霸天23 分钟前
GLB 文件太大怎么办?我把它从 47MB 压到 8MB,全程没碰命令行
前端·javascript·程序员
半个落月23 分钟前
Next.js 16 笔记应用实战:Redis 数据链路与组件两版拆分详解
前端·redis·next.js
YIAN24 分钟前
告别等后端!React+Vite 前端独立开发全流程:接口封装 + Mock 方案 + 状态管理
前端·react.js·vite