gpt4 book ai didi

reactjs - 如何结合自定义钩子(Hook)来获取数据和上下文?

转载 作者:行者123 更新时间:2023-12-03 14:30:37 26 4
gpt4 key购买 nike

我有一个自定义 Hook 来获取表单提交上的数据

export const getIssues = ({ user, repo }) => {
const [issues, setIssues] = useState([]);

const handleInputChange = (e) => {
e.preventDefault();
axios.get(`https://api.github.com/repos/${user}/${repo}/issues`)
.then((response) => {
setIssues(response.data);
})
.catch((err) => console.log(err));
};

return {
issues,
onSubmit: handleInputChange,
};
};

在我的组件中我这样调用它

const response = getIssues({ user: user.value, repo: repo.value })
return (
<form className={css['search-form']} {...response}>...</form>
)

问题是我想从另一个组件中的 Hook 获取我的 issues 值。为此我想使用 Context。但我不知道该怎么做。

我可以调用此函数并将其传递给 Provider,但我无法在没有参数的情况下调用它。所以我有点卡住了。

非常感谢所有帮助。

最佳答案

您说得对,您需要 React.Context 来处理这种情况。

  1. 您需要将组件包装到此上下文中。
import React from "react";

const IssuesStateContext = React.createContext();
const IssuesDispatchContext = React.createContext();

function issuesReducer(state, action) {
switch (action.type) {
case "setIssues": {
return [...action.payload];
}

default: {
throw new Error(`Unhandled action type: ${action.type}`);
}
}
}

function IssuesProvider({ children }) {
const [state, dispatch] = React.useReducer(issuesReducer, []);
return (
<IssuesStateContext.Provider value={state}>
<IssuesDispatchContext.Provider value={dispatch}>
{children}
</IssuesDispatchContext.Provider>
</IssuesStateContext.Provider>
);
}

function useIssuesState() {
const context = React.useContext(IssuesStateContext);
if (context === undefined) {
throw new Error("useIssuesState must be used within a IssuesProvider");
}
return context;
}
function useIssuesDispatch() {
const context = React.useContext(IssuesDispatchContext);
if (context === undefined) {
throw new Error("useIssuesDispatch must be used within a IssuesProvider");
}
return context;
}

export { IssuesProvider, useIssuesState, useIssuesDispatch };

通过在上下文中使用这种分离,您将能够在一个组件中设置来自 github 的问题,并将它们呈现在完全不同的组件中。

示例:

App.js

ReactDOM.render(
<IssuesProvider>
<Component1 />
<Component2 />
</IssuesProvider>
)

组件 1

import React from 'react'
import { useIssuesDispatch } from './issues-context'

function Component1() {
const dispatch = useIssuesDispatch()
// fetch issues
// .then dispatch({ type: 'setIssues', payload: response })

// render
}

组件 2

import React from 'react'
import { useIssuesState } from './issues-context'

function Component2() {
const issues = useIssuesState()

// if issues.length > 0 ? render : null
}

关于reactjs - 如何结合自定义钩子(Hook)来获取数据和上下文?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57746832/

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