为什么会出现React Hooks?
原文:https://dev.to/tylermcginnis/why-react-hooks-51lj....
译者:前端技术小哥当你要学习一个新事物的时候,你应该做的第一件事就是问自己两个问题
- 1、为什么会存在这个东西?
- 2、这东西能解决什么问题?
如果你从来没有对这两个问题都给出一个令人信服的答案,那么当你深入到具体问题时,你就没有足够的坚实的基础。关于React Hooks,这些问题值得令人思考。当Hooks发布时,React是JavaScript生态系统中最流行、最受欢迎的前端框架。尽管React已经受到高度赞扬,React团队仍然认为有必要构建和发布Hooks。在不同的Medium帖子和博客文章中纷纷讨论了(1)尽管受到高度赞扬和受欢迎,React团队决定花费宝贵的资源构建和发布Hooks是为什么和为了什么以及(2)它的好处。为了更好地理解这两个问题的答案,我们首先需要更深入地了解我们过去是如何编写React应用程序的。
createClass
如果你已经使用React足够久,你就会记的React.createClassAPI。这是我们最初创建React组件的方式。用来描述组件的所有信息都将作为对象传递给createClass。
const ReposGrid = React.createClass({ getInitialState () { return { repos: [], loading: true } }, componentDidMount () { this.updateRepos(this.props.id) }, componentDidUpdate (prevProps) { if (prevProps.id !== this.props.id) { this.updateRepos(this.props.id) } }, updateRepos (id) { this.setState({ loading: true }) fetchRepos(id) .then((repos) => this.setState({ repos, loading: false })) }, render() { const { loading, repos } = this.state if (loading === true) { return <Loading /> } return ( <ul> {repos.map(({ name, handle, stars, url }) => ( <li key={name}> <ul> <li><a href={url}>{name}</a></li> <li>@{handle}</li> <li>{stars} stars</li> </ul> </li> ))} </ul> ) } })
createClass
是创建React组件的一种简单而有效的方法。React最初使用createClassAPI
的原因是,当时JavaScript没有内置的类系统。当然,这最终改变了。在ES6中, JavaScript引入了class关键字,并使用它以一种本机方式在JavaScript中创建类。这使React处于一个进退两难的地步。要么继续使用createClass,对抗JavaScript的发展,要么按照EcmaScript标准的意愿提交并包含类。历史表明,他们选择了后者。
React.Component
我们认为我们不从事设计类系统的工作。我们只想以任何惯用的JavaScript方法来创建类。-React v0.13.0发布
Reactiv0.13.0引入了React.ComponentAPI
,允许您从(现在)本地JavaScript类创建React组件。这是一个巨大的胜利,因为它更好地与ECMAScript标准保持一致。
class ReposGrid extends React.Component { constructor (props) { super(props) this.state = { repos: [], loading: true } this.updateRepos = this.updateRepos.bind(this) } componentDidMount () { this.updateRepos(this.props.id) } componentDidUpdate (prevProps) { if (prevProps.id !== this.props.id) { this.updateRepos(this.props.id) } } updateRepos (id) { this.setState({ loading: true }) fetchRepos(id) .then((repos) => this.setState({ repos, loading: false })) } render() { if (this.state.loading === true) { return <Loading /> } return ( <ul> {this.state.repos.map(({ name, handle, stars, url }) => ( <li key={name}> <ul> <li><a href={url}>{name}</a></li> <li>@{handle}</li> <li>{stars} stars</li> </ul> </li> ))} </ul> ) } }
尽管朝着正确的方向迈出了明确的一步,React.Component并不是没有它的权衡
构造函数
使用类组件,我们可以在constructor
方法里将组件的状态初始化为实例(this)上的state属性。但是,根据ECMAScript规范,如果要扩展子类(在这里我们说的是React.Component),必须先调用super,然后才能使用this。具体来说,在使用React时,我们还须记住将props传递给super。
constructor (props) { super(props) //