Javascript 如何在react native中为数组设置状态值?
我有一个功能组件,Javascript 如何在react native中为数组设置状态值?,javascript,reactjs,react-native,Javascript,Reactjs,React Native,我有一个功能组件,ListKeys。当它加载时,我想将一个空的密钥数组设置为从存储器中提取的所有密钥的列表。以下是我目前掌握的情况: const ListKeys = props => { const [keys, setKeys] = useState([]); const [areKeysLoaded, setAreKeysLoaded] = useState(false); useEffect(() => { if(!areKeysL
ListKeys
。当它加载时,我想将一个空的密钥数组设置为从存储器中提取的所有密钥的列表。以下是我目前掌握的情况:
const ListKeys = props => {
const [keys, setKeys] = useState([]);
const [areKeysLoaded, setAreKeysLoaded] = useState(false);
useEffect(() => {
if(!areKeysLoaded){
loadSavedKeys();
setAreKeysLoaded(true);
console.log(keys)
}
});
async function loadSavedKeys(){
try {
var allKeys = await AsyncStorage.getAllKeys();
console.log(allKeys);
setKeys(allKeys);
}
catch {
console.log("Error: Cannot access saved data.");
}
}
return (
<View></View>
);
};
export default ListKeys;
const ListKeys=props=>{
const[keys,setKeys]=useState([]);
const[areKeysLoaded,setAreKeysLoaded]=useState(false);
useffect(()=>{
如果(!areKeysLoaded){
loadSavedKeys();
setAreKeysLoaded(真);
console.log(键)
}
});
异步函数loadSavedKeys(){
试一试{
var allKeys=await AsyncStorage.getAllKeys();
控制台日志(所有键);
设置键(所有键);
}
抓住{
log(“错误:无法访问保存的数据”);
}
}
返回(
);
};
导出默认列表键;
此代码正确获取键列表并将其输出到控制台。这在第16行完成:console.log(allkey)代码>
然而,当我随后设置键(所有键)时代码>,这不起作用。我知道这一点,因为第9行:console.log(keys)
输出一个空数组
我猜我不能仅仅将一个状态值数组设置为另一个数组,但我对JS或React Native没有足够的经验来了解原因
有人能告诉我如何将键
数组正确设置为所有键
数组吗?您需要等待loadSavedKeys
先解析,然后再尝试设置,因为它是异步的
:
const ListKeys = props => {
const [keys, setKeys] = useState([]);
const [areKeysLoaded, setAreKeysLoaded] = useState(false);
useEffect(() => {
if (areKeysLoaded) return
AsyncStorage
.getAllKeys()
.then((keys) => {
setAreKeysLoaded(true)
setKeys(keys)
})
.catch(e => console.error(e));
}, []);
return (
<View></View>
);
};
export default ListKeys;
const ListKeys=props=>{
const[keys,setKeys]=useState([]);
const[areKeysLoaded,setAreKeysLoaded]=useState(false);
useffect(()=>{
如果(已加载密钥)返回
异步存储
.getAllKeys()
。然后((键)=>{
setAreKeysLoaded(真)
设置键(键)
})
.catch(e=>console.error(e));
}, []);
返回(
);
};
导出默认列表键;
注意:我简化了代码,因为它看起来比必要的代码更冗长。由于是异步的,所以在获取密钥之前,您需要等待getAllKeys
解析
另外,如果您只想让它运行一次,您可能不需要areKeysLoaded
,但我想您可以使用它作为加载指示器?您在哪里调用loadSavedKeys
?您正在调用loadKeys
,但您的函数似乎被命名为loadSavedKeys
。你也不是在等待它。是的,我很抱歉,修正了代码。问题仍然存在,我的问题版本的代码中有一个输入错误。更改状态是异步的,设置后您不会立即看到更改。尝试在上面console.log(allKeys)
返回查看它是否已更改