【发布时间】:2020-10-06 00:59:24
【问题描述】:
我正在使用一个 Picker 组件来让用户设置一个值,即他们希望被提醒的频率。在下面的代码中,我将结果保存在组件的状态中,并使用异步存储将其保存到设备中:
const [frequency, setFrequency] = useState('year');
...
<Picker
selectedValue={frequency}
style={styles.picker}
itemStyle={styles.pickerItem}
onValueChange={(itemValue, itemIndex) => {
(async () => {
await AsyncStorage.setItem(`@circle_${circle.name}_frequency`, itemValue)
})();
setFrequency(itemValue);
}}
mode={'dropdown'}
prompt={'Reminder every:'}
>
<Picker.Item label="Never" value="never" />
<Picker.Item label="Day" value="day" />
<Picker.Item label="Week" value="week" />
<Picker.Item label="Year" value="year" />
etc...
</Picker>
我还想让组件抓取保存的数据并将其设置为首次渲染时的状态。
useEffect(() => {
const fetchFrequency = async () => {
let storedFrequency = await AsyncStorage.getItem(`@circle_${circle.name}_frequency`);
if (storedFrequency != null) {
setFrequency(storedFrequency);
};
}
fetchFrequency();
}, []);
根据我对异步存储的有限了解,这似乎是有道理的。我觉得是
- 等待从存储中获取值的结果
- 设置状态
- 渲染组件(这也可能在设置状态之前发生,但我认为它会在状态更改时再次渲染)
- 当用户选择新选项时更新存储和状态
但是,这不起作用。如果我离开然后返回页面,则状态已重置。
更新:
如果我 console.log 在 onValueChange 异步函数中记录 itemValue,这就是我得到的:
onValueChange={(itemValue, itemIndex) => {
(async () => {
await AsyncStorage.setItem(`@circle_${circle.name}_frequency`, itemValue)
console.log(itemValue)
})();
setFrequency(itemValue);
}}
将值更改为“从不”时,它会打印
never
never
当我离开然后返回时,甚至没有触摸组件它会打印出来:
week
week
never
never
year
year
或
year
never
year
year
或其他一些长串值,表明某处存在反馈循环。
【问题讨论】:
标签: react-native expo asyncstorage