写点什么

开源一夏 | React 对于生命周期的深入研究

作者:黎燃
  • 2022 年 8 月 26 日
    内蒙古
  • 本文字数:2443 字

    阅读完需:约 8 分钟

生命周期


static getDerivedStateFromProps()方法

这是新版本的生命周期函数中新增的,通常很少使用。从字面翻译来看,这意味着在 render()方法之前,props 返回一个对象来更新状态 state,该状态在组件的初始化和更新期间被调用。我们都知道,类类型组件中使用的 static 关键字表示类原型的静态方法。它接收两个参数,一个是 props,另一个是 state。传递的属性值用于替换当前组件中的状态。这个声明循环函数在语义上命名,这有助于理解和记忆。count 的值一直是通过 props 传入的 111,并不会发生任何改变。


static getDerivedStateFromProps(props) {    return props;}ReactDOM.render(<Count count="111"/>,document.getElementById('root'))
复制代码


直接直译意味着当前组件已经安装,初始化和安装操作已经基本完成。通常,页面挂载后,我们可以向后台发送 Ajax 异步请求以获取数据,在该组件中还可以完成启动定时器和组件之间的消息订阅和发布。此组件在开发中经常使用,因此我们应该重点了解其用法。


const element = <HelloMessage/>;ReactDOM.render(  element,  document.getElementById('example'));
复制代码


旧版本中的生命周期函数 componentwillmount()现在不推荐使用,其应用也非常有限。它被人们误用的可能性很高,这可能会导致潜在的无法检测的错误。


class Name extends React.Component {  render() {    return (      <h1>{this.props.name}</h1>    );  }} class Link extends React.Component {  render() {    return (      <a href={this.props.site}>        {this.props.site}      </a>    );  }}
复制代码

Props 验证

Props 验证使用 proptype,这可以确保正确使用我们的应用程序组件。React Proptypes 提供了许多验证器来验证传入数据是否有效。当无效数据被传递到 props 时,JavaScript 控制台将抛出警告。


class MyTitle extends React.Component {  render() {    return (      <h1>Hello, {this.props.title}</h1>    );  }}
复制代码


下面的示例创建了一个 mytitle 组件。属性 title 是必需的,是字符串。非字符串类型将自动转换为字符串:


MyTitle.propTypes = {  title: PropTypes.string};ReactDOM.render(    <MyTitle title={title} />,    document.getElementById('example'));
复制代码


可以将 prop 声明为指定的 JS 基本数据类型。默认情况下,这些数据是可选的


 optionalArray: React.PropTypes.array,    optionalBool: React.PropTypes.bool,    optionalFunc: React.PropTypes.func,    optionalNumber: React.PropTypes.number,    optionalObject: React.PropTypes.object,    optionalString: React.PropTypes.string,
复制代码

shouldComponentUpdate()方法

在组件更新之前调用此声明循环函数,这相当于在组件更新前添加一个阀门,以控制组件在满足什么条件时将被更新。可以控制是否通过返回值更新组件。如果更新返回 true,则不会更新。如果返回值为 false,则当不使用此声明循环函数时,默认返回值为 true。可以是多个对象类型中的一个:


 optionalUnion: React.PropTypes.oneOfType([      React.PropTypes.string,      React.PropTypes.number,      React.PropTypes.instanceOf(Message)    ]),
复制代码


自定义验证器。如果验证失败,则需要返回错误对象。不要使用“控制台警告”或抛出异常,因为“oneoftype”将无效。


customProp: function(props, propName, componentName) {      if (!/matchme/.test(props[propName])) {        return new Error('Validation failed!');      }    }
复制代码

元素变量

可以使用变量来存储元素。它可以帮助有条件地渲染组件的一部分,而输出的其余部分不会更改。在下面的示例中,我们将创建一个名为 logincontrol 的有状态组件。它将根据当前状态呈现<loginButton/>或<logoutbutton/>,并在上一个示例中呈现<greeting/>。


  handleLoginClick() {    this.setState({isLoggedIn: true});  }   handleLogoutClick() {    this.setState({isLoggedIn: false});  }   render() {    const isLoggedIn = this.state.isLoggedIn;     let button = null;    if (isLoggedIn) {      button = <LogoutButton onClick={this.handleLogoutClick} />;    } else {      button = <LoginButton onClick={this.handleLoginClick} />;    }     return (      <div>        <Greeting isLoggedIn={isLoggedIn} />        {button}      </div>    );  }
复制代码


正确使用生命周期函数将使我们的开发更有效率。react official 提供了许多生命周期函数,但它们主要使用诸如 render()、componentdidmount()、componentwillunmount()和 getderivedstatefromprops()等生命周期函数。其他生命周期函数可以通过引用官方文档直接使用,这就是 react 中的生命周期函数。


class Counter extends React.Component{  constructor(props) {      super(props);      this.state = {clickCount: 0};      this.handleClick = this.handleClick.bind(this);  }    handleClick() {    this.setState(function(state) {      return {clickCount: state.clickCount + 1};    });  }
复制代码


Getderivedstatefromprops():在调用 render 方法之前调用,并将在初始装载和后续更新期间调用。根据 shouldcomponentupdate()的返回值,确定 react 组件的输出是否受当前状态或属性更改的影响。Shouldcomponentupdate():当属性或状态更改时,将在渲染执行之前调用 Shouldcomponentupdate()。Render():Render()方法是类组件中必须实现的唯一方法。Getsnapshotbeforeupdate():在上次渲染输出(提交到 DOM 节点)之前调用。Componentdidupdate():它将在更新后立即调用。


 tick() {    this.setState({      date: new Date()    });  }   render() {    return (      <div>        <h1>Hello, Runoob!</h1>        <h2>现在时间是:{this.state.date.toLocaleTimeString()}.</h2>      </div>    );  }
复制代码


发布于: 刚刚阅读数: 5
用户头像

黎燃

关注

前端工程师 2022.05.06 加入

专注学习分享前端知识。

评论

发布
暂无评论
开源一夏 | React对于生命周期的深入研究_开源_黎燃_InfoQ写作社区