zoukankan      html  css  js  c++  java
  • React 关于 setState

    关于setState 同步更新还是异步更新

    • 在React相关的回调函数中setState() 是异步更新

      • React 相关的回调包括:组件的生命周期钩子,React 组件事件监听回调。

    • 不在React 相关的回调中setState() 是同步更新

      • React不相关的回调包括常见的:setTimeout(), Promise()等。

    • setState()传参的第二个callback() 参数。setState() 的第二个回调会在更新状态之后,组件重新render() 之后调用,这里面我们可以获取到最新的状态值。

      • setState((prevState, props)=>({
           
        }),()=>{
           
        })

    遇到重复多次调用setState(),React如何处理?

    • setState() 异步更新状态时候,因为同步更新,我们调用几次 setState(),就会触发几次 render钩子

    • 当setState() 传对象类型参数,React会合并重复多次的调用setState(),触发一次render。

    • 当setState() 传函数类型参数,React会依次多次的调用setState(),触发一次render。

      无论以哪种方式传参重复调用 setState() ,React 都只会进行一次render 调用,这也是性能优化的一部分,防止多次重复渲染带来的性能问题。

      官网推荐我们使用setState()时候,第一个参数传函数类型参数,因为函数参数中接收的 state 和 props 都保证为最新。

     

    React提供另一种调用setState函数的方式传入一个函数,而不是对象

    // 错误的用法 
    this.setState({ counter: this.state.counter + this.props.increment }) 
    // 正确的用法 
    this.setState((prevState, props) => ({ 
        // 接受一个表示前次state的参数和一个当前props的参数 
        counter: prevState.counter + props.increment 
        // 这里实际上是返回了一个对象,是ES6箭头函数的简写 
    }),()=>{
        //更新后的state
        console.log(this.state)
    }) 



    setState是对象的合并而不是替换

    setState方法是将传入的参数对象或函数返回的对象与现有的state对象进行合并,非常类似于使用Object.assign(prevState, newState)的效果

     

     

     

  • 相关阅读:
    题解 [CF891C] Envy
    题解 [BZOJ4710] 分特产
    题解 [BZOJ2159] Crash的文明世界
    题解 [BZOJ4144] Petrol
    #leetcode刷题之路1-两数之和
    week 7 文件操作与模板
    coursera 北京大学 程序设计与算法 专项课程 STL week8 list
    coursera 北京大学 程序设计与算法 专项课程 完美覆盖
    JSTL标签库不起作用的解决方案 .(转)
    javax.servlet.jsp.PageContext.getELContext()Ljavax/el/ELContext解决办法(转)
  • 原文地址:https://www.cnblogs.com/chen-yi-yi/p/13566375.html
Copyright © 2011-2022 走看看