• 请不要在回答技术问题时复制粘贴 AI 生成的内容
17681880207
V2EX  ›  程序员

React useState 修改值之后,如何获取到最新的值

  •  
  •   17681880207 · Sep 3, 2021 · 4041 views
    This topic created in 1892 days ago, the information mentioned may be changed or developed.

    页面上有一个 radio group,点击 radio 按钮之后,重新获取 table 数据。 在 setModule 之后,需要立马重新获取表格数据,但是发现 module 值是老的。

    let [module, setModule] = useState('1')
    
    const changeModule = (e) => {
      setModule(e.target.value)
      getTableData ()
      console.log('module :', module) // 此时,发现 module 的值是老的
    }
    
    const getTableData = async () => {
      const params = {}
      Object.assign(params, {
        moduleId: module
      })
      // 此时的 moduleId 发现是老的值,而不是新点击的值
      const r = await axios.get('/get-table-data', params)
    }
    
    <Radio.Group 
      options={[
        {label: 'option1', value: '1'}, 
        {label: 'option2', value: '2'},
        {label: 'option3', value: '3'},
        {label: 'option4', value: '4'}
      ]}
      value={module} 
      onChange={changeModule}/>
    

    各位大神,应该如何处理?

    24 replies  •  2021-09-05 22:18:40 +08:00
    JimmyquSpe
    JimmyquSpe
    Sep 3, 2021 via Android
    1
    settimeout
    17681880207
    17681880207
    OP
    Sep 3, 2021
    2
    @JimmyquSpe 不会吧....
    coolcoffee
    coolcoffee
    Sep 3, 2021
    3
    你如果要基于 module 更新去执行 getTableData, 那么你应该这样做。

    ``` javascript
    useEffect(() => {
    if (module) {
    getTableData();
    }
    }, [module]);
    ```
    johnwood
    johnwood
    Sep 3, 2021
    4
    # 1
    getTableData ( e.target.value )

    #2
    useEffect(()=>{getTableData()},[module])
    X_Del
    X_Del
    Sep 3, 2021
    5
    ```
    useEffect(() => {
    getTableData()
    }, [module]);
    ```
    Leviathann
    Leviathann
    Sep 3, 2021
    7
    改一下 getTableData,把 value 传进去?
    Rocketer
    Rocketer
    Sep 3, 2021 via iPhone
    8
    楼上说的很清楚了,要靠 useEffect 来监控值的变化。

    但你这个情况有点简单,何不直接用 e.target.value ?
    mightofcode
    mightofcode
    Sep 3, 2021
    9
    用 useEffect

    module 不是一个简单的变量,相关操作都要依赖 react 的体系
    lingo
    lingo
    Sep 3, 2021
    10
    这情况 useEffect 应该是最符合 react hook 思想的做法了吧
    towave
    towave
    Sep 3, 2021
    11
    传参最快
    zhaol
    zhaol
    Sep 3, 2021
    12
    react 的 setState 在 js 代码里面表现是异步的,所以你拿的值不是最新的。用 settimeout 可以解决,但是不推荐; react hook 就用 useEffect,class component 就在 setState 的第二个参数做查询;传参也简单,楼上的解决方法都挺好的
    wiluxy
    wiluxy
    Sep 3, 2021
    13
    ~~~js
    let [module, setModule] = useState('1')

    const changeModule = (e) => {
    setModule(e.target.value)
    getTableData ()
    }
    useEffect(()=>{
    console.log('module :', module) // 每次更新 module 后的逻辑写在次,拿到的 module 是最新的
    },[module])

    const getTableData = async () => {
    const params = {}
    Object.assign(params, {
    moduleId: module
    })
    // 此时的 moduleId 发现是老的值,而不是新点击的值
    const r = await axios.get('/get-table-data', params)
    }

    <Radio.Group
    options={[
    {label: 'option1', value: '1'},
    {label: 'option2', value: '2'},
    {label: 'option3', value: '3'},
    {label: 'option4', value: '4'}
    ]}
    value={module}
    onChange={changeModule}/>
    ~~~
    flybears
    flybears
    Sep 3, 2021
    14
    const changeModule = (e) => {
    setModule(e.target.value)
    setModule(e => {})
    }
    flybears
    flybears
    Sep 3, 2021
    15
    const changeModule = (e) => {
    setModule(e.target.value)
    setModule(value => {
    //这个是修改之后的值
    console.log(value)
    })
    }
    flybluewolf
    flybluewolf
    Sep 3, 2021
    16
    哎,回复没一个对的。useReducer 啊,多看官方文档啊
    Puteulanus
    Puteulanus
    Sep 3, 2021
    17
    狗头,之前写过一种,能用,不确定是不是正确实践

    const getModule = () => new Promise(resolve => {
    setModule(oldState => {
    resolve(oldState);
    return oldState;
    });
    })

    用的时候

    setModule('2');
    await console.log(getModule()); // get 2
    Puteulanus
    Puteulanus
    Sep 3, 2021
    18
    console.log(await getModule()) ,手滑
    huangyu2021
    huangyu2021
    Sep 3, 2021
    19
    原理就是产生了闭包 一直是原来的值
    解决方法很多
    shengyueming
    shengyueming
    Sep 3, 2021
    20
    1.setstate 的 callback
    2.componentdidupdate
    3.useeffect
    4 redux-thunk
    coolcoffee
    coolcoffee
    Sep 3, 2021
    21
    @flybluewolf useReducer 操作异步方便吗?
    guoliim
    guoliim
    Sep 4, 2021
    22
    setState 是 批处理
    还是 要再看一下 官方文档吧
    dengshen
    dengshen
    Sep 5, 2021 via iPhone
    23
    嗯!千人千面。我用 vue/doge
    AV1
    AV1
    Sep 5, 2021
    24
    把 getTableData 拎到组件外面,以参数形式把 module 传给 getTableData,并以返回值把请求的数据传回组件。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   1484 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 49ms · UTC 06:05 · PVG 14:05 · LAX 22:05 · JFK 01:05
    ♥ Do have faith in what you're doing.