React中setState与useState对比

setState

  • 只要执行setState, 不管有咩有变化,都会render
  • 更新时可能是异步更新也可能是同步更新
  • 几个更新会被合并
  • 自动进行浅合并
// 用于类组件,修改this.state中的值
constructor(props) {
    super(props)

    this.state = {
        count: 0
    }
}

// z在react的合成事件和生命周期(除了componentDidUpdate)中,setState是异步的,
// 在生命周期钩子调用中,更新策略都处于更新之前,组件仍处于事务流中,
// 而componentDidUpdate是在更新之后,此时组件已经不在事务流中了,因此则会同步执行;
// 在合成事件中,React 是基于 事务流完成的事件委托机制 实现,也是处于事务流中;
// 第一步: 处于 batchUpdate isBatchingUpdates = true
setState({
    count: 1
}, ()=> {
    // 返回更新的值
    console.log(this.state.count) 1
})
// 上边的代码会自动浅合并成
setState({
    ...this.state,
    count: 1
})

console.log('count:=', this.state.count) // 0

setTimeout(()=>{
    // 第三步:此时isBatchingUpdates是false
    this.setSate({
        count: this.state.count + 1
    })
    console.log('count:=', this.state.count) // 1

}, 1000)

// 第二步 结束后, isBatchingUpdates = false

// 传入对象, 会被合并,执行结果只一次,渲染的值是 +1(类似于 object.assign({},{}))
this.setSate({
    count: this.state.count + 1
})
this.setSate({
     count: this.state.count + 1
})
this.setSate({
     count: this.state.count + 1
})
console.log(this.state.count) // 1 在合并多个setState时,若出现同名属性,
// 会将后面的同名属性覆盖掉前面的同名属性

setTimeout(()=>{
    this.setSate({
         count: this.state.count + 1
    })
    this.setSate({
         count: this.state.count + 1
    })
},0)
console.log(this.state.count) // 2 
// 在react的合成事件和生命周期中调用setState,React的性能优化机制会合并多个setState, 
// 在原生事件、setTimeout中调用setState,是不受React管理的,所以不会合并,
// 写了几个setState执行几次



// 传入函数,不会被合并,执行结果是渲染的值是 +3
this.setState((preValue, props)=>{
    return {
        count: this.state.count + 1
     }
})
this.setState((preValue, props)=>{
     return {
         count: this.state.count + 1
     }
})
this.setState((preValue, props)=>{
     return {
         count: this.state.count + 1
    }
})

useState

  • 自定义名字
  • 可以使用多个useState()
  • 异步更新,用useEffect()进行监听
  • 不具备浅合并的效果
const [count, setCount] = useState(0)

const [obj, setObj] = useState({})

setCount(1)
// 引用数据类型需要手动进行浅合并
setObj({ 
    ...obj,
    name: 'zx'
})

useEffect(()=>{
    console.log(count)
}, [count])

<think>好的,我需要帮助用户比较React中的setStateuseState的功能差异及特点。首先,我得回顾一下React的状态管理机制,确保自己理解正确。 根据引用[1][2],setState是类组件中的方法,而useState是函数组件中的钩子。setState在类组件中用于更新状态,并且可能是异步的,尤其是在合成事件或生命周期方法中。而useState返回的setState函数在函数组件中使用,同样可能有异步行为,但它们的实现机制不同。 接下来,引用[4]提到,setState默认是异步的,为了性能优化合并多次更新。但在某些情况下,比如在setTimeout或原生事件中,它可能是同步的。而useStatesetState是否也有这样的行为?需要确认。根据引用[3],useState在更新时调用了updateReducer,可能也是批量处理的,但需要看React的版本上下文环境。 另外,引用[5]讨论了不同的状态管理方案,指出类组件的setState函数组件的useState在使用方式上的差异。比如,useState不需要合并状态对象,每次更新都是替换,而setState会自动合并状态对象中的属性。 用户的问题是要比较两者的功能差异特点,我需要分点整理。可能包括:使用场景(类组件vs函数组件)、更新机制(自动合并vs直接替换)、异步行为、语法差异等。还要注意引用中的内容,确保准确引用来源。 现在需要组织这些信息,确保结构清晰,回答用户的问题,并生成相关问题。同时,按照系统级指令,数学公式用$...$,独立公式用$$...$$,但当前问题不涉及数学,可能不需要。但需检查是否有需要的地方。 最后,生成相关问题,可能涉及性能优化、使用场景选择、底层原理等。需要确保问题相关且有价值。</think>### React中`setState``useState`的功能差异及特点 #### 1. **使用场景组件类型** - **`setState`**:仅适用于类组件,是类组件实例的方法。通过`this.setState()`调用,用于更新组件的状态对象[^2][^4]。 - **`useState`**:专用于函数组件,是React Hooks的一部分。通过解构赋值获取状态变量更新函数(如`const [state, setState] = useState(initialValue)`)[^1][^3]。 #### 2. **状态更新方式** - **`setState`**: - 接受**对象或函数**作为参数。 - **自动合并状态属性**:若传入对象,React会将新旧状态浅合并。例如: ```javascript // 类组件中 this.setState({ count: 1 }); // 其他状态属性(如name)保留 ``` - **函数参数**:若需依赖前一个状态,需传入函数: ```javascript this.setState((prevState) => ({ count: prevState.count + 1 })); ``` 引用[2][^4]。 - **`useState`的setState**: - 接受**新值或函数**作为参数。 - **直接替换状态**:不会自动合并对象,需手动合并(若状态是对象): ```javascript // 函数组件中 setUser(prev => ({ ...prev, name: "Alice" })); // 手动合并对象 ``` 引用[1]。 #### 3. **异步批量更新** - **共同点**: 两者默认**异步执行**更新,React会将多次状态更新合并为一次渲染,以提高性能。 - **差异**: - **`setState`的同步场景**:在`setTimeout`、原生事件监听中可能变为同步更新[^4]。 - **`useState`的更新机制**:通过`updateReducer`实现批量更新,但受React版本调用环境影响(如React 18后默认启用并发模式,批量更新行为更一致)。 #### 4. **语法开发体验** - **`setState`**:需绑定`this`(或在构造函数中使用箭头函数),代码冗余较多。 - **`useState`**:语法简洁,支持函数式编程范式,更易Hooks(如`useEffect`)集成[^1]。 #### 5. **底层实现** - **`setState`**:通过`enqueueSetState`方法将更新加入队列,触发组件重新渲染。 - **`useState`**:基于`updateReducer`实现,将更新操作封装为Reducer逻辑,统一管理状态变更。 --- ### 总结对比表 | 特性 | `setState`(类组件) | `useState`(函数组件) | |--------------------|-----------------------------|----------------------------| | **更新合并** | 自动浅合并对象 | 需手动合并对象 | | **参数类型** | 对象或函数 | 值或函数 | | **异步行为** | 默认异步,部分场景同步 | 默认异步,批量更新更一致 | | **代码简洁性** | 需处理`this`绑定 | 语法简洁,无绑定问题 | | **适用场景** | 类组件 | 函数组件 | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值