正如他们所说,给猫剥皮的方法不止一种。碰巧,创建 React 组件的方法也不止一种,它对动物更友好!
最初发布 React 时,没有惯用的方式在 JavaScript 中创建类,因此提供了 'React.createClass'。
后来,类作为 ES2015 的一部分被添加到该语言中,其中添加了使用 JavaScript 类创建 React 组件的能力。除了功能组件,JavaScript 类现在是在 React 中创建组件的首选方式。
对于现有的“createClass”组件,建议您将它们迁移到 JavaScript 类。但是,如果您有依赖于 mixin 的组件,则转换为类可能不会立即可行。如果是这样,可以在 npm 上使用 create-react-class 作为替代品。
最简单的 React 组件版本是一个普通的 JavaScript 函数,它返回一个 React 元素:
功能组件:
function Label() {
return <div>Super Helpful Label</div>
}
当然,有了 ES6 的奇迹,我们可以把它写成箭头函数。
const Label = () => <div>Super Helpful Label</div>
这些是这样使用的:
const Label = () => <div>Super {props.title} Helpful Label</div>
class App extends React.Component {
constructor(props) {
super(props)
}
render() {
return (
<div>
<Label title="Duper" />
</div>
)
}
}
ReactDOM.render(<App />, document.getElementById('root'))
使用函数,您还可以解构函数签名中的属性。
它使您不必一遍又一遍地编写道具。
组件也可以是 ES6 类。如果您希望您的组件具有本地状态,那么您需要有一个类组件。类还有其他优点,例如能够使用生命周期挂钩和事件处理程序。
类组件:
class Label extends React.Component {
constructor(props) {
super(props)
}
render() {
return <div>Super {this.props.title} Helpful Label</div>
}
}
class App extends React.Component {
constructor(props) {
super(props)
}
render() {
return (
<div>
<Label title="Duper" />
</div>
)
}
}
ReactDOM.render(<App />, document.getElementById('root'))
这两种风格各有利弊,但功能组件在可预见的未来将取代现代 React。
功能组件编写得更短更简单,这使得开发、理解和测试更容易。
类组件可能会与 this 的许多用途混淆。使用函数式组件可以轻松避免这种混乱并保持一切整洁。
React 团队正在支持更多用于替换甚至改进类组件的函数式组件的 React 钩子。 React 团队提到在早期,他们将通过避免不必要的检查和内存分配来优化功能组件的性能。
尽管听起来很有希望,但最近为功能组件引入了新的钩子,例如 useState 或 useEffect 同时还承诺它们不会废弃类组件。团队正在寻求在较新的案例中逐步采用带钩子的函数式组件,这意味着无需将现有的利用类组件的项目切换到使用函数式组件进行整个重写,从而保持一致。