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. eolinker同一个自动化用例内执行不同端接口遇到的问题(主要是两套host环境共存的问题)解决方法

    特别注意:需要使用全局变量或者预处理前务必阅读本链接https://www.cnblogs.com/becks/p/13713278.html eolinker内同一套环境只能配置一个host地址,如 ...

  2. 康谋技术 | 揭秘汽车功能的核心——深度解读ADTF中的过滤器图

    在汽车领域,ADTF(Automotive Data and Time-Triggered Framework)是一个强大的工具,用于开发切实可行的汽车功能和复杂的应用程序,实现数据的转换.记录和可视 ...

  3. 17.8K star!完美超越宝塔的产品,像呼吸一样部署应用,这款开源神器绝了!

    嗨,大家好,我是小华同学,关注我们获得"最新.最全.最优质"开源项目和高效工作学习方法 Dokploy是一个强大的开源平台,旨在简化全栈 Web 应用的开发和部署.通过其直观的界面 ...

  4. SpringBoot配置@ConfigurationProperties(prefix = "pig")时中文乱码

    问题出现 通过@ConfigurationProperties(prefix = "pig")注解进行属性绑定的时候,application.properties文件中出现中文,从 ...

  5. eclipse中那些难以分辨的符号、Java中的Long和mysql中的bigint

    这是一个字符串 从左到右依次是数字"0", 大写字母"O",小写字母"o",数字"1",小写字母"l(艾欧)& ...

  6. 使用DbUtils和dbcp连接池写的通用的CRUD工具类

    目录 1 项目目录结构 2 工具类需要的jar包 2.1 Dbutils需要的jar包 2.2 dbcp需要的jar包 2.3 数据库jar包 3 代码部分 3.1 dbcp.properties 3 ...

  7. 读书笔记:深度工作(deep work)

    读书笔记:深度工作(deep work) 目录 读书笔记:深度工作(deep work) 第一部分:The Idea 第二部分:The Rules 准则一:工作要深入 准则二:拥抱无聊 准则三:远离社 ...

  8. Github Copilot 实战: 从零开始用AI写一个OCR工具 (3)

    源码 https://github.com/densen2014/Blazor100/tree/master/AI/MiOcr 添加一个屏幕截图功能,显示截图起始点,结束点,截图区域,按键ESC取消截 ...

  9. Spring注解之@Autowired:按类型自动装配Bean到数组、集合和Map

    在Spring Boot项目中,如何把某些接口的多个实现类的Bean注入到Arrays, java.util.Collection 和 java.util.Map类型的变量中,方便应用的时候直接读取? ...

  10. python获取地理位置

    废话不多说,直接上代码 1 from urllib.request import urlopen 2 my_ip = urlopen('http://ip.42.pl/raw').read() 3 4 ...