【发布时间】:2020-12-30 17:10:37
【问题描述】:
我正在制作一个简单的 React 应用程序,其中有一个 app.tsx 文件,代码如下,
export default function App() {
const initializeData = () => {
const dataScript = document.createElement("script");
dataScript.type = "text/javascript";
dataScript.textContent = `
let data = { 'name': "" };`;
document.head.appendChild(dataScript);
};
React.useEffect(() => {
initializeData();
}, []);
return (
<div className="App">
{console.log(data)}
<h1>Hello CodeSandbox</h1>
<h2>Start editing to see some magic happen!</h2>
</div>
);
}
-> 其中 initializeData 方法将初始化全局数据,并且可用于所有其他页面(考虑到所有组件都将在 app.tsx 中调用) .
->从useEffect生命周期钩子中调用方法,如,
React.useEffect(() => {
initializeData();
}, []);
-> 尝试console.log 模板中的数据之类的,
return (
<div className="App">
{console.log(data)}
<h1>Hello CodeSandbox</h1>
<h2>Start editing to see some magic happen!</h2>
</div>
);
错误:
这一行 {console.log(data)} 抛出错误,因为数据未定义
要求:
需要在全局级别进行变量声明,以便这些变量可用于所有文件。
请记住这一点,我尝试将其分配到 head 标签内的 script 标签中,但这在打字稿中显示错误。
请帮助我了解如何分配全局变量并在任何文件中访问它..
【问题讨论】:
-
“需要在全局级别声明变量,以便这些变量可用于所有文件。” 在现代 JS/TS 页面或应用程序中完全使用全局变量是如果没有非常 强烈的理由这样做,这不是最佳实践,但在组件挂载时创建全局变量绝不是一个好主意。无论您的基本要求是什么,我强烈建议您找到另一种解决方法。理想情况下,根本不要使用全局变量(在一个有模块的世界里你真的不需要),但如果你不能避免它,至少在加载模块时创建它,而不是在安装组件时创建它。
-
@T.J.Crowder,我正在使用这样的方式来处理页面的 adobe 分析。我正在使用 npmjs.com/package/react-metrics 来跟踪事件,为此我需要设置一个全局变量和它会在每个页面上发生变化。就像我们访问的任何页面一样,页面名称(以及其他数据)将被传递给指标跟踪功能。
-
我在 npm 页面上没有看到任何提示您需要使用全局变量的信息。我确实看到它说您需要通过调用
metrics来包装您的应用程序组件,您似乎没有在上面这样做。 (我的猜测是这样做是为了设置context 以便MetricsElements 等可以使用,但这只是一个猜测。)但我不想来回讨论是否需要全局变量。你的问题是关于为什么data不存在,我在下面回答了这个问题。编码愉快! -
看起来像一个 XY 问题xyproblem.info,你问的是你的尝试而不是解决真正的问题
标签: reactjs typescript