首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在React中呈现div和脚本标记?

如何在React中呈现div和脚本标记?
EN

Stack Overflow用户
提问于 2021-02-25 19:58:37
回答 4查看 65关注 0票数 1

react应用程序收到了一个可视化代码,我使用unescape函数来获取字符串形式的HTML代码。该字符串具有一个div标记,并使用可视化的id和script标记,该标记由用于生成可视化的javascript组成。

代码语言:javascript
复制
import React from "react";
import parse from "html-react-parser";

export default function App() {
  // This code is received from the backend
  const vizCode =
    "%3Cdiv%20id%3D'chartdiv_1614071920146'%3E%3C%2Fdiv%3E%3Cscript%20type%3D'text%2Fjavascript'%3E%20var%20width_1614071920146%20%3D%20700%3Bvar%20height_1614071920146%20%3D%20700%3Bvar%20chart_1614071920146%20%3D%20c3.generate(%7Bbindto%3A%20'%23chartdiv_1614071920146'%2C%20size%3A%20%7B%20width%3A%20(width_1614071920146%20-%2020)%2C%20height%3A%20(height_1614071920146%20-%2020)%20%7D%2C%20data%3A%20%7Bcolumns%3A%20%5B%20%5B'%20'%2C%201.0%2C%201.0%2C%203.0%2C%205.0%2C%205.0%5D%20%5D%2C%20type%3A%20'spline'%7D%2C%20legend%3A%20%7Bshow%3Afalse%7D%2C%20axis%3A%20%7B%20x%3A%20%7B%20type%3A%20'category'%2C%20categories%3A%20%5B'New%20Course'%2C'group%20course%201'%2C'Testkurs%20'%2C'test_course'%2C'Moodle4CollaborativeMOOCs'%5D%20%7D%20%7D%7D)%3B%3C%2Fscript%3E";
  const unescapedVizCode = unescape(vizCode);
  console.log(unescapedVizCode);
  // Output ->  var width_1614071920146 = 700;var height_1614071920146 = 700;var chart_1614071920146 = c3.generate({bindto: '#chartdiv_1614071920146', size: { width: (width_1614071920146 - 20), height: (height_1614071920146 - 20) }, data: {columns: [ [' ', 1.0, 1.0, 3.0, 5.0, 5.0] ], type: 'spline'}, legend: {show:false}, axis: { x: { type: 'category', categories: ['New Course','group course 1','Testkurs ','test_course','Moodle4CollaborativeMOOCs'] } }}); 

  let objectData = parse(unescapedVizCode);
  let divData = objectData[0];
  let scriptData = objectData[1].props.dangerouslySetInnerHTML.__html;

  return (
    
      {objectData}
    
  );
}

在这里,我提供了codesandbox链接

我使用了dangerouslySetInnerHtml显示可视化,但无法可视化图表。我已经在公用文件夹中添加了一个test.html,以便在浏览器中显示可视化效果。任何帮助都是非常感谢的。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2021-02-25 21:19:08

React/JSX不处理脚本标记。您必须显式地加载它。我建议您在组件可用时使用钩子。

代码语言:javascript
复制
useEffect(() => {
    const script = document.createElement('script');
    script.innerHTML = scriptData;
    document.getElementById('root').appendChild(script);
    return () => {
      document.getElementById('root').removeChild(script);
    };
  }, []);

以下是工作示例:https://codesandbox.io/s/render-c3d3-charts-in-react-forked-4xkt9?file=/src/App.js

顺便说一句。请不要使用‘un转义’,它已被弃用。请改用“decodeURIComponent”。

票数 2
EN

Stack Overflow用户

发布于 2021-02-25 20:26:15

好的,这个答案就是你想要的,但是我必须说:只有当你100%知道vizCode来自哪里并且它是可信的时,才能使用这个答案!请务必查看不应使用eval的原因

您的问题是,浏览器没有执行脚本内容。我试过你的沙箱,当我添加了

代码语言:js
复制
eval(scriptData)

下面是为我工作的完整代码:

代码语言:javascript
复制
export default function App() {
  // This code is received from the backend
  const vizCode =
    "%3Cdiv%20id%3D'chartdiv_1614071920146'%3E%3C%2Fdiv%3E%3Cscript%20type%3D'text%2Fjavascript'%3E%20var%20width_1614071920146%20%3D%20700%3Bvar%20height_1614071920146%20%3D%20700%3Bvar%20chart_1614071920146%20%3D%20c3.generate(%7Bbindto%3A%20'%23chartdiv_1614071920146'%2C%20size%3A%20%7B%20width%3A%20(width_1614071920146%20-%2020)%2C%20height%3A%20(height_1614071920146%20-%2020)%20%7D%2C%20data%3A%20%7Bcolumns%3A%20%5B%20%5B'%20'%2C%201.0%2C%201.0%2C%203.0%2C%205.0%2C%205.0%5D%20%5D%2C%20type%3A%20'spline'%7D%2C%20legend%3A%20%7Bshow%3Afalse%7D%2C%20axis%3A%20%7B%20x%3A%20%7B%20type%3A%20'category'%2C%20categories%3A%20%5B'New%20Course'%2C'group%20course%201'%2C'Testkurs%20'%2C'test_course'%2C'Moodle4CollaborativeMOOCs'%5D%20%7D%20%7D%7D)%3B%3C%2Fscript%3E";
  const unescapedVizCode = unescape(vizCode);
  console.log(unescapedVizCode);

  let objectData = parse(unescapedVizCode);
  let divData = objectData[0];
  let scriptData = objectData[1].props.dangerouslySetInnerHTML.__html;
  useEffect(()=>{
    eval(scriptData)
  }, [scriptData])
  return (
    
      {objectData}

    
  );
}
票数 1
EN

Stack Overflow用户

发布于 2021-02-25 20:14:08

我不确定它是否满足您的要求,但您可以使用window.open

要在其中呈现HTML代码,请执行以下操作iFrame或在新选项卡中。

要在其中打开,请执行以下操作iFrame使用以下代码:

代码语言:javascript
复制
const unescapedVizCode = unescape(vizCode);
window.open(unescapedVizCode, "myFrame");
return (


  {objectData}

);

或者,您可以在新选项卡中打开:

代码语言:javascript
复制
const unescapedVizCode = unescape(vizCode);
window.open(unescapedVizCode, "_blank");
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66368038

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档