react hooks方法获取不到最新的state解决方法

问题
在setState方法执行之后,再执行自定义的方法,这个自定义方法里面获取不到最新的state状态

import React, {useState} from "react";
import { Button } from "antd"

const Demo = () => {
const [num, changeNum] = useState(1)
const [str, changeStr] = useState("现在数字是1")

const getNum = () => {
    const newStr = "现在数字是" + num
    console.log(newStr)
    changeStr(newStr)
}

const setNum = () => {
// 使用 async await 自执行函数 setTimeout 都没用
changeNum(num + 1)
// 执行之后 getNum里拿不到最新的state
getNum()
}

return (
<div>
    <Button onClick={setNum}>点我+1</Button>
    <div>{num}</div>
    <div>{str}</div>
</div>
)
}

export default Demo

 

解决方法
第一种

通过useEffect方法监听num 再去触发getNum函数

useEffect(() => {
getNum()
}, [num])

const getNum = () => {
    const newStr = "现在数字是" + num
    changeStr(newStr)
}

const setNum = () => {
    changeNum(num + 1)
}

第二种

const numRef = useRef(1)
const [num, changeNum] = useState(numRef.current)
const [str, changeStr] = useState("现在数字是1")

const getNum = () => {
    const newStr = "现在数字是" + numRef.current
    changeStr(newStr)
}

const setNum = () => {
    numRef.current = num + 1
    changeNum(numRef.current)
    getNum()
}

完整第一种代码

import React, {useState, useEffect} from "react";
import { Button } from "antd"

const Demo = () => {
const [num, changeNum] = useState(1)
const [str, changeStr] = useState("现在数字是1")

useEffect(() => {
    getNum()
}, [num])

const getNum = () => {
    const newStr = "现在数字是" + num
    changeStr(newStr)
}

const setNum = () => {
    changeNum(num + 1)
}

return (
<div>
    <Button onClick={setNum}>点我+1</Button>
    <div>{num}</div>
    <div>{str}</div>
</div>
)
}

export default Demo

完整第二种代码

import React, {useState, useEffect, useRef} from "react";
import { Button } from "antd"

const Demo = () => {
const numRef = useRef(1)
const [num, changeNum] = useState(numRef.current)
const [str, changeStr] = useState("现在数字是1")

const getNum = () => {
    const newStr = "现在数字是" + numRef.current
    changeStr(newStr)
}

const setNum = () => {
    numRef.current = num + 1
    changeNum(numRef.current)
    getNum()
}

return (
<div>
    <Button onClick={setNum}>点我+1</Button>
    <div>{num}</div>
    <div>{str}</div>
</div>
)
}

export default Demo

 

posted on 2021-07-08 16:59  ranyonsue  阅读(2198)  评论(0编辑  收藏  举报

导航