当前位置: 首页 > news >正文

React - setState 更新状态的两种写法

React - setState 更新状态的两种写法

  • 一.对象式的 setState
  • 二. 函数式的 setState
  • 三. 对象式的setState 对比 函数式的 setState
  • 四. 一个 setState 使用组件实例

  1. setState() 将对组件 state 的更改排入队列,并通知 React 需要使用更新后的 state 重新渲染此组件及其子组件。
  2. setState() 并不总是立即更新组件,它会批量推迟更新(异步执行)。

一.对象式的 setState

setState(stateChange, [callback])

  • stateChange :为状态改变对象(该对象可以体现出状态的更改)
  • callback 是可选的回调函数, 它在状态更新完毕、界面也更新后(render()调用后)才会被调用
  1. 不使用回调函数
    this.setState({ count: 10 });
    
  2. 使用回调函数
    this.setState(
      {
        count: 10,
      },
      () => {
        console.log('render()渲染之后', this.state.count);
      }
    );
    

二. 函数式的 setState

setState(updater, [callback])

  • updater
    (1)返回 stateChange 对象的函数
    (2)可以接收到两个参数:state当前组件的state)和 props组件外部传递过来的参数
  • callback 是可选的回调函数, 它在状态更新完毕、界面也更新后(render()调用后)才会被调用
  1. 不使用回调函数
    // state 当前组件的state
    // props 当前组件外部传递过来的参数
    this.setState((state, props) => {
      console.log(state, props);
      return { count: 10 };
    });
    
  2. 使用回调函数
    this.setState(
      // state 当前组件的state
      // props 当前组件外部传递过来的参数
      (state, props) => {
        console.log(state, props);
        return { count: 10 };
      },
      () => {
        console.log('render()渲染之后', this.state.count);
      }
    );
    

三. 对象式的setState 对比 函数式的 setState

对象式的setState函数式的setState的简写方式(语法糖)

  • 如果 新状态 不依赖于 原状态 ,推荐使用对象方式
  • 如果 新状态 依赖于 原状态 ,推荐使用函数方式
  • 如果需要在 setState()执行后 获取最新的状态数据,要在第二个 callback 函数中读取

四. 一个 setState 使用组件实例

import React, { Component } from "react";

export default class index extends Component {
  state = {
    count: 0,
  };
  increment1 = () => {
    // 对象式的setState
    this.setState(
      {
        count: this.state.count + 1,
      },
      () => {
        console.log(222, this.state.count);
      }
    );
    console.log(111, this.state.count);
  };
  increment2 = () => {
    // 函数式的setState
    // state 当前组件的state
    // props 当前组件外部传递过来的参数
    this.setState(
      (state, props) => {
        console.log(state, props);
        return { count: state.count + 2 };
      },
      () => {
        console.log(222, this.state.count);
      }
    );
    console.log(111, this.state.count);
  };
  render() {
    return (
      <div>
        <h4>数值为:{this.state.count}</h4>
        <button onClick={this.increment1}>+1</button>
        <button onClick={this.increment2}>+2</button>
      </div>
    );
  }
}

相关文章:

  • pinia 持久化存储
  • A-Level商务例题解析及练习Theory of Maslow Theory of Herzberg
  • Head First设计模式(阅读笔记)-11.组合模式
  • 手把手教你成为荣耀开发者:数据报表使用指引
  • java计算机毕业设计企业人事管理系统源程序+mysql+系统+lw文档+远程调试
  • HDFS的概念及shell操作
  • Spring Web 应用程序中的 Flash 属性指南
  • 虚拟机共享物理机网路的NAT连接方法
  • Netty入门——基于NIO实现机器客服案例
  • Maven项目管理工具
  • 探索可观测性:AIOps中的时序数据应用
  • RISCV:cv_regress
  • 计算机毕业设计Java校园管理系统(系统+源码+mysql数据库+lw文档)
  • (附源码)Springboot中北创新创业官网 毕业设计 271443
  • Go语学习笔记 - 实现将mp4通过rtmp推送流媒体服务
  • 读取HDFS数据写入MySQL_大数据培训
  • MySQL日志管理(十一)
  • 前端一面经典vue面试题(持续更新中)
  • leetcode 638. 大礼包-思路整理
  • [附源码]Python计算机毕业设计Django新冠疫苗接种预约系统
  • 电加热油锅炉工作原理_电加热导油
  • 大型电蒸汽锅炉_工业电阻炉
  • 燃气蒸汽锅炉的分类_大连生物质蒸汽锅炉
  • 天津市维修锅炉_锅炉汽化处理方法
  • 蒸汽汽锅炉厂家_延安锅炉厂家
  • 山西热水锅炉厂家_酒店热水 锅炉
  • 蒸汽锅炉生产厂家_燃油蒸汽发生器
  • 燃煤锅炉烧热水_张家口 淘汰取缔燃煤锅炉
  • 生物质锅炉_炉
  • 锅炉天然气_天燃气热风炉