vue3 自定义指令 关键字 标记 强调 标红

1、创建对应文件及其文件夹

2、创建 emphasize.ts 自定义指令文件

// 匹配常用字符集 列表
// 根据业务需求 配置字符集
const characterList: any = {
  "<": "&lt;",
  ">": "&gt;",
  "&": "&amp;",
  "¥": "&yen;",
};
// 处理函数
const nodeChild = (node: any, val: any) => {
  const children = Array.from(node.children);
  let nodeSplicing: any = "";
  //   判断是否为末级节点
  if (children.length !== 0) {
    // 子节点数据遍历
    children.forEach((item: any) => {
      // 递归 子节点
      nodeChild(item, val);
      // nodeSplicing 为当前节点的子级拼接后的字符串
      nodeSplicing = nodeSplicing + item.outerHTML;
    });
    // 进行数据替换 防止标签内部 有需要标记的重复数据 导致标红后 标签外露
    // innerHTML 返回标签开始和结束标签之间的HTML
    node.innerHTML = node.innerHTML
      .replaceAll(nodeSplicing, `*^(_)`)
      .toString();
    node.innerHTML = node.innerHTML.replaceAll(
      val,
      `<span style="color:red">${val}</span>`
    );
    node.innerHTML = node.innerHTML.replaceAll("*^(_)", nodeSplicing);
  } else {
    // 末级节点 不需要内部标签数据替换
    node.innerHTML = node.innerHTML.replaceAll(
      val,
      `<span style="color:red">${val}</span>`
    );
  }
};
export default {
  mounted(el: any, binding?: any) {
    // 进行字符集匹配
    const value: string = binding.value;
    const valueArr: Array<string> = value.split("");
    valueArr.forEach((item: string, index: number) => {
      valueArr[index] = characterList[item] || item;
    });
    // 进行数据匹配 如当前绑定节点 整体并无需要标记内容 不进行DOM 操作
    const idx: number = el.innerHTML.indexOf(valueArr.join(""));
    if (idx != -1) {
      nodeChild(el, valueArr.join(""));
    }
  },
  //   binding 数据改变 调用 初始不会调用
  //   不建议 因为原始DOM已经被标记
  //   可根据业务需要进行 原始数据传参 对原始数据进行操作 然后进行DOM替换即可
  //   beforeUpdate(el: any, binding?: any) {
  //     nodeChild(el, binding);
  //   },
};

3、 index.ts 引入

import emphasize from "./modules/emphasize";
// 统一入口
export default function directive(app: any) {
  app.directive("emphasize", emphasize);
}

 4、main.ts 中引入 指令入口文件

import { createApp } from "vue";
import App from "./App.vue";
const app = createApp(App);
import router from "./router";
import store from "./store";
// 引入指令入口文件
import directive from "@/directive/index";
// 挂载
directive(app);
app.use(store);
app.use(router);
app.mount("#app");

5、使用 

<template>
  <div v-html="nodeStr" v-emphasize="emphasizeStr" class="nodestr"></div>
</template>

<script lang="ts" setup>
import { ref, onMounted } from "vue";
import { RouteLocationRaw, useRouter } from "vue-router";
const router = useRouter(); //路由初始化
const nodeStr = ref<string>(
  '<div><div>9846531564路人甲,4564864<br><a herf="18866664444">18866664444,路人乙<br><a herf="18866664444">18866664444,路人丙<br></a></a></div></div>'
);
let emphasizeStr = ref<string>("18866664444");
</script>

 6、效果

Vue 3中的自定义指令封装是一种扩展Vue的能力,允许开发者在DOM元素上添加自定义行为。下面是Vue 3中自定义指令封装的步骤: 1. 创建自定义指令:使用`app.directive`方法来创建自定义指令。该方法接受两个参数,第一个参数是指令名称,第二个参数是一个对象,包含了指令的各种钩子函数和配置选项。 2. 钩子函数:自定义指令可以通过钩子函数来定义其行为。常用的钩子函数有: - `beforeMount`:在指令绑定的元素挂载到DOM之前调用。 - `mounted`:在指令绑定的元素挂载到DOM之后调用。 - `beforeUpdate`:在指令所在组件更新之前调用。 - `updated`:在指令所在组件更新之后调用。 - `beforeUnmount`:在指令所在组件卸载之前调用。 - `unmounted`:在指令所在组件卸载之后调用。 3. 配置选项:除了钩子函数外,还可以通过配置选项来定义自定义指令的行为。常用的配置选项有: - `bind`:在指令绑定到元素时立即调用,只调用一次。 - `update`:在指令所在组件的VNode更新时调用,可能会调用多次。 - `unbind`:在指令从元素上解绑时调用,只调用一次。 下面是一个示例,演示了如何在Vue 3中封装一个自定义指令: ```javascript // 创建Vue实例 const app = Vue.createApp({}); // 创建自定义指令 app.directive('my-directive', { beforeMount(el, binding, vnode) { // 指令绑定到元素之前的操作 }, mounted(el, binding, vnode) { // 指令绑定到元素之后的操作 }, beforeUpdate(el, binding, vnode) { // 指令所在组件更新之前的操作 }, updated(el, binding, vnode) { // 指令所在组件更新之后的操作 }, beforeUnmount(el, binding, vnode) { // 指令所在组件卸载之前的操作 }, unmounted(el, binding, vnode) { // 指令所在组件卸载之后的操作 } }); // 将Vue实例挂载到DOM元素上 app.mount('#app'); ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值