【问题标题】:Splitting up React components into multiple files将 React 组件拆分为多个文件
【发布时间】:2016-06-11 22:01:00
【问题描述】:

我才一周才学习 React,所以我是新手,我正在尝试编写一个简单的 todo 应用程序。

最初我将所有组件都写在一个文件中,然后将该文件加载到 HTML 文件中,效果很好。现在我正在重构并尝试将组件拆分为不同的文件。

我的完整代码在我的 Github https://github.com/yasgreen93/todolist-react extracting-files 分支上。

我已将每个组件拆分为不同的文件,并在脚本标签中将它们链接到我的 HTML 中。这是我的 HTML 文件的样子:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>Todo List</title>
    <link rel="stylesheet" href="css/styles.css">
    <script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.0.1/react.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.0.1/react-dom.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/babel-core/5.6.16/browser.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.2.2/jquery.min.js"></script>
  </head>

  <body>
    <div id="container"></div>
    <script type="text/babel" src="scripts/components/TodoListApp.js"> </script>
    <script type="text/babel" src="scripts/components/CompleteTodo.js"></script>
    <script type="text/babel" src="scripts/components/TodoList.js"></script>
    <script type="text/babel" src="scripts/components/SingleTodo.js"></script>
    <script type="text/babel" src="scripts/components/AddTodo.js"></script>
    <script type="text/babel" src="scripts/components/CompleteTodoButton.js"></script>

    <script type="text/babel">
      ReactDOM.render(
        <TodoListApp url="/api/todos" updateUrl="/api/todos/update" pollInterval={2000}/>,
        document.getElementById('container')
      );
    </script>
  </body>
</html>

在控制台中,我总是收到错误消息Uncaught ReferenceError: TodoListApp is not defined。我尝试以不同的顺序加载它们但没有成功。我还观看了许多视频,他们在不使用 webpack 的情况下使用非常相似的方法,并且对他们有用。我想先在不使用 webpack 的情况下让它工作,然后继续学习。

谁能看出我哪里出错了?

【问题讨论】:

    标签: javascript html reactjs


    【解决方案1】:

    您必须将组件添加到全局 window 变量中才能在 html script 标记中使用它们。喜欢window.TodoListApp =...var 声明与您声明它的文件相关。

    但是将部分代码公开到全局范围并在浏览器中转换 JSX 被认为是一种不好的做法。相反,您应该考虑使用一些构建系统,例如Webpack

    这样您就可以使用es2015 import syntax 将组件从一个文件导入到另一个文件,将所有内容捆绑在一个文件中,以及更多其他好处,例如代码压缩、源映射、livereload 等。

    Setting up React for ES6 with Webpack and Babel

    Using React with Webpack Tutorial

    【讨论】:

    • 感谢您的建议。我没有使用您提供的资源都在使用的 ES6。它仍然适用于 ES5 吗?
    • 是的。只是不要使用 babel loader 并使用常规节点 CommonJS 模块 - webpack.github.io/docs/commonjs.html
    • 我同意作者的观点。对于不那么陡峭的学习曲线,必须可以在没有 webpack 的情况下做到这一点。
    猜你喜欢
    • 1970-01-01
    • 2013-08-24
    • 2016-02-07
    • 2014-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多