如何结合自定义钩子来获取数据和上下文?

All*_*lan 5 reactjs

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

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,
  };
};
Run Code Online (Sandbox Code Playgroud)

在我的组件中我这样称呼它

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

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

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

非常感谢所有的帮助。

Ale*_*ada 2

你说得对,你需要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 };
Run Code Online (Sandbox Code Playgroud)

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

例子:

应用程序.js

ReactDOM.render(
  <IssuesProvider>
    <Component1 />
    <Component2 />
  </IssuesProvider>
)
Run Code Online (Sandbox Code Playgroud)

组件1

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

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

  // render
}
Run Code Online (Sandbox Code Playgroud)

组件2

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

function Component2() {
  const issues = useIssuesState()

  // if issues.length > 0 ? render : null
}
Run Code Online (Sandbox Code Playgroud)