未捕获的ReferenceError:未定义React

sky*_*123 64 javascript ruby-on-rails reactjs

我正在尝试使用教程使ReactJS与rails配合使用.我收到此错误:


Uncaught ReferenceError: React is not defined

但我可以在浏览器控制台中访问React对象在此输入图像描述
我还添加了public/dist/turbo-react.min.js,如此处所述,//= require components在application.js中添加了一行,如本答案所述,没有运气.另外,
var React = require('react')给出错误:
Uncaught ReferenceError: require is not defined

任何人都可以建议我如何解决这个问题?

[编辑1]
参考源代码:
这是我的comments.js.jsx文件:

var Comment = React.createClass({
  render: function () {
    return (
      <div className="comment">
        <h2 className="commentAuthor">
          {this.props.author}
        </h2>
          {this.props.comment}
      </div>
      );
  }
});

var ready = function () {
  React.renderComponent(
    <Comment author="Richard" comment="This is a comment "/>,
    document.getElementById('comments')
  );
};

$(document).ready(ready);
Run Code Online (Sandbox Code Playgroud)

这是我的index.html.erb:

<div id="comments"></div>
Run Code Online (Sandbox Code Playgroud)

小智 68

当我使用webpack在我的下面使用以下块构建我的javascript时,我能够重现此错误webpack.config.json:

externals: {
    'react': 'React'
},
Run Code Online (Sandbox Code Playgroud)

上面的配置require('react')通过加载npm模块告诉webpack不解决,而是期望window调用一个全局变量(即在对象上)React.解决方案是删除这段配置(因此React将与您的javascript捆绑在一起)或在执行此文件之前在外部加载React框架(这样就window.React存在).

  • 这是如何被接受的答案?它没有回答问题。它不回答任何问题,只是重申问题。 (5认同)
  • 删除此配置为我解决了问题。 (2认同)

Jka*_*nen 49

如果您使用的是 Babel 和 React 17,则可能需要将 "runtime": "automatic" 添加到配置中。

 {
     "presets": ["@babel/preset-env", ["@babel/preset-react", {
        "runtime": "automatic"
     }]]
 }
Run Code Online (Sandbox Code Playgroud)

  • &lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;2021年唯一的真相。&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt; (5认同)
  • 对于那些喜欢更多解释的人:(信用 Chat-GPT):`@babel/preset-react` 是一个 Babel 预设,它将 React JSX 语法转换为纯 JS。添加 `{"runtime": "automatic"}` 启用新的 JSX 转换 [在 React 17 中引入],它使用 React 运行时为 JSX 表达式生成必要的代码。这消除了 React 处于范围内的需要,并允许更好的优化,[例如生成更少的代码并减少总包大小]。默认的经典转换要求“React”对象位于范围内。 (4认同)
  • 我可以确认。 (2认同)

Aks*_*pta 35

我收到此错误是因为我正在使用

import ReactDOM from 'react-dom'
Run Code Online (Sandbox Code Playgroud)

没有导入反应,一旦我将其更改为以下:

import React from 'react';
import ReactDOM from 'react-dom';
Run Code Online (Sandbox Code Playgroud)

错误已解决:)

  • 作品!来自像 Python 这样的语言有点出乎意料。如果我只在主文件中使用 `ReactDOM`,我想我可以(并且应该)摆脱对 `React` 的引用。呵呵,学到东西了。 (2认同)

J S*_*osh 33

可能的原因是1.您没有将React.JS加载到您的页面中,2.您将上述脚本加载到您的页面中.解决方案是在上面显示的脚本之前加载JS文件.

PS

可能的解决方案.

  1. 如果你react在webpack配置中提到externals部分,那么你必须先将反应js文件直接加载到你的html中bundle.js
  2. 确保你有线 import React from 'react';


Jep*_*hir 31

如果您使用的是Webpack,则可以在需要时加载React,而无需require在代码中明确表示.

添加到webpack.config.js:

plugins: [
   new webpack.ProvidePlugin({
      "React": "react",
   }),
],
Run Code Online (Sandbox Code Playgroud)

http://webpack.github.io/docs/shimming-modules.html#plugin-provideplugin


小智 20

尝试添加:

import React from 'react'
import { render } from 'react-dom'
window.React = React
Run Code Online (Sandbox Code Playgroud)

render()函数之前。

这有时可以防止错误弹出返回:

反应未定义

添加React到窗口将解决这些问题。


Ima*_*eem 9

添加到Santosh:

你可以加载React

import React from 'react'
Run Code Online (Sandbox Code Playgroud)


pra*_*ush 6

我知道这个问题已经有了答案。但由于对我有用的内容并不完全在答案中,因此我将其添加到此处,希望对其他人有用。

index.js当我得到时,我的文件看起来像这样Uncaught ReferenceError: React is not defined

import {render} from 'react-dom';
import App from './App';

render(<App />, document.getElementById("root"));
Run Code Online (Sandbox Code Playgroud)

import React from 'react';在文件顶部添加修复了它。

现在我的index.js看起来像这样,我在控制台上没有收到任何错误。

import React from 'react';
import {render} from 'react-dom';
import App from './App';

render(<App />, document.getElementById("root"));
Run Code Online (Sandbox Code Playgroud)

请注意,我没有在 webpack.config.js 或其他任何地方进行任何更改来实现此功能。


Abr*_*esh 5

import React, { Component, PropTypes } from 'react';
Run Code Online (Sandbox Code Playgroud)

这也可能有效!