【问题标题】:What is the purpose of 'export' in React component declaration?React 组件声明中“导出”的目的是什么?
【发布时间】:2016-11-07 17:36:32
【问题描述】:

在 React (ES6) 中,为什么我有时会看到这个?...

class Hello extends React.Component { ... }

有时这个

export class Hello extends React.Component { ... }

export 关键字的意义是什么?如果使用 webpack,是否需要对 webpack.config.js 文件进行任何更改?

任何有关这方面的信息将不胜感激,在此先感谢。


更新:

ma​​in-file.js

import React from 'react';
import ReactDOM from 'react-dom';

import { External } from './external';

class Hello extends React.Component {
  render() {
    return <div>

      <h1>Hello World (Main File this time)</h1>
      <External />

    </div>
  }
}

ReactDOM.render(<Hello/>, document.getElementById('main'));

external.js(同一目录)

export class External extends React.Component {
  render() {
    return <div>This is my external component</div>
  }
}

这不起作用 - 你知道为什么吗??

【问题讨论】:

  • 这种面向编程组件或模块化方式,当您放入路径 webpack 配置文件时会自动读取您的依赖项并包含它们。通过这种方式,它可以让您进行更清洁和有组织的编程(从我的角度来看)
  • 你应该谷歌“ES6模块语法”。
  • 对不起,你是说“出口”更干净吗?你能比较一下你必须在webpack.config 中包含的内容吗?没有它?
  • export 可以与任何东西一起使用;不仅仅是一个反应组件。只需了解导出,您就会了解它如何适用于任何使用它的代码。
  • @Paulos3000 你只添加一个文件依赖(webpack.config)With module.exports = {    entry:. '/ routes.jsx' 例如,routes.jsx 文件包含主要模块。这是一个例子。有不同的方法,这是我用来制作包含所有模块的文件的一种方法。

标签: javascript reactjs export ecmascript-6 components


【解决方案1】:

在解释 export 关键字之前,让我先向您澄清一些事情。


正如您在互联网上看到的那样,在每个 React 应用程序中,您需要使用两个重要的东西:

1/ 通天塔

2/ webpackbrowserify

说明

什么是 Babel 工作?

您可能听说过jsxES6

嗯,Babel 的工作是将jsx 转换为 js 并将 ES6 转换为 ES5,以便浏览器可以理解这两件事。

export 关键字是 ES6 中的一项新功能,让您可以导出您的 functionsvariables,以便您可以在其他 js 文件中访问它们。

即:

hello.js

export default class Hello extends React.Component {
  render() {
    return <div>Hello</div>
  }
}

world.js

import { Hello } from './hello';

class World extends React.Component {
  render() {
    return <div><Hello /> world</div>; // jsx sytanx.
  }
}

什么是 webpack 作业?

Webpack 是一个模块打包器。它接收一堆资产(即hello.jsworld.js 和您的模块(react、react-dom....))并将其转换为一个文件。

即:

假设我们对webpack 有以下配置

// dont need to set hello.js as an entry because we already import it into world.js
module.exports = {

  entry: [
    './src/world.js'  
  ],
  output: {
    path: __dirname,
    publicPath: '/',
    filename: 'bundle.js'
  }
};

webpack 它将你所有的 js 文件和你的模块导入到一个单一的文件 bundle.js

编辑:解决问题

jsx

始终将返回的 html 包装到 ()

...
render() {
  return (
    <div>
      <h1>Hello World (Main File this time)</h1>
      <External />
    </div>
  )
}
...

【讨论】:

  • 谢谢,这很有帮助而且非常清楚,但是当我尝试时,它似乎破坏了渲染过程。请查看我原来帖子的更新...
  • 谢谢,但还是不行!只要从我的main-file.js 中删除import { External } from './external';&lt;External /&gt;,它就会再次起作用。因此,external.js 或上面的 import 语句仍然存在问题...:/(external.js 与我的原始帖子中完全相同...复制并粘贴)
  • 只需删除 {} 并尝试此 import External from './external' 并在 external 中导入 react
  • 不。依然没有。仅供参考...我的 main-file.js 和 external.js 都在同一个目录中(以防有所不同)。
  • 您可以看看这个gist 并尝试一下吗?
【解决方案2】:

导出值允许您将其导入到另一个文件中。

如果我从hello.js 文件中导出这个类:

// hello.js
export class Hello extends React.Component { ... }

然后我可以导入它并在greeting.js文件中使用它。

// greeting.js
import { Hello } from './hello';

export class Greeting extends React.Component {
  render() {
    return <Hello />;
  }
}

这并不特定于 React,您可以使用此语法在任何类型的 JavaScript 应用程序中导入和导出任何类型的值。

使用Babel 之类的工具将其转换为可以在浏览器中运行的代码后,您可以使用 Webpack 之类的工具将您使用过的所有模块捆绑到一个脚本文件中,供您使用浏览器。

这种用于导入和导出的模块语法还为导出“默认”值的模块提供了有用的简写。

// hello.js
export default class Hello extends React.Component { ... }

// greeting.js
import Hello from './hello';

如果您的模块只导出一个值,通常您会希望使用此表单。

【讨论】:

  • 也为“default”添加示例.. :)
  • 是的,export default 对于组件来说会更惯用
  • 仅供参考 - 目前export 不支持任何网络浏览器。 export关键字详情here.
猜你喜欢
  • 1970-01-01
  • 2019-03-19
  • 2019-11-25
  • 2011-08-14
  • 2019-03-02
  • 2016-11-28
  • 2012-07-13
  • 2013-05-17
  • 1970-01-01
相关资源
最近更新 更多