#reactjs #use-context
#reactjs #использовать-контекст
Вопрос:
У меня есть context.js как следует, и до сих пор данные жестко закодированы (широта и долгота), а также начальные значения погоды, сохраненные в виде объектов в том же формате, который я получу с сервера. На данный момент у меня есть поле ввода, в конечном итоге оно будет изменено на Google places, но я просто хотел, чтобы функциональность работала сейчас.
Как я могу вернуть входные данные из формы обратно в контекст, чтобы снова запустить запрос на выборку при отправке формы?
Сервер и запрос axios работают идеально.
Мой текущий context.js который предусмотрен в index.js оборачивая все вокруг
const AppProivider = ({ children }) => {
const [loading, setLoading] = useState(false);
const [latitude, setLatitude] = useState(54.978252);
const [longitude, setLongitude] = useState(-1.61778);
const [current, setCurrent] = useState(currentx);
const [hourly, setHourly] = useState(hourlyx);
const [future, setFuture] = useState(futurex);
const fetchWeather = useCallback(async () => {
setLoading(true);
try {
const response = await axios.get("http://localhost:8000/weather", {
params: { latitude, longitude },
});
const { current, hourly, future } = await response.data;
if (current amp;amp; hourly amp;amp; future) {
setCurrent(current);
setHourly(hourly);
setFuture(future);
} else {
setCurrent(currentx);
setFuture(hourlyx);
setHourly(futurex);
}
setLoading(false);
} catch (error) {
setLoading(false);
console.log(error);
return "There was a problem fetching the weather information, please try again";
}
}, [latitude, longitude]);
useEffect(() => {
fetchWeather();
}, [latitude, longitude, fetchWeather]);
return (
<AppContext.Provider
value={{
loading,
current,
future,
hourly,
setLongitude,
setLatitude,
}}
>
{children}
</AppContext.Provider>
);
};
export const useGlobalContext = () => {
return useContext(AppContext);
};
export { AppContext, AppProivider };
Мой текущий, очень простой, App.js для сбора информации
import { useGlobalContext } from "../../context";
const App = () => {
const { current, hourly, future, setLatitude } = useGlobalContext();
const [lat, setLat] = useState(1);
const handleChange = (e) => {
e.preventDefault();
setLatitude(lat);
console.log(current);
};
return (
<div>
<form onSubmit={handleChange}>
<input type="number" onChange={(e) => setLat(e.target.value)}></input>
<input type="submit"></input>
</form>
</div>
);
};
export default App;
Ответ №1:
если вам нужно изменить контекст, вы должны использовать useState и поместить внутри context state и setState
const App = () => {
let [state,setState] = useState({value: 1, value: 2})
<AppContext.Provider value={{state,setState}}>
<YourComponent />
</AppContext.Provider>
}
теперь все ваши компоненты знакомы с состоянием, и все они тоже могут изменять состояние, вам нужно только извлечь эту функцию из контекста и использовать, когда вам нужно
let {state,setState} = useContext(AppContext);
Комментарии:
1. Я не понимаю? У меня есть состояния в контексте и передать setState этому компоненту?
2. Спасибо, но я делаю это. Весь мой компонент <App> заключен в поставщик контекста в index.js и мой компонент приложения разрушает setState (в данном случае setlatity) из реквизитов вместе со значениями. Я могу получить доступ к значениям, поэтому я также могу получить доступ к функции setState. Когда я обновляю функцию set state в приложении, я хочу, чтобы она вызывала функцию fetchWeather в моем контексте и также обновляла состояния в контексте, что должно работать с кодом в context.js
3. Я пытаюсь сделать то же самое.. Я нашел несколько более подробных документов в расширенном разделе react native hooks, которые мне очень помогли: reactjs.org/docs /…
Ответ №2:
Я решил это сам с помощью простой ошибки, которую я допустил. Функциональность была в порядке, это была ошибка опечатки / параметра от меня. В context.js Я изменился
const response = await axios.get('http://localhost:8000/weather', {
params: { latitude, longitude }
})
Для этого
const response = await axios.get('http://localhost:8000/weather', {
params: { lat: latitude, lon: longitude }
})
Поскольку мой сервер имеет код, как показано ниже, и ожидал, что параметры запроса будут отличаться от того, что я предоставил
const { lat, lon } = req.query