【问题标题】:Is there any method to store API data in context API?有什么方法可以在上下文 API 中存储 API 数据?
【发布时间】:2021-12-26 02:52:22
【问题描述】:

我想获取 API 数据并将其存储在上下文 API 中并在其他组件中使用它。问题是,每当页面加载最初时,它都会给出错误

TypeError: Cannot read properties of undefined

这可能是因为 API 是在之后获取数据,而组件是先渲染的。 这是我的上下文代码:

 export const CrossRatesProvider = (props) => {
        const [crossRates, setCrossRates] = useState([])
    
        useEffect(() =>{
            async function fetchaud()
        { 
             await fetch('https://freecurrencyapi.net/api/v2/latest?apikey=6cfea260-497f-11ec-94b3-adf08d2418fe&base_currency=AUD')
        .then(res => res.json())
        .then(data => {
            setCrossRates(data);
            console.log(data)
        })
    }
        fetchaud();
         },[])
        const value = {
            crates: [crossRates, setCrossRates]
        }
    
        return (
            <CrossRatesContext.Provider value={value}>
            {props.children}
        </CrossRatesContext.Provider>
            
        )
    }

这是我使用上下文数据的组件:

export default function XnaToCountry() {
  const value = useContext(CrossRatesContext);
 const [cRates] = value.crates;
if ( !cRates.length) {
    return null;
  }
  return (
    <div>
       <Table responsive style={{fontSize:"small"}}>
      <tbody>
      <tr>
       <td>{(0.0119063760/cRates.data.AUD).toFixed(9)}</td>
      </tr>
      </tbody>
    </Table>
    </div>
  )
}

【问题讨论】:

  • XnaToCountry 是否包含在您的应用程序中的 CrossRatesProvider 中?
  • 是的,它被包装了

标签: reactjs react-context


【解决方案1】:

工作解决方案

上下文

import { useEffect, useState, createContext } from "react";

export const CrossRatesContext = createContext();

export const CrossRatesProvider = (props) => {
  const [crossRates, setCrossRates] = useState([]);

  useEffect(() => {
    async function fetchaud() {
      await fetch(
        "https://freecurrencyapi.net/api/v2/latest?apikey=6cfea260-497f-11ec-94b3-adf08d2418fe&base_currency=AUD"
      )
        .then((res) => res.json())
        .then((res) => {
          console.log(res.data);
          setCrossRates(res.data);
        });
    }
    fetchaud();
  }, []);
  const value = {
    crates: [crossRates, setCrossRates]
  };

  return (
    <CrossRatesContext.Provider value={value}>
      {props.children}
    </CrossRatesContext.Provider>
  );
};

index.js

import { CrossRatesProvider } from "./context";

const rootElement = document.getElementById("root");
ReactDOM.render(
    <CrossRatesProvider>
      <App />
    </CrossRatesProvider>,
  rootElement
);

用法

export default function App() {
  const value = useContext(CrossRatesContext);
  const [cRates] = value.crates;
  console.log(cRates);
  return <div></div>;
}

代码沙盒链接 - https://codesandbox.io/s/elegant-lumiere-emx5k?file=/src/App.js

【讨论】:

  • 当您提到 export default function App() { return
    {cRates.data.AUD}
    ; 时仍然显示相同的错误在 App() 函数的最后一次。您可以在代码和框链接上查看。
  • @Beren 由于 cRates 中没有名为 'data' 的属性,因此如果使用 {cRates.data.AUD} 会出现错误。要访问 cRates 的 AUD 属性,请使用 {cRates.AUD}。重新检查代码框链接。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-07-23
  • 1970-01-01
  • 2017-01-24
  • 1970-01-01
  • 2018-02-11
  • 1970-01-01
  • 2021-01-04
相关资源
最近更新 更多