Vue 项目中 marked.js 怎么定制链接的点击行为

在 Vue 3 组件中使用 marked.js 并定义有效的 handleLinkClick 函数,你可以采用以下几种方法:

  1. 使用组件方法和全局函数

在你的 Vue 组件中定义 handleLinkClick 方法,然后将其暴露到全局作用域:

<template><div v-html="renderedMarkdown"></div>
</template><script setup>
import { ref, onMounted } from 'vue';
import { marked } from 'marked';const renderedMarkdown = ref('');const handleLinkClick = (event, href) => {event.preventDefault();// 在这里实现你的自定义行为console.log('Link clicked:', href);
};// 将方法暴露到全局作用域
window.handleLinkClick = handleLinkClick;onMounted(() => {const renderer = new marked.Renderer();renderer.link = (href, title, text) => {return `<a href="${href}" οnclick="handleLinkClick(event, '${href}')">${text}</a>`;};marked.setOptions({ renderer });// 假设你有一个 markdown 字符串const markdown = '# Hello\n[Link](http://example.com)';renderedMarkdown.value = marked(markdown);
});
</script>
  1. 使用自定义指令

你可以创建一个自定义指令来处理链接点击:

<template><div v-html="renderedMarkdown" v-handle-links></div>
</template><script setup>
import { ref, onMounted, directive } from 'vue';
import { marked } from 'marked';const renderedMarkdown = ref('');const handleLinkClick = (event, href) => {event.preventDefault();// 在这里实现你的自定义行为console.log('Link clicked:', href);
};const vHandleLinks = directive({mounted(el) {el.addEventListener('click', (event) => {if (event.target.tagName === 'A') {handleLinkClick(event, event.target.href);}});}
});onMounted(() => {// 假设你有一个 markdown 字符串const markdown = '# Hello\n[Link](http://example.com)';renderedMarkdown.value = marked(markdown);
});
</script>
  1. 使用 Vue 的 v-html 和事件委托

你可以在包含渲染后 Markdown 的元素上使用事件委托:

