react 生命周期

2020-06-06  本文已影响0人  skoll

componentWillMount

1 .在渲染之前调用,在客户端也在服务器端
2 .

componentDidMount

1 .在第一次渲染后调用
2 .之后组件已经生成了对应的dom结构,可以通过this.getDomNode()来访问
3 .可以在这个方法中使用setTimeout或者ajax等异步操作
4 .

Mounting时涉及的函数

1 .constructor:加载的时候调用一次,可以初始化state
2 .getDefaultProps:设置默认的props,也可以使用defaultProps设置组件的默认属性
3 .getIniialState:初始化state,可以直接在constructor中定义this.state
4 .static getDerivedStateFromProps(props,state):组件每次render的时候,包括在组件创建之后,每次获取新的props,state之后,每次接收新的props之后都会返回一个对象作为新的state,返回null则说明不需要更新state,配合componentDidUpdate,可以替代componentWillReceiveProps
5 .static getDerviedStateFromProps()
6 .render
7 .componentDidMount
8 .componentWillMount:这个生命周期函数即将过期,新代码中应该避免使用他。

render()

1 .react最重要的步骤,创建虚拟dom,进行diff算法,更新dom树都在此进行
2 .

componentWillReceiveProps

1 .组件接收到一个新的props,更新数据时调用,在初始render不会调用
2 .也就是只有父组件重新渲染,子组件接收到新的props才会触发更新

shouldComponentUpdate

1 .返回一个布尔值,在组件接收到新的props或者state调用,在初始化或者forceUpdate时不被调用
2 .在确认不更新组件时使用

componentWillUpdate

1 .返回一个布尔值,在组件接收到新的props或者state,但是没有render时调用,初始化不会被调用

componentDidUpdate

1 .组件完成更新之后调用,初始化时不会被调用

getSnapshotBeforeUpdate(prevProps, prevState)

1 .update发生的时候,每次获取新的props或者state之后,都会返回一个新的对象作为state,返回null则说明不会更新state

componentWillUnmount

1 .在组件从dom移除前辈调用

static getDerivedStateFromProps

1 .会在调用render方法之前调用,并且在初始挂载及其后续更新时每次都调用,他返回一个新的state对象来更新state,如果返回null则不会更新任何内容
2 .在state的值任何时候都取决于props.这个方法很实用
3 .但是这个方法会有一些bug,如果是以下几种情况,可以使用简单的替代方案
4 .不管什么原因,每次render的时候都会执行这个函数

getSnapshotBeforeUpdate

1 .在最近一次渲染输出之前调用,还未挂载到dom节点之前
2 .他使得组件能在发生更改之前从DOM中捕获一些信息,比如滚动位置,此生命周期的任何返回值都将作为参数传递给componentDidUpdate

1 .官方用法举例
class ScrollingList extends React.Component {
  constructor(props) {
    super(props);
    this.listRef = React.createRef();
  }

  getSnapshotBeforeUpdate(prevProps, prevState) {
    // 我们是否在 list 中添加新的 items ?
    // 捕获滚动​​位置以便我们稍后调整滚动位置。
    if (prevProps.list.length < this.props.list.length) {
      const list = this.listRef.current;
      return list.scrollHeight - list.scrollTop;
    }
    return null;
  }

  componentDidUpdate(prevProps, prevState, snapshot) {
    // 如果我们 snapshot 有值,说明我们刚刚添加了新的 items,
    // 调整滚动位置使得这些新 items 不会将旧的 items 推出视图。
    //(这里的 snapshot 是 getSnapshotBeforeUpdate 的返回值)
    if (snapshot !== null) {
      const list = this.listRef.current;
      list.scrollTop = list.scrollHeight - snapshot;
    }
  }

  render() {
    return (
      <div ref={this.listRef}>{/* ...contents... */}</div>
    );
  }
}

错误处理

1 .componentDidCatch(error,info)

1 .此生命周期在后代组件抛出错误的时候被调用
2 .会在”提交“阶段被调用,因此允许执行副作用,应该用于记录一些错误日志之类的情况

2 .static getDerivedStateFromError

1 .会在后代组件抛出错误之后被调用,将抛出的错误当做参数,并返回一个新的值来更新state
2 .只会在渲染阶段调用,因此不允许出现副作用。
class ErrorBoundary extends React.Component {
  constructor(props) {
    super(props);
    this.state = { hasError: false };
  }

  static getDerivedStateFromError(error) {
    // 更新 state 使下一次渲染可以显降级 UI
    return { hasError: true };
  }

  render() {
    if (this.state.hasError) {
      // 你可以渲染任何自定义的降级  UI
      return <h1>Something went wrong.</h1>;
    }

    return this.props.children; 
  }
}

forceUpdate

1 .默认情况下,当组件的state,props发生变化时,组件将会重新渲染。如果render方法依赖于其他数据,或者说想要页面立马渲染,可以调用forceUpdate强制让组件重新渲染
2 .调用forceUpdate会强制组件调用render方法,此时组件会跳过该组件的shouldComponentUpdate,但是子组件会触发正常的生命周期方法
3 .总的来说应该避免使用forceUpdate,尽量在render中使用this.props,this.state来触发框架更新

备注

1 .17的时候会删掉WillMount,ReceiveProps,WillUpdate
2 .官网不使用ES6的部分有介绍到这里的东西

1 .声明默认的props
var Greeting = createReactClass({
  getDefaultProps: function() {
    return {
      name: 'Mary'
    };
  },
})

2 .初始化state
getInitialState: function() {
    return {count: this.props.initialCount};
  },

class Hello extends React.Component {
  render() {
    return React.createElement('div', null, `Hello ${this.props.toWhat}`);
  }
}

ReactDOM.render(
  React.createElement(Hello, {toWhat: 'World'}, null),
  document.getElementById('root')
);

注意

1 .willMount和willUpdate会被多次执行,so,不要放有副作用的处理。

挂载的时候

1 .constructor
2 .static getDerivedStateFromProps
3 .render
4 .componentDidMount

更新的时候:当props或state发生变化的时候会触发更新

1 .static getDerivedStateFormProps
2 .shouldComponentUpdate
3 .render
4 .getSnapshotBeforeUpdate
5 .componentDidUpdate
6 .componentWillUpdate,componentWillReceiveProps.这俩即将过期,不要使用

卸载的时候

上一篇下一篇

猜你喜欢

热点阅读