React.Component 是导出时的默认扩展吗?

IT技术 javascript reactjs ecmascript-6
2021-05-06 18:55:02

我正在浏览一些 React 项目,有时会看到-

export default () => {

但其他时候我看到——

export default class Entry extends React.Component {.

两者之间有什么区别,即。导出会自动扩展React.Component吗?最佳做法是什么?

2个回答

export default () =>你看到的是一个阵营0.14+ “功能组件”

这是一种用于编写 React 组件的更简洁的新语法。它和其他语法都很好。

这些组件的行为就像一个 React 类,只定义了一个渲染方法。由于没有为功能组件创建组件实例,因此添加到一个的任何 ref 将评估为 null。函数式组件没有生命周期方法,但您可以将 .propTypes 和 .defaultProps 设置为函数的属性。

基本上做:

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

是相同的:

const MyComponent = () => <p>Hello</p>;

当在 React 组件内部使用并传递给 Render 时。

第一个是功能组件。然而,其他代码将导出一个常规类/React 组件。

例如

export default (withHistory, onUpdate) => {
    const history = new HashHistory;
  return (
    <Router history={history} onUpdate={onUpdate}>
      <Route path='/' component={Index} />
    </Router>
  );
};

将编译(至少使用 Babel+webpack)

...
var _reactRouterLibHashHistory = __webpack_require__(35);
var _reactRouterLibHashHistory2 = _interopRequireDefault(_reactRouterLibHashHistory);
exports['default'] = function (withHistory, onUpdate) {
      var history = new _reactRouterLibHashHistory2['default']();
      return React.createElement(
        _reactRouter.Router,
        { history: history, onUpdate: onUpdate },
        React.createElement(_reactRouter.Route, { path: '/', component: _routesIndex2['default'] })
      );
    };
module.exports = exports['default'];
...