Reactjs 反应本机选择器值未正确更新
我在react native中工作,并使用Reactjs 反应本机选择器值未正确更新,reactjs,react-native,setstate,Reactjs,React Native,Setstate,我在react native中工作,并使用选择器作为下拉菜单 <Picker style={styles.picker} selectedValue={selectedsubject} onValueChange={(subjectValue) => pickerActivity(subjectValue)}> {allsubjects.map((item, index) => {
选择器作为下拉菜单
<Picker
style={styles.picker}
selectedValue={selectedsubject}
onValueChange={(subjectValue) => pickerActivity(subjectValue)}>
{allsubjects.map((item, index) => {
return (<Picker.Item label={item} value={item} key={index} />)
})}
</Picker>
因此,当从菜单项中选择值时,我将所选值传递给该函数中的函数pickerActivity
,我将状态selectedsubject
更新为传递的值,然后我控制状态和值,在列表中我有两个值,比如说(value1和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,它仅在以下情况下激发:
您应该像这样用大写字母定义set state函数
const [selectedsubject, setSelectedsubject] = useState('');
目前,您正在状态更新之前调用console.log
。
要查看更新的状态,需要使用useEffect,它仅在以下情况下激发:
使用useState
hook提供的更新程序进行的状态更新是异步的,不会立即反映出来
即使触发了setselectedsubject(val)
,selectedsubject
值也不会立即更新。它将保留以前的值。使用useState
hook提供的更新程序进行的状态更新是异步的,不会立即反映出来
即使触发了setselectedsubject(val)
,selectedsubject
值也不会立即更新。它将保留以前的值。“将setState()视为更新组件的请求,而不是即时命令。”@NadiaChibrikova如何使用功能组件实现这一点?您试图实现什么?在处理程序中,您可以使用val
并在下次渲染时更新该值,除了混淆控制台日志之外,您还有什么问题?“将setState()视为更新组件的请求,而不是即时命令。”@NadiaChibrikova如何使用功能组件实现这一点?您试图实现什么?在处理程序中,您可以使用val
并在下一次渲染时更新值,除了混淆控制台日志之外,您还有什么问题?仍然不工作更新我的答案仍然不工作更新我的答案
useEffect(() => {
console.log(selectedsubject);
})