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)
返回
查看它是否已更改