12

我正在为 MobX 看这个小提琴,我也看到了这两种在 ES6 其他地方定义 React 组件的方法,比如 Dan Abramov 的 egghead redux 视频系列。

@observer
class TodoListView extends Component {
    render() {
        return <div>
            <ul>
                {this.props.todoList.todos.map(todo => 
                    <TodoView todo={todo} key={todo.id} />
                )}
            </ul>
            Tasks left: {this.props.todoList.unfinishedTodoCount}
        </div>
    }
}

const TodoView = observer(({todo}) =>
    <li>
        <input
            type="checkbox"
            checked={todo.finished}
            onClick={() => todo.finished = !todo.finished}
        />
        <input
            type="text"
          value={todo.title}
          onChange={ e => todo.title = e.target.value } />
    </li>
);

我的问题是,什么时候适合使用每种类型?

似乎更简单的组件能够使用更简单的语法,但我希望遵循规则或指南。

谢谢!

4

2 回答 2

19

第二种模式称为“无状态功能组件”,几乎在所有情况下都建议使用它。SFC(无状态功能组件)是纯函数,仅依赖于它们的props. 它们更容易测试,彼此分离,并且在未来将比其他模式有显着的性能提升。(来自官方 react 文档)

他们有一些陷阱,即:

  • 不能将refs 附加到 SFC。(源2
  • 他们不能有内部状态。()
  • 他们不能使用生命周期方法。(例如componentDidMountsrc

如果你需要这些东西,首先确保没有办法使用它们,然后才使用 ES6classReact.createClass模式。


我强烈推荐“我应该使用 React.createClass、ES6 类还是无状态功能组件?” James K Nelson 了解这些模式之间的权衡和差异,以及Dan Abramov 的“Presentational and Container Components”解释了 Redux 应用程序最常用的结构。

于 2016-03-01T14:36:06.560 回答
0

React.createClass VS ES2015 类 VS 功能性无状态组件

在 React 中,创建新组件有 3 种主要方式。

与 React 库一起引入的第一个是 React.createClass,它具有以下语法:

var TestComponent = React.createClass({
 render: function(){
      return <p>{this.props.children}</p>;
 }
})

React.render(<TestComponent>This will be a paragraph element!</TestComponent>, document.body);

之后,在 React 0.13 版本中,我们可以直接将我们的组件定义为 ES2015 类:

class TestComponent extends React.Component {
 render () {
      return <p>{this.props.children}</p>;
 }
}

React.render(<TestComponent>This will be a paragraph element!</TestComponent>, document.body);

React 0.14 引入了创建称为无状态组件的能力,也称为函数式或纯组件,因为它们被声明为没有状态的函数,并且在给定相同的 props 的情况下返回相同的标记:

const TestComponent = (props) => <p>props.children</p>;

ReactDOM.render(<TestComponent>This will be a paragraph element!</TestComponent>, 
document.querySelector('#root'));

这些无状态组件对于 React 渲染来说要轻得多,并且还具有与 React 无关的优势,这意味着它们可以在给定相同输入的情况下以任何其他方式渲染,并产生相同的输出。

所以你应该在你的应用程序中使用什么取决于。每个都有其优点和缺点,应在某些条件下使用。有时您不能使用无状态组件。

当您的组件需要生命周期方法或者您需要访问“this”以获得除 props 之外的任何内容时,请使用 ES2015 (ES6) 类或 React.createClass。

于 2018-09-27T15:10:22.040 回答