<template><div v-html="renderedMarkdown" @click="handleClick"></div>
</template><script setup>
import { ref, onMounted } from 'vue';
import { marked } from 'marked';const renderedMarkdown = ref('');const handleClick = (event) => {if (event.target.tagName === 'A') {event.preventDefault();const href = event.target.href;// 在这里实现你的自定义行为console.log('Link clicked:', href);}
};onMounted(() => {// 假设你有一个 markdown 字符串const markdown = '# Hello\n[Link](http://example.com)';renderedMarkdown.value = marked(markdown);
});
</script>

这些方法中,第二种和第三种更符合 Vue 的组件化思想,因为它们不依赖于全局函数。第三种方法特别简洁,因为它不需要修改 marked.js 的渲染器。

选择哪种方法主要取决于你的具体需求和项目结构。如果你需要在多个组件中重用这个功能,你可能想要创建一个可重用的组件或指令。

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

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

相关文章

嵌入式软件文件目录

以下是一个清爽的文件夹分类建议&#xff0c;适用于大多数嵌入式软件项目&#xff1a; 1. 根目录 README.md&#xff1a;项目简介、安装步骤、配置说明等。LICENSE&#xff1a;项目使用的许可证文件。 2. 源代码目录 2.1 src 存放所有源代码文件。 2.2 子目录划分 bsp&a…

实验2-3-8 计算火车运行时间

//实验2-3-8 计算火车运行时间 /* 输入格式&#xff1a;输入在一行中给出2个4位正整数&#xff0c;其间以空格分隔&#xff0c;分别表示火车的出发时间和到达时间。 每个时间的格式为2位小时数&#xff08;00-23&#xff09;和2位分钟数&#xff08;00-59&#xff09;&#xff…

Mysql中DML的几种操作

DML&#xff08;Data Manipulation Language&#xff0c;数据操纵语言&#xff09;是SQL中用于添加、删除、更新和查询数据库记录的一类语句。在MySQL中&#xff0c;DML主要包括以下几种操作&#xff1a; 1. 插入&#xff08;INSERT&#xff09; 用途&#xff1a;向表中插入新…

类方法的分析和举例

在Python中&#xff0c;类方法是一种与类相关联的方法&#xff0c;而不是与类的实例相关联。类方法可以通过在方法定义时使用classmethod装饰器来创建。类方法的第一个参数通常是cls&#xff0c;它代表类本身&#xff0c;而不是类的实例。 class MyClass:class_attribute &qu…

ArcGIS for js SketchViewModel绘制点、线、面和圆(vue代码)

引入依赖&#xff08;前提要加载地图&#xff09;&#xff1a; import SketchViewModel from "arcgis/core/widgets/Sketch/SketchViewModel.js";import GraphicsLayer from "arcgis/core/layers/GraphicsLayer.js"; 创建SketchViewModel对象&#xff1a…

dockerfile部署镜像 ->push仓库 ->虚拟机安装建木 ->自动部署化 (详细步骤)

目录 创建私服仓库 vi /etc/docker/daemon.json vim deploy.sh判断脚本内容 创建 建木 后端部署 命名空间 设置密码用户名 创建git仓库 gitignore文件内容 图形项目操作 git maven docker镜像 点击流程日志 vim /etc/docker/daemon.json 执行部署脚本 ip 开发…

【嵌入式英语教程--4】C语言中的控制结构

C语言中的控制结构 英文原文 Control structures in the C programming language allow you to control the flow of execution in your programs. This includes decision-making constructs like if, else, and switch, as well as looping constructs such as for, while,…

RuntimeError: No CUDA GPUs are available

RuntimeError: No CUDA GPUs are available 目录 RuntimeError: No CUDA GPUs are available 【常见模块错误】 【解决方案】 解决步骤如下&#xff1a; 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页&#xff0c;我是博主英杰&#xff0c;211科…

Redis:集群测试及删除key

集群性能测试&#xff1a; redis-benchmark -h localhost -p 6379 -c 100 -n 100000 其中代表100个并发连接&#xff0c;100000个请求&#xff0c;检测host为localhost 端口为6379的redis服务器性能 命令删除相关key&#xff1a; src/redis-cli -h 127.0.0.1 -p 6379 -a …

Spring 高级解析 07

文章目录 1. Spring 概述&#xff08;基本情况&#xff09;1.1 Spring 的优势1.2 Spring 的核⼼结构 2. 核⼼思想 IoC 和 AOP2.1 什么是IoC&#xff1f;2.2 什么是AOP2.3 AOP在解决什么问题 3. Spring IoC ⾼级应⽤3.1 BeanFactory与ApplicationContext区别3.1.1 BeanFactory3.…

Android虚假定位的实现与防护

Android中常用的定位方式 一&#xff0c;GPS定位 定义&#xff1a;全球卫星定位系统&#xff0c;直接和卫星交互&#xff0c;获取设备经纬度 优点&#xff1a; 走卫星通信通道&#xff0c;无需打开Wifi或流量就能获得位置信息 精确度最高&#xff0c;几米到几十米 缺点&a…

Java面试八股之Spring AOP 和 AspectJ AOP 的区别

Spring AOP 和 AspectJ AOP 的区别 Spring AOP 和 AspectJ AOP 是两种不同的面向切面编程&#xff08;Aspect-Oriented Programming, AOP&#xff09;实现。它们各有特点&#xff0c;适用于不同的场景。下面是一些主要的区别&#xff1a; 1. 实现机制 Spring AOP: 基于代理…

为Mac配置Alfred

参考资料&#xff1a; Alfred神器使用手册 | louis blogMacOS神器之Alfred workflow概览GitHub - arpir/Alfred-Workflows-Collection: 一些好用的 Alfred Workflow 一、修改快捷键 Spotlight的默认快捷键是Command Space Alfred的默认快捷键是Option Space 可以将Alfred和…

Alternating Sum

Problem - 963A - Codeforces 处理式子 显然中间式子是等比数列 // Problem: A. Alternating Sum // Contest: Codeforces - Tinkoff Internship Warmup Round 2018 and Codeforces Round 475 (Div. 1) // URL: https://codeforces.com/problemset/problem/963/A // Memory Lim…

DBMS-1.1 关系模型

关系数据库基本概念 一.关系 1.关系&#xff1a;关系数据库是由表的集合构成的&#xff0c;因此在关系数据库中&#xff0c;表又称为关系。 2.属性&#xff1a;表的每一列称为一个属性。 &#xff08;1&#xff09;一个有n个属性的关系&#xff0c;称为n元关系。 3.元组&…

awk用法

文章目录 一、awk工具awk工作原理AWK程序的结构awk内置变量 二、案例1.基础案列2.BEGIN END 运算3.数值与字符串的比较4.awk高级用法5. awk if语句6.BEGIN END 流程7.AWK 数组8.awk 循环 一、awk工具 awk工作原理 当读到第一行时&#xff0c;匹配条件&#xff0c;然后执行指定…

Mojo模型的端到端加密:数据安全的终极防线

Mojo模型的端到端加密&#xff1a;数据安全的终极防线 在数字化时代&#xff0c;数据安全已成为企业和个人最为关注的问题之一。Mojo模型&#xff0c;作为一个先进的数据处理框架&#xff0c;其端到端加密&#xff08;E2EE&#xff09;功能为数据传输提供了坚不可摧的安全保障…

【C++11】C++11新纪元:深入探索右值引用与移动语义

&#x1f4dd;个人主页&#x1f339;&#xff1a;Eternity._ ⏩收录专栏⏪&#xff1a;C “ 登神长阶 ” &#x1f921;往期回顾&#x1f921;&#xff1a;位图与布隆过滤器 &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; ❀C11 &#x1f4d2;1. C11简介…

【Qt】修改窗口的标题和图标

以下操作仅对顶层 widget(独⽴窗口),有效。 修改窗口的标题 一.windowTitle属性 1.概念 是一种在用户界面中显示窗口的标题的属性。它可以用来设置窗口的标题栏文本。 2.API API说明windowTitle()获取到控件的窗⼝标题.setWindowTitle(const QString& title)设置控件的…