上一主题 下一主题
ScriptCat,新一代的脚本管理器脚本站,与全世界分享你的用户脚本油猴脚本开发指南教程目录
返回列表 发新帖

关于react, setState执行异步的问题

[复制链接]
  • TA的每日心情
    开心
    2024-7-16 15:40
  • 签到天数: 276 天

    [LV.8]以坛为家I

    115

    主题

    460

    回帖

    997

    积分

    荣誉开发者

    积分
    997

    荣誉开发者油中2周年卓越贡献生态建设者油中3周年

    发表于 2023-4-9 11:36:20 | 显示全部楼层 | 阅读模式

    本帖最后由 wwwwwllllk 于 2023-4-10 13:25 编辑

    本帖最后由 wwwwwllllk 于 2023-4-9 16:01 编辑

    本帖最后由 wwwwwllllk 于 2023-4-9 11:41 编辑

    直接通过代码举例子吧

    const [count, setCount] = useState(1)
    function add() {
       setCount(count+1)
       console.log(count)   //输出应该是1
    }

    // 因为setState函数式异步的,但是恰好我们要在别的函数用的count肯定是最新的这个时候我们怎么做

    useEffect(() => {
       // 在这里执行之后的操作
    }, [count])

    // 但是其实我们使用useEffect在真实的项目中这个监听的变量是应该经过仔细思考以后再做决定的,当这个变量在多个地方都会触发变化时, 它都会触发useEffect里面的函数,所以你的业务是否是这样的

    我们可以写setState回调拿到你想要的那个值。

    image.png

    或者我们就是直接通过传参把函数传过去

    const [count, setCount] = useState(1)
    function add() {
       setCount(count+1)
       console.log(count)   //输出应该是1
       reduce()
    }
    
    function reduce() {
       setCount(count-1)   // 我肯定是希望它是2-1,因为add先加了1
       console.log(count)
    }
    

    第一种写法(压根就不要用useState)

    function add() {
       let count = 1
       count = 1+1
       reduce(count)
    }
    
    function reduce(count) {
       let count = count-1   // 我肯定是希望它是2-1,因为add先加了1
       console.log(count)
    }

    第二种

    const [count, setCount] = useState(1)
    function add() {
       setCount(count+1)
       console.log(count)   //输出应该是1
    }
    useEffect(() => {
        reduce()   // 这个时候coutn变化就会触发useEffect函数
    }, [count])
    function reduce() {
       setCount(count-1)   // 我肯定是希望它是2-1,因为add先加了1
    }

    第三种

    const [count, setCount] = useState(1)
    function add() {
       setCount(count+1, () => {
           reduce(count+1)
       })
    }
    function reduce(count) {
       setCount(count-1)   // 我肯定是希望它是2-1,因为add先加了1
    }

    第四种(最喜欢的)

    const [count, setCount] = useState(1)
    function add() {
       setCount(count+1)
       setTimeout(() => {
          reduce()
       }, 0)
    }
    function reduce() {
       setCount(count-1)   // 我肯定是希望它是2-1,因为add先加了1
       console.log(count)
    }

    第四种好像是错的
    image.png

    浏览器执行异步代码, 浏览器会先执行同步代码,然后把异步代码放到异步队列再执行,

    我之前以为,异步队列执行是按照顺序的,这个执行完成拿到结果再执行下一个,但是好像不是的,异步队列按照顺序执行,但是不一定第一个结果返回的比第二结果快,所以第四种方法好像是错的

    我之前理解错了

    setCount(2)
    setList([{name:'zhangsan'}])
    useEffect(() => {
        console.log(count)   // 这里的count应该是2
    }, [list])

    image.png

    image.png

    image.png

    接脚本定制
    I frequently record, because want to leave something.

    该用户从未签到

    0

    主题

    60

    回帖

    89

    积分

    初级工程师

    积分
    89
    发表于 2023-4-9 12:20:00 | 显示全部楼层
    const [count, setCount] = useState(1)
    function add() {
       setCount(count => count+1)
    }
    回复

    使用道具 举报

  • TA的每日心情
    慵懒
    2024-10-28 07:07
  • 签到天数: 193 天

    [LV.7]常住居民III

    712

    主题

    5959

    回帖

    6758

    积分

    管理员

    非物质文化遗产社会摇传承人

    积分
    6758

    荣誉开发者喜迎中秋油中2周年生态建设者

    发表于 2023-4-9 13:24:22 | 显示全部楼层
    setState我记着是既同步又异步
    混的人。
    ------------------------------------------
    進撃!永遠の帝国の破壊虎---李恒道

    入驻了爱发电https://afdian.net/a/lihengdao666
    个人宣言:この世界で私に胜てる人とコードはまだ生まれていません。死ぬのが怖くなければ来てください。
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2024-7-16 15:40
  • 签到天数: 276 天

    [LV.8]以坛为家I

    115

    主题

    460

    回帖

    997

    积分

    荣誉开发者

    积分
    997

    荣誉开发者油中2周年卓越贡献生态建设者油中3周年

    发表于 2023-4-9 13:24:46 | 显示全部楼层
    shabby 发表于 2023-4-9 12:20
    [md]```ts
    const [count, setCount] = useState(1)
    function add() {

    !!!!!!!!!!
    接脚本定制
    I frequently record, because want to leave something.
    回复

    使用道具 举报

    发表回复

    本版积分规则

    快速回复 返回顶部 返回列表