【问题标题】:Pass data from `index.html` to react components从 `index.html` 传递数据以响应组件
【发布时间】:2019-08-10 21:20:49
【问题描述】:

我最近开始了 Web 开发。我被困在这可能是一个微不足道的问题。我试图弄清楚如何将数据从动态创建的index.html 传递到我的(打字稿)反应前端(通过create-react-app 创建)。

假设我们有一个烧瓶网络服务器,当请求“/”资源时,它会收集一些初始用户数据,用它实例化一个页面模板并返回该页面:

# flask webserver
from flask import Flask
from flask import render_template
app = Flask(__name__)

@app.route('/')
def index():
   initial_user_data = {"foo":"bar",
                        "baz":"biz"}
   return render_template('index.html', initial_data=initial_user_data)

if __name__ == '__main__':
   app.run(debug=True)

为简单起见,initial_user_data 在此处存储硬编码数据。在我的实际用例中,字典中填充了从文件等读取的各种特定于用户的数据项。

接下来,假设index.html 使用initial_data

<!DOCTYPE html>
<html lang="en">
  <head>
    ...
    <title>React App</title>
  </head>
  <body>
    <script>
      initial_data = {{initial_data | tojson}}
      console.log(initial_data)
    </script>
    <div id="root"></div>
    ...
  </body>
</html>

当我们现在启动网络服务器并打开浏览器导航到页面的时候可以看到initial_data被记录到浏览器的控制台输出。到目前为止,一切顺利。

现在我的问题是:如何将initial_data 传递给我的(打字稿)反应组件?从概念上讲,我想做这样的事情:

// App.tsx
import React from 'react';

const App: React.FC = () => {
  // make use of 'initial_data'
  const init_data = initial_data;
  return (
    <div ...
    </div>
  );
}

但是yarn build会给我

Cannot find name 'initial_data'.  TS2304

    4 | 
    5 | const App: React.FC = () => {
  > 6 |   const init_data = initial_data;
      |                     ^
    7 |   return (
    8 |     <div className="App">
    9 |       <header className="App-header">

如何让我的 react 组件可以访问 initial_data

编辑:如果这种将index.html(客户端连接时在后端创建)传递给我的打字稿反应组件的模式存在缺陷,那么我也会接受答案在这种情况下,这为我指出了正确的模式。

类似的东西(显然只是编造,只是想说明我的意思)

  1. 定义一个 typescript 数据类型,用于存储可以从所有组件访问的用户数据
  2. 在您的主要反应组件中,使用诸如“componendDidMount”之类的生命周期方法向后端发送请求以获取initial_data
  3. 当响应返回时,将其存储在 1)中

我会接受添加显示一些示例代码的答案 1) 2) 3)

非常感谢您的帮助!

【问题讨论】:

  • initial_data 是全局变量吗?
  • 为什么在你的 html 页面中动态地做任何事情,而不是通过一个响应 json 的端点传递数据?
  • @azium 感谢您的评论。我投了赞成票。你能给我一些示例代码吗?我不明白你的意思。请注意,我刚刚开始使用网络开发。
  • @azium 您是否建议在页面加载后对 API 执行 get/post 请求?
  • @azium 您是否建议在页面加载后点击 API 来加载数据?

标签: reactjs typescript create-react-app


【解决方案1】:

在 React 组件中传递全局变量时,使用 window 对象传递它总是更好的方法。 在这种情况下,您需要将其作为window.initial_data 传递。这会通知 linter 并做出反应,它是一个全局变量。因为它没有在文件中定义。

【讨论】:

  • 赞成您的回答!谢谢。这适用于纯javascript,但打字稿失败(这是我的用例)。如果我正确理解了您的建议,您建议将initial_data 存储在windowindex.html,然后在我的反应代码中阅读它,对吗?这给了我Property 'initial_data' does not exist on type 'Window' 很高兴接受您的回答,一旦我们使用打字稿。
  • 您认为这会解决您的问题吗?我不是 TypeScript 的大师。所以在这里帮不上忙。 stackoverflow.com/questions/38906359/…
  • 谢谢。我通读了答案。据我所知,这些解决方案用于使全局变量可用 .tsx 文件。我的(显然很奇怪)用例是在我的index.html&lt;script&gt; 中写入变量,并在我的tsx 文件中读取变量。再次感谢您的帮助。
  • @Matt:脚本标签中声明的变量是全局变量。它们将可用于其他脚本或控制台。试试console.log(window.initial_data)。您是否尝试使用链接问题中的任何答案?
猜你喜欢
  • 2019-02-27
  • 1970-01-01
  • 2019-06-19
  • 2021-07-19
  • 1970-01-01
  • 2020-06-12
  • 2020-02-20
  • 1970-01-01
  • 2018-12-19
相关资源
最近更新 更多