gpt4 book ai didi

javascript - 从子组件向 React 上下文添加值

转载 作者:行者123 更新时间:2023-11-29 22:53:22 26 4
gpt4 key购买 nike

我正在尝试在我的 React Native 应用程序中使用 React 上下文作为状态管理器。

这里是上下文:

import React, { createContext, useState, useEffect } from "react";
import axios from "axios";
export const GlobalContext = createContext();

export const Provider = ({ children }) => {
const [tracksList, setTracksList] = useState([
{
track_list: []
}
]);

useEffect(() => {
axios
.get(
`https://cors-anywhere.herokuapp.com/https://api.musixmatch.com/ws/1.1/chart.tracks.get?page=1&page_size=10&country=us&f_has_lyrics=1&apikey=${
process.env.REACT_APP_MM_KEY
}`
)
.then(res => {
setTracksList([
{
track_list: res.data.message.body.track_list
}
]);
})
.catch(err => console.log(err));
}, []);

return (
<GlobalContext.Provider value={[tracksList, setTracksList]}>
{children}
</GlobalContext.Provider>
);
};

export const Consumer = GlobalContext.Consumer;

子组件。在这里,我想进行 API 调用以获取用户并将此用户字段设置为全局上下文。我可以从消费者那里获取上下文值,但是如何设置新值?

import React, { useContext } from "react";

import { GlobalContext } from "../../context/context";

const Demo = () => {
const contextValue = useContext(GlobalContext);

console.log(contextValue, "Context outside from JSX");
return <div>Content</div>;
};

export default Demo;

那么,是否可以从每个子组件向 React 上下文添加新值,就像在 Redux 中一样?提前致谢!

最佳答案

您可以使用 useReducer 效果来实现 Redux reducer:

// Create context
export const ApiContext = React.createContext();

// Create some reducer function
const reducer = (state, action) => {
if (action.type === 'some action name') {
return {
...state,
report: action.payload,
};
}

return state;
};

// Overwrite a context provider
const Provider = ({ children }) => {
const [state, dispatch] = React.useReducer(reducer, {});

return (
<ApiContext.Provider
value={{
...state,
dispatch,
}}
>
{children}
</ApiContext.Provider>
);
};

然后你可以在组件中使用如下:

const Component = () => {
const { dispatch, report } = React.useContext(ApiContext);

React.useEffect(() => {
const asyncPost = async () => {
const response = await fetch('some endpoint', {
method: 'POST',
});

const payload = await response.json();

// This will call a reducer action and update a state
dispatch({
type: 'some action name',
payload,
});
}
}, []);

...
};

所以当 Component 被挂载时,状态将是一个空对象。然后,当您使用 some action name 操作更新状态时,状态变为 { report: some data from fetch }

关于javascript - 从子组件向 React 上下文添加值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57027527/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com