我在react native中工作,我使用picker
作为下拉菜单
<Picker
style={styles.picker}
selectedValue={selectedsubject}
onValueChange={(subjectValue) => pickerActivity(subjectValue)}>
{allsubjects.map((item, index) => {
return (<Picker.Item label={item} value={item} key={index} />)
})}
</Picker>
onValueChange
prop我正在调用这个函数:
const pickerActivity = (val) => {
setselectedsubject(val)
console.log("============")
console.log(val)
console.log(selectedsubject)
console.log("============")
}
因此,当从菜单项中选择的值时,我将所选值传递给函数pickerActivity
,在此函数中,我将状态selectedsubject
更新为传递的值,然后我控制状态和值,并且在列表中我有两个值,让我们假设(value1 and value2
),所以让我们假设我按下value1
,那么发生了什么:它只控制日志传递的值,对于状态,它控制日志空字符串如下所示:
[Sat Jan 23 2021 19:43:28.899] LOG ============
[Sat Jan 23 2021 19:43:28.900] LOG value1
[Sat Jan 23 2021 19:43:28.901] LOG
[Sat Jan 23 2021 19:43:28.902] LOG ============
和第二次当我从下拉菜单中按下value2
时,传递的值将是value2
,这是正确的,但对于状态,它将显示从菜单中选择的前一项,value1
如下所示:
[Sat Jan 23 2021 19:43:28.899] LOG ============
[Sat Jan 23 2021 19:43:28.900] LOG value2
[Sat Jan 23 2021 19:43:28.901] LOG value1
[Sat Jan 23 2021 19:43:28.902] LOG ============
所以问题是状态不会从第一次更新,这里是我的状态:
const [selectedsubject, setselectedsubject] = useState('')
应该用大写字母定义set-state函数
const [selectedsubject, setSelectedsubject] = useState('');
目前,在状态更新之前,您正在调用console.log
。要查看更新的状态,您需要使用useEffect,它只在状态更新时触发:
useEffect(() => {
console.log(selectedsubject);
})
使用useState
钩子提供的更新程序进行状态更新是异步的,并且不会立即反映。
即使setselectedsubject(val)
被触发,selectedsubject
的值也不会立即更新。它将保持先前的值。