如何在 ReactJS 中呈现静态 html 页面?

Posted

技术标签:

【中文标题】如何在 ReactJS 中呈现静态 html 页面?【英文标题】:How to render a static html page in ReactJS? 【发布时间】:2019-10-14 19:18:06 【问题描述】:

我正在尝试在反应中呈现 html 页面。我尝试了多种解决方案,但仍然出现错误。是的,我知道有很多与此类似的问题,但这些解决方案都没有对我有用。我使用 reactjs 作为前端,只是试图显示一个静态 html 页面。

html文件如下:

<!DOCTYPE html>

<html>
  <head>
    <title>Ably WebRTC Video call Demo</title>

    <link
      rel="stylesheet"
      href="https://maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap.min.css"
    />
  </head>

  <body>
    <script src="https://cdn.temasys.io/adapterjs/0.15.x/adapter.min.js"></script>

    <script src="https://cdn.temasys.io/adapterjs/0.15.x/adapter.screenshare.js"></script>

    <script src="https://cdn.ably.io/lib/ably.min-1.js"></script>

    <script src="https://cdnjs.cloudflare.com/ajax/libs/simple-peer/9.1.2/simplepeer.min.js"></script>

    <script src="ably-screenshare.js"></script>

    <script src="connection-helper.js"></script>

    <div class="container-fluid" style="margin-top: 5em;">
      <div class="container" id="join">
        <h4 id="online">Users online (0)</h4>

        <ul id="memberList"></ul>
      </div>

      <div class="container" id="call" style="display:none;">
        <video   id="local" controls></video>

        <video   id="remote" controls></video>

        <button class="btn btn-xs btn-danger" onclick="handleEndCall()">
          End call
        </button>
      </div>
    </div>
  </body>

  <style>
    small 
      border-bottom: 2px solid black;
    

    li 
      list-style: none;
    
  </style>
</html>

我尝试过的解决方案是

import React,  Component  from "react";
var __html = require("./screen.html");
var template =  __html: __html ;

class ScreenShare extends Component 
  render() 
    return (
      <div className="screen-share">
        <span dangerouslySetInnerHTML=template />
      </div>
    );
  

export default ScreenShare;

即使使用上述解决方案,我也会收到此错误

./src/components/screenShare/screen.html
Module parse failed: Unexpected token (1:0)
You may need an appropriate loader to handle this file type.
| <!DOCTYPE html>
| 
| <html>

我做错了什么吗?我知道 dangerouslySetInnerHTML 不是解决问题的最佳方法,但我尝试将上面的 html 代码更改为 react 组件,但没有帮助。所以我尝试危险地SetInnerHTML 来转换它,但它仍然给出错误。

【问题讨论】:

重复:***.com/questions/37818401/… Importing html files with es6 template string loader的可能重复 【参考方案1】:

您可以将您的 HTML 静态文件转换为字符串,并使用危险的SetInnerHTML 标记将其传递给您的 div。 然后,如果您再次遇到问题,在这种情况下,您的 HTML 文件可能有一个未定义或不正确的字段。 检查您的 HTML,然后重试。

【讨论】:

您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center。【参考方案2】:

把你的静态文件放在公用文件夹中,然后在你的路由部分放这个:

<Route exact path="/">
   <Redirect push to="/home.html" />
</Route> 

【讨论】:

我测试过,它可以工作。您可以添加重新加载或刷新路由。【参考方案3】:

默认情况下,使用 react 导入 HTML 文件将不起作用。鉴于您的用例和您想走的路线,最好的办法是将 HTML 页面转换为 js 文件,然后导出例如:

html.js 文件

module.exports = `<!DOCTYPE html>

<html>
  <head>
    <title>Ably WebRTC Video call Demo</title>

    <link
      rel="stylesheet"
      href="https://maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap.min.css"
    />
  </head>

  <body>
    <script src="https://cdn.temasys.io/adapterjs/0.15.x/adapter.min.js"></script>

    <script src="https://cdn.temasys.io/adapterjs/0.15.x/adapter.screenshare.js"></script>

    <script src="https://cdn.ably.io/lib/ably.min-1.js"></script>

    <script src="https://cdnjs.cloudflare.com/ajax/libs/simple-peer/9.1.2/simplepeer.min.js"></script>

    <script src="ably-screenshare.js"></script>

    <script src="connection-helper.js"></script>

    <div class="container-fluid" style="margin-top: 5em;">
      <div class="container" id="join">
        <h4 id="online">Users online (0)</h4>

        <ul id="memberList"></ul>
      </div>

      <div class="container" id="call" style="display:none;">
        <video   id="local" controls></video>

        <video   id="remote" controls></video>

        <button class="btn btn-xs btn-danger" onclick="handleEndCall()">
          End call
        </button>
      </div>
    </div>
  </body>

  <style>
    small 
      border-bottom: 2px solid black;
    

    li 
      list-style: none;
    
  </style>
</html>`;

这里,注意module.exports,以及使用的模板字符串,所以你可以这样在你的react页面中调用它:

import React,  Component  from "react";
var __html = require('./index.html.js');
var template =  __html: __html ;

class ScreenShare extends Component 
  render() 
    return (
      <div className="screen-share">
        <span dangerouslySetInnerHTML=template />
      </div>
    );
  

export default ScreenShare;

【讨论】:

如果我删除 html 和 head 标签,它最初允许编译项目。但是还是不解析代码,整个页面崩溃了。 这个答案不是 100% 正确的。由于它使用了 dangerouslySetInnerHTML 它不会运行脚本标签内的代码。为了在 sciprt 标签中运行代码,我使用 react-helmet 组件。

以上是关于如何在 ReactJS 中呈现静态 html 页面?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 ReactJS 中做动态图像?

如何使用 expressJS 提供 ReactJS 静态文件?

如何使用React呈现用户以前的会话?

如何在 ReactJS 中的另一个类中呈现类列表?

reactjs - 状态更改后组件不呈现[重复]

如何在节点中的文本中替换/注入html标签?