大佬教程收集整理的这篇文章主要介绍了在第一次渲染时未定义上下文中的 React Native 数据,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我使用 AppContext
,当我从服务器获取数据时,我希望它保存在上下文中,但在第一次渲染时它不会保存。如果我做一些事情来重新渲染状态数据会出现在上下文中。
这是我的代码:
useEffect(() => {
fetch('https://beautiful-places.ru/API/places')
.then((responsE) => response.Json())
.then((Json) => myContext.updatePlaces(Json))
.then(() => console.log('JsonData',myContext.getPlaces()))
.catch((error) => console.error(error));
},[]);
我的 getPlaces
和 updatePlaces
方法:
const [allPlaces,setAllPlaces] = useState();
const getPlaces = () => {
return allPlaces;
};
const updatePlaces = (Json) => {
setAllPlaces(Json);
};
const placesSetTings = {
getPlaces,updatePlaces,};
<AppContext.ProvIDer value={placesSetTings}>
<themeProvIDer>
<LoadAssets {...{ assets }}>
<SafeAreaProvIDer>
<AppStack.Navigator headerMode="none">
<AppStack.Screen
name="Authentication"
component={AuthenticationNavigator}
/>
<AppStack.Screen name="Home" component={HomeNavigator} />
</AppStack.Navigator>
</SafeAreaProvIDer>
</LoadAssets>
</themeProvIDer>
</AppContext.ProvIDer>;
你能解释一下为什么我的 console.log('JsonData',...)
返回 undefined
吗?
我不明白,因为我在上一个 .then
保存了它。
编辑以注意以下代码未准备好复制粘贴。这是一个如何解决问题的示例 - 您需要在您的项目中正确实施它。
“问题”在于钩子是异步的——在这种特定情况下,您的 useEffect
也进一步使用了异步 fetch
。
这意味着 fetch
返回的数据仅在组件呈现后才可用,并且由于您没有使用钩子更新状态/上下文,因此上下文不会更新。
执行此操作的方法需要进行一些更改。
context
实现中,您应该有一个设置状态变量的 setter
方法,而您的 getter
应该是该状态变量。placesContext.js
import React,{ createContext,useState } from "react";
export const placesContext = createContext({
setPlaces: () => {},places: [],});
const { Provider } = placesContext;
export const PlacesProvider = ({ children }) => {
const [currentPlaces,setCurrentPlaces] = useState(unit);
const setPlaces = (places) => {
setCurrentPlaces(places);
};
return (
<Provider value={{ places: currentPlaces,setPlaces }}>{Children}</Provider>
);
};
App.js
import { PlacesProvider } from "../path/to/placesContext.js";
const App = () => {
// ...
return (
<PlacesProvider>
// Other providers,and your app Navigator
</PlacesProvider>
);
}
@H_733_3@myComponent.js
import { placesContext } from "../path/to/placesContext.js";
export const MyComponent = () => {
const { currentPlaces,setPlaces } = useContext(placesContext);
const [hasLoaded,setHasLoaded] = useState(false);
useEffect(() => {
async function fetchPlacesData() {
const placesData = await fetch('https://beautiful-places.ru/api/places');
if (placesData) {
setPlaces(placesData);
} else {
// error
}
setHasLoaded(true);
}
!hasLoaded && fetchPlacesData();
},[hasLoaded]);
return (
<div>{JSON.Stringify(currentPlaces)}</div>
)
};
以上是大佬教程为你收集整理的在第一次渲染时未定义上下文中的 React Native 数据全部内容,希望文章能够帮你解决在第一次渲染时未定义上下文中的 React Native 数据所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。