reactjs - 如何在 React 应用程序中将 JSON 转换为 Html
问题描述
如何在反应应用程序中将 JSON 转换为带有 html 元素的普通 html?
请注意,如果您不知道要注入的 HTML 字符串中的内容,那么 dangerouslySetInnerHTML 可能会很危险
根据反应文档 -
dangerouslySetInnerHTML 是 React 在浏览器 DOM 中使用 innerHTML 的替代品。一般来说,从代码中设置 HTML 是有风险的,因为很容易无意中将您的用户暴露给跨站点脚本 (XSS) 攻击。所以,你可以直接从 React 中设置 HTML,但你必须输入 dangerouslySetInnerHTML 并使用 __html 键传递一个对象,以提醒自己这是危险的。
我在下面创建了一个代码沙箱: https ://codesandbox.io/s/relaxed-sunset-tlmr2?file=/src/App.js
输出只是呈现为字符串而不是 html 元素。
这是我的代码:
import React from "react";
import "./styles.css";
const blocks = {
time: 1602725895949,
blocks: [
{
type: "header",
data: {
text: "This is a heading",
level: 2
}
},
{
type: "paragraph",
data: {
text: "This is a paragraph"
}
}
]
};
export default function App() {
function convertToHtml({ blocks }) {
console.log(blocks);
var convertedHtml = "";
blocks.map((block) => {
switch (block.type) {
case "header":
convertedHtml += `<h${block.data.level}>${block.data.text}</h${block.data.level}>`;
break;
case "paragraph":
convertedHtml += `<p>${block.data.text}</p>`;
break;
default:
console.log("Unknown block type", block.type);
break;
}
});
return <React.Fragment>{convertedHtml}</React.Fragment>;
}
return (
<div className="App">
<h1>JSON to html below</h1>
{convertToHtml(blocks)}
</div>
);
}
解决方案
当您在 React 中生成 HTML 时,您不想将其视为字符串,而是希望将其视为组件。'<p>${block.data.text}</p>'
您可以返回<p>{block.data.text}</p>
有效的 JSX,而不是返回文字字符串。
我已将您的 switch 语句转换为呈现单个块的函数组件。请注意,null
这是不呈现任何内容的组件的标准返回。对于动态生成 , 等的情况h1
,h2
我将该字符串保存为大写字母变量,以便 React 将其解释为自定义组件而不是内置元素。
export function Block({ type, data }) {
switch (type) {
case "header":
const Element = "h" + data.level;
return <Element>{data.text}</Element>;
case "paragraph":
return <p>{data.text}</p>;
default:
console.log("Unknown block type", type);
return null;
}
}
然后,您可以遍历块数组并将每个块作为道具传递给Block
组件。每当您从循环中返回元素时,如果您没有设置 a ,react 就会引发警告key
,因此我使用数组索引作为键。
export default function App() {
return (
<div className="App">
<h1>JSON to html below</h1>
{blocks.blocks.map((block, i) => (
<Block key={i} {...block} />
))}
</div>
);
}
推荐阅读
- latitude-longitude - 将 ECEF XYZ 转换为 LLH (LAT/LONG/HEIGHT) 和翻译回来 - IronPython 脚本中不准确/可能的错误
- python - 如何为除 TButton 之外的所有 ttk 小部件配置地图?
- ide-customization - 如何扩展 Faktor-IPS 的代码生成以修改生成的代码
- xml - 使用 XSLT 进行 XML 转换
- react-native - 如何在屏幕之间传输数据但不能在本机反应中切换屏幕
- javascript - 用 JSON 替换数组中的键和字符串
- firebase - 将带有列表的 Flutter 对象映射到 Firebase 实时数据库
- amazon-web-services - 如何修改已创建的 IAM 角色的承担角色策略?
- python - 获得时间异常后,我将如何重新启动 Web 驱动程序并继续运行脚本?
- mysql - MySQL 间隙锁行为不符合预期