react

封装的渲染富文本的组件: RenderRtf.tsx

import { useState, useEffect, useRef } from "react";
import parse from "html-react-parser";
import ReactDOM from "react-dom/client";
import Hello from "./Hello"; // 这里注册富文本中包含的自定义组件(也可以外部注册)
const regCompPublic = {
Hello,
}; // 渲染富文本
const RenderRtf = (props) => {
// 组件名字处理
const regCompTemp = { ...regCompPublic, ...props["regComp"] };
const regComp = {};
for (const key in regCompTemp) {
const keyStr = key.toLowerCase();
regComp[keyStr] = regCompTemp[key];
} // 子实例的根节点
const [root, setRoot] = useState<any>();
// 子实例的根节点的挂载点
const wrappNode = useRef(null);
// 子实例渲染
const rootRender = () => {
if (!root) {
console.warn("没有实例对象,此次实例无法重新render");
return false;
}
root.render(
parse(props.content, {
replace(domNode: any) {
if (Object.keys(regComp).indexOf(domNode.name) > -1) {
const Cmp = regComp[domNode.name];
return <Cmp {...domNode.attribs} />;
} else {
return domNode;
}
},
})
);
}; // 传入的内容更改 就需要重新渲染
useEffect(() => {
if (root) {
rootRender();
}
}, [props]); // 挂载第二(子)实例
useEffect(() => {
if (wrappNode.current && !root) {
const instanceRoot = ReactDOM.createRoot(wrappNode.current);
setRoot(instanceRoot);
rootRender();
}
}, [wrappNode]);
return (
<>
<div className="wrapp" ref={wrappNode}></div>
</>
);
}; export default RenderRtf;

页面中使用: App.tsx

import { useState } from "react";
import RenderRtf from "./components/RenderRtf";
import MarkdownIt from "markdown-it"; const md = MarkdownIt({
html: true,
linkify: true,
typographer: true,
});
function App() {
const [ipt, setIpt] = useState("你好 <Hello/>"); const onInput = (e: any) => {
setIpt(e.target.value);
}; return (
<>
<textarea value={ipt} onInput={onInput}/>
<RenderRtf content={md.render(ipt)} />
</>
);
} export default App;

html

基于此,vue我也实现了

封装的渲染富文本的组件: render-rtf.vue

<script setup lang="ts">
import { onMounted, ref, watch } from "vue";
import Hello from "@/components/HelloWorld.vue";
import * as Vue from "vue/dist/vue.esm-bundler.js"; const props = defineProps(["content"]);
let app: any = null;
const renRender = () => {
if (!showRtf.value) {
console.warn("没有子实例对象的挂载真实node,此次实例无法重新render");
return false;
}
// 不同于react,vue对外没有暴漏render函数,所以无法手动调用,只能更新整个实例来渲染
if (app) {
app.unmount();
}
showRtf.value.innerHTML = props.content;
app = Vue.createApp({
components: { //这里组测富文本中包含的vue组件
Hello,
},
});
app.mount(showRtf.value);
};
onMounted(() => {
renRender();
});
watch(
() => props.content,
(newVal) => {
renRender();
}
); const showRtf = ref();
</script> <template>
<div ref="showRtf"></div>
</template>

这里是使用 App.vue

<script setup lang="ts">
import {createApp} from 'vue';
import { ref, watch, computed } from "vue";
import MarkdownIt from "markdown-it";
import RenderRtf from '@/components/render-rtf.vue'; const md = MarkdownIt({
html: true,
linkify: true,
typographer: true,
});
const ipt = ref("哈哈<Hello/>");
</script> <template>
<textarea v-model="ipt"></textarea>
<render-rtf :content="md.render(ipt)"/>
</template>

结语

这样我们的markdwon不但可以使用官方规定的语法,还可以显示自定义组件。

这。。。这不就是第二个语雀了嘛?!

