wangEditor JSON格式数据展示

wangEditor4 JSON格式数据内容渲染显示

本文主要是将v4版本中以JSON格式存储的数据,显示到其他区域中。

1. 前言

wangEditor提供了getJSON()方法获取编辑器内容的JSON格式数据,而 v4版本新增了通过JSON设置编辑器默认内容的API,如图:
在这里插入图片描述
从而我们可以将编辑的内容以JSON格式存储在服务端中,便于后期的维护和跟踪。但是在将JSON数据内容进行显示时遇到了麻烦,需要将数据转换成浏览器DOM对象或者html字符串才能加载出来。

一开始想wangEditor可能有提供此类api进行转换,结果没找到。然后想到自己手撸转换方法,太麻烦,而开源第三方转换库(html2json)也不太兼容,需要改源码。最后想到,既然wangEditor能将JSON的数据进行回显,那内部肯定实现了一套转换逻辑,于是便有了本文(解决方法看第三节)。

2. wangEditor 源码剖析

(可跳过)直接从setJSON方法入手。根据editor.txt.setJSON这个引用链,沿着入口,一路找到了text/index.ts文件,找到了setJSON方法,如下图:
在这里插入图片描述
const html = getHtmlByNodeList(nodeList).children() 这一行比较明显,进入方法看到返回的是一个自定义的DomElement,在这里插入图片描述
在这里插入图片描述
很明显,这个elems属性就是原生的HTMLElement(含有innerHTML属性),方法就有了

3. 最终实现方法

import getHtmlByNodeList from 'wangeditor/src/text/getHtmlByNodeList';
import { NodeListType } from 'wangeditor/src/text/getChildrenJSON';
import $, { DomElement } from 'wangeditor/src/utils/dom-core';

export const json2html = (nodeList: NodeListType): string => {
    const node: DomElement = getHtmlByNodeList(nodeList).children();
    if (!node) return '';
    const $textElem = $('<div></div>');
    $textElem.replaceChildAll(node);
    return $textElem.elems[0].innerHTML;
};

这个方法需要依赖wangEditor,如果别的项目没有集成wangEditor,但需要使用此功能,可以将核心代码提取出来封装。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
`<TableContainer>` 标签是 Material-UI 库中的一个组件,用于包装 `<Table>` 和 `<TableHead>`、`<TableBody>`、`<TableRow>`、`<TableCell>` 等表格组件,并提供一些额外的属性和样式。要展示 JSON 格式数据,可以使用以下步骤: 1. 引入 Material-UI 库和相关组件。 ```javascript import { TableContainer, Table, TableHead, TableBody, TableRow, TableCell, Paper } from '@material-ui/core'; ``` 2. 定义一个组件,例如 `MyTable`,用于展示表格数据。 3. 在组件中定义一个状态,例如 `data`,用于保存从外部传入的 JSON 格式数据。 4. 在组件的 `render()` 方法中,将 JSON 数据转化为 JSX 代码,生成表头和表格内容,并返回 `<TableContainer>`、`<Table>`、`<TableHead>`、`<TableBody>`、`<TableRow>`、`<TableCell>` 等组件的 JSX 代码。 以下是示例代码: ```javascript import React, { Component } from 'react'; import { TableContainer, Table, TableHead, TableBody, TableRow, TableCell, Paper } from '@material-ui/core'; class MyTable extends Component { constructor(props) { super(props); this.state = { data: props.data // 保存从外部传入的 JSON 数据到组件状态中 }; } render() { const { data } = this.state; // 从组件状态中获取 JSON 数据 if (!data || !data.length) { return null; // 如果 JSON 数据为空,则返回空 } // 生成表头 const columns = Object.keys(data[0]); const tableHeader = columns.map((column, index) => ( <TableCell key={index}>{column}</TableCell> )); // 生成表格内容 const tableBody = data.map((row, index) => ( <TableRow key={index}> {columns.map((column, index) => ( <TableCell key={index}>{row[column]}</TableCell> ))} </TableRow> )); // 返回包装了表格组件的 JSX 代码 return ( <TableContainer component={Paper}> <Table> <TableHead> <TableRow>{tableHeader}</TableRow> </TableHead> <TableBody>{tableBody}</TableBody> </Table> </TableContainer> ); } } export default MyTable; ``` 以上代码中,`data` 是从外部传入的 JSON 格式数据,通过 `this.state` 将其保存到组件状态中。在 `render()` 方法中,先判断传入的 JSON 数据是否为空,如果为空则返回空。然后生成表头和表格内容的 JSX 代码,并返回包装了表格组件的 JSX 代码。最后通过 `export default MyTable` 将组件导出,可以在其他组件中引入并使用。例如: ```javascript import React, { Component } from 'react'; import MyTable from './MyTable'; class App extends Component { constructor(props) { super(props); this.state = { data: [ { name: 'Alice', age: 20, gender: 'Female' }, { name: 'Bob', age: 25, gender: 'Male' }, { name: 'Charlie', age: 30, gender: 'Male' }, ] // 定义 JSON 格式数据 }; } render() { const { data } = this.state; // 从组件状态中获取 JSON 数据 return ( <div> <MyTable data={data} /> // 将 JSON 数据传递给表格组件 </div> ); } } export default App; ``` 以上代码中,在 `App` 组件中定义了 JSON 格式数据,并将其传递给 `MyTable` 组件。在 `MyTable` 组件中,通过 `this.props.data` 获取传入的 JSON 数据

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值