React useState和setState


初步学习,在 useStatesetState使用中总是懵懵懂懂,特地总结一下。

常遇问题👇

  1. useStatesetState设置方法常常不奏效
  2. useStatesetState 多次的更新合并
  3. useState 遇到复杂的数据类型,视图不更新,但是数据已更新

正确使用State😀

🏃‍跟着我一起码起代码理解一下吧~

同步异步情况下,使用 setState🏊‍

class StateClass extends React.Component {
    state = {
        a: 1,
        b: 'b'
    }
    handleClickWithPromise= () => {
        Promise.resolve().then(() => {
            // this.setState({...this.state, a: 'aa'})
            // this.setState({...this.state, b: 'bb'})

            // this.setState({a: this.state.a + 1})
            // this.setState({a: this.state.a + 1})

            this.setState((state) => ({
                a: state.a++
            }))
            this.setState((state) => ({
                a: state.a++
            }))
        })
    }
    handleClickWithoutPromise= () => {
        // this.setState({...this.state, a: 'aa'})
        // this.setState({...this.state, b: 'bb'})

        // this.setState({a: this.state.a + 1})
        // this.setState({a: this.state.a + 1})

        this.setState((state) => ({
            a: state.a++
        }))
        this.setState((state) => ({
            a: state.a++
        }))
    }
    render() {
        console.log('render')
        const {a, b} = this.state
        return (
            <Fragment>
                <h2>State</h2>
                <button onClick={this.handleClickWithPromise}>
                    {a}-{b} 异步执行
                </button>
                <button onClick={this.handleClickWithoutPromise}>
                    {a}-{b} 同步执行
                </button>
            </Fragment>
        )
    }
}

【输出】:

  1. 异步执行,render输出俩次
  2. 同步执行,render 执行一次

同步异步情况下,使用 useState🏋️‍

function useStateFunc() {
    const [a, setA] = useState([{a:1}])
    // const [a, setA] = useState(1)
    const [b, setB] = useState(1)
    console.log('render')

    function handleClickWithPromise () {
        Promise.resolve().then(() => {
            setA((a) => [{a:2}, {a: 1}])
            // setA((a) => a + 1)
            setB('bb')
        })
    }
    function handleClickWithoutPromise () {
        setA((a) => [1, 2])
        // setA((a) => a + 1)
        setB('bb')
    }
    return (
        <Fragment>
            <h2>useState</h2>
            <button onClick={handleClickWithPromise}>
                {a.a}-{b} 异步执行
            </button>
            <button onClick={handleClickWithoutPromise}>
                {a.a}-{b} 同步执行
            </button>
        </Fragment>
    )
}

【输出】:

  1. 异步执行,render输出俩次
  2. 同步执行,render 执行一次
  3. 页面数据不更新,初始数据为1是更新数据成功

基于现象总结🐌

  1. setStateuseState 在正常的 React 事件流中,异步执行,合并更新
  2. setStateuseStatesetTimeoutPromise.then等异步事件中,同步执行,使用即立即更新
  3. setStateuseState 在复杂的数据类型下,数据不发生变化,可知,数据只做替换,数据地址未发生变化,react 监听不到,页面不做渲染

更新数据小技巧🔧

提出问题就要去解决问题🌱

  1. 官方认证正确使用方法🌼
  2. 布噜布噜总结🐜
 // 1、修改object中某项
 
this.setState({
  object: {...object, key: value}
});
  // 2、删除数组首位
 
array.splice(0, 1);
this.setState({
  array
});
  // 3、删除数组尾部
 
array.splice(array.length - 1);
this.setState({
  array
});
  // 4、删除数组任意一项
 
array.splice(index, 1);
this.setState({
  array
});
  // 5、数组尾部添加一项
 
this.setState({
  array: [...array, item]
});
 //  6、数组头部添加一项
 
this.setState({
  array: [item, ...array]
});
  7、数组任意位置添加一项
 
array.splice(index, 0, item);
this.setState({
  array
});
 // 8、修改数组中任意一项中值
 
function updateArrayItem(index, key, value) {
  this.setState({
    array: array.map((item, _index) => _index == index ? {...item, [key]: value} : item)
  });
}
//  9、复杂类型修改
 
this.setState(prevState => return newState);
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值