页面上有一个 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}/>
各位大神,应该如何处理?
1
JimmyquSpe 2021-09-03 14:01:27 +08:00 via Android
settimeout
|
2
17681880207 OP @JimmyquSpe 不会吧....
|
3
coolcoffee 2021-09-03 14:04:28 +08:00
你如果要基于 module 更新去执行 getTableData, 那么你应该这样做。
``` javascript useEffect(() => { if (module) { getTableData(); } }, [module]); ``` |
4
johnwood 2021-09-03 14:04:32 +08:00
# 1
getTableData ( e.target.value ) #2 useEffect(()=>{getTableData()},[module]) |
5
X_Del 2021-09-03 14:04:56 +08:00
```
useEffect(() => { getTableData() }, [module]); ``` |
6
Yvette 2021-09-03 14:09:17 +08:00
|
7
Leviathann 2021-09-03 14:16:29 +08:00
改一下 getTableData,把 value 传进去?
|
8
Rocketer 2021-09-03 14:19:04 +08:00 via iPhone
楼上说的很清楚了,要靠 useEffect 来监控值的变化。
但你这个情况有点简单,何不直接用 e.target.value ? |
9
mightofcode 2021-09-03 14:20:06 +08:00
用 useEffect
module 不是一个简单的变量,相关操作都要依赖 react 的体系 |
10
lingo 2021-09-03 15:04:44 +08:00
这情况 useEffect 应该是最符合 react hook 思想的做法了吧
|
11
towave 2021-09-03 15:18:27 +08:00
传参最快
|
12
zhaol 2021-09-03 15:27:19 +08:00
react 的 setState 在 js 代码里面表现是异步的,所以你拿的值不是最新的。用 settimeout 可以解决,但是不推荐; react hook 就用 useEffect,class component 就在 setState 的第二个参数做查询;传参也简单,楼上的解决方法都挺好的
|
13
wiluxy 2021-09-03 15:29:27 +08:00
~~~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}/> ~~~ |
14
flybears 2021-09-03 16:08:01 +08:00
const changeModule = (e) => {
setModule(e.target.value) setModule(e => {}) } |
15
flybears 2021-09-03 16:09:02 +08:00
const changeModule = (e) => {
setModule(e.target.value) setModule(value => { //这个是修改之后的值 console.log(value) }) } |
16
flybluewolf 2021-09-03 16:19:29 +08:00
哎,回复没一个对的。useReducer 啊,多看官方文档啊
|
17
Puteulanus 2021-09-03 17:31:20 +08:00
狗头,之前写过一种,能用,不确定是不是正确实践
const getModule = () => new Promise(resolve => { setModule(oldState => { resolve(oldState); return oldState; }); }) 用的时候 setModule('2'); await console.log(getModule()); // get 2 |
18
Puteulanus 2021-09-03 17:33:28 +08:00
console.log(await getModule()) ,手滑
|
19
huangyu2021 2021-09-03 18:10:16 +08:00
原理就是产生了闭包 一直是原来的值
解决方法很多 |
20
shengyueming 2021-09-03 20:27:41 +08:00
1.setstate 的 callback
2.componentdidupdate 3.useeffect 4 redux-thunk |
21
coolcoffee 2021-09-03 23:17:17 +08:00
@flybluewolf useReducer 操作异步方便吗?
|
22
guoliim 2021-09-04 18:18:44 +08:00
setState 是 批处理
还是 要再看一下 官方文档吧 |
23
dengshen 2021-09-05 00:53:58 +08:00 via iPhone
嗯!千人千面。我用 vue/doge
|
24
DOLLOR 2021-09-05 22:18:40 +08:00
把 getTableData 拎到组件外面,以参数形式把 module 传给 getTableData,并以返回值把请求的数据传回组件。
|