富文本里解析vue、react组件的更多相关文章

  1. 在循环列表的富文本里摘出每个item的img标签内容(适合vue渲染)

    昨天在做公司项目的社区动态内容.后台接口返回的数据是数组套对象,对象里有富文本,然后需要摘出富文本里的img标签在列表里分开渲染(即图片九宫格样式).最终效果如图: 这个是后盾接口返回的json数据 ...

  2. 富文本数据 解析HTML

    后台返回给前端的富文本数据如: { "status": 1, "info": "获取活动数据成功", "data": [ ...

  3. vue富文本(5版本)组件

    <template> <div> <div style="border: 1px solid #ccc; width: 500px"> < ...

  4. ckeditor5富文本编辑器在vue中的使用

    安装依赖: npm install --save @ckeditor/ckeditor5-vue @ckeditor/ckeditor5-build-classic 要创建编辑器实例,必须首先将编辑器 ...

  5. 处理后台传过来的json数据-显示到微信小程序的富文本里

    解析数据: JSON.parse(); 获取 加密的文章内容, 将解密文章内容, 将解密后的img标签的路径换成绝对地址(服务器) 调整图片的大小,

  6. 替换富文本里的px为rem

    var content = '23px' content = content.replace(/(\d+)px/g, function(s, t) { s = s.replace('px', ''); ...

  7. react 富文本编辑器

    5大富文本编辑器今天,富文本编辑器被用于许多应用中,包括简单的博客和复杂的内容管理系统.然而,选择一个并不容易,因为有很多具有不同功能的编辑器. 因此,在这篇文章中,我将评估5个React的富文本编辑 ...

  8. vue集成百度UEditor富文本编辑器

    在前端开发的项目中.难免会遇到需要在页面上集成一个富文本编辑器.那么.如果你有这个需求.希望可以帮助到你 vue是前端开发者所追捧的框架,简单易上手,但是基于vue的富文本编辑器大多数太过于精简.于是 ...

  9. Vue CLI 3+tinymce 5富文本编辑器整合

    基于Vue CLI 3脚手架搭建的项目整合tinymce 5富文本编辑器,vue cli 2版本及tinymce 4版本参考:https://blog.csdn.net/liub37/article/ ...

  10. Jquery会死吗?我为什么不用vue写富文本!

    一.事件背景: 我最近开源了一个个人耗时半年打造的富文本及一套适用于web后台的ui框架,在gitee上受到网友们的关注,部分网友对我采用jquery的技术栈提出了质疑.总结起来:无非是jquery已 ...

随机推荐

  1. 房价预测数据清洗全流程:从数据采集到可视化分析(Python实战)

    在房价预测项目中,数据清洗是至关重要的环节.它不仅决定了模型的准确性,还直接影响后续分析的可靠性.本文将以波士顿房价数据集为例,通过Python的Pandas.Matplotlib等工具,详细讲解数据 ...

  2. Sa-Token v1.42.0 发布 🚀,新增 API Key、TOTP 验证码、RefreshToken 反查等能力

    Sa-Token 是一款 免费.开源 的轻量级 Java 权限认证框架,主要解决:登录认证.权限认证.单点登录.OAuth2.0.微服务网关鉴权 等一系列权限相关问题. 目前最新版本 v1.42.0 ...

  3. Asp.net mvc基础(八)Layout页面的使用

    Layout页面相当于母版页. 使用步骤如下: 1.创建MVC5布局页 @RenderBody()渲染正文部分 @ViewBag.Title表示标题内容 也可以自己定义渲染的部分:比如在布局页中添加@ ...

  4. [VulnHub]DC-1靶场全过程

    DC-1 借鉴我们OnePanda-Sec团队的文章 https://mp.weixin.qq.com/s/BbPkmDiZ-cRleiCqmj114w 靶场搭建 先导入DC-1靶场,并将连接改为NA ...

  5. SpringBoot内容协商(Content Negotiation)

    内容协商 在 HTTP 协议中,内容协商是一种机制,用于为同一 URI 提供资源不同的表示形式,以帮助用户代理指定最适合用户的表示形式(例如,哪种文档语言.哪种图片格式或者哪种内容编码).[^1] S ...

  6. java基础之“获取系统类型,区分Windows和Linux系统”

    一.获取系统类型,区分Windows和Linux系统 // 判断是否是windows系统 System.getProperties().getProperty("os.name") ...

  7. LR_GD_MSE (公式补充)

    上篇是先撸了一把梯度下降的代码, 用来优先 LR 中的 MSE. 核心代码是在求解梯度这一步. # y = wx + b def step_gradient(b_current, w_current, ...

  8. Unity ML-Agents实战指南:构建多技能游戏AI训练系统

    引言:游戏AI训练的技术演进 在<赛博朋克2077>的动态NPC系统到<Dota 2>OpenAI Five的突破性表现中,强化学习正在重塑游戏AI边界.本文将通过Unity ...

  9. 3D Gaussian Splatting 查看工具 splatviz

    3D Gaussian Splatting 仓库自带的 SIBR Viewer 运行对显卡有要求, 需要 CUDA_ARCHITECTURE >= 7.x, 在 RTX 4060Ti 上可以运行 ...

  10. 分享一个异地组网软件,比扬云SD-WAN,在飞牛上使用教程

    上一篇文章https://www.cnblogs.com/yingjiuzou/p/18891935分享了比杨云SD-WAN的一些产品逻辑和收费逻辑,我个人觉得是很务实很诚恳的一家企业和产品. 从这期 ...