如何使用Reaction中的上下文将数据从一个组件发送到另一个组件?
我需要将
selectedCoin
状态从Company
发送到details.js
如何使用context
执行此操作?
公司组件:
import React, { useState, useEffect } from "react";
import { Col, Image, Row } from "react-bootstrap";
import "./Company.scss";
// * api
import { getCoin } from "../services/api";
// *spinner
import Loader from "./Loader";
const Company = () => {
const [selectedCoin, setSelectedCoin] = useState(null);
const [coins, setCoins] = useState([]);
useEffect(() => {
const fetchAPI = async () => {
const data = await getCoin();
setCoins(data);
};
fetchAPI();
}, []);
const coinId = () => {
console.log(selectedCoin);
};
coinId();
return (
<>
{coins.length > 0 ? (
coins.map((coin) => (
<Row
className={
selectedCoin === coin.id
? "p-2 pe-3 border-top d-flex align-items-center company-list-single-active"
: "p-2 border-top d-flex align-items-center company-list-single"
}
onClick={() => {
setSelectedCoin(coin.id);
// console.log(coin.id);
// console.log(coin.name);
}}
key={coin.id}
>
<Col xxl="2" xl="2" lg="3" md="3" sm="2" xs="2">
<Image
src={coin.image}
alt={coin.name}
className="coin-image mx-2"
fluid
/>
</Col>
<Col>
<span>{coin.name}</span>
</Col>
</Row>
))
) : (
<Loader />
)}
</>
);
};
export default Company;
详细信息组件:
import React, { useState, useEffect } from "react";
import axios from "axios";
const Details = () => {
const [data, setData] = useState({
name: "",
id: "",
});
const apiDetails = async () => {
await axios
.get(`https://api.coingecko.com/api/v3/coins/${"ethereum"}`)
.then((r) => {
// console.log(response);
setData({
name: r.data.name,
id: r.data.id,
});
return setData;
});
};
useEffect(() => {
(async () => {
const response = await apiDetails();
setData({
name: response.data.name,
id: response.data.id,
});
})();
}, []);
return (
<div>
<h1>{data.name}</h1>
<h1>{data.id}</h1>
</div>
);
};
export default Details;
解决方案
看起来您只是对代码感兴趣,所以我就把代码放在这里。 显然,感觉可以自由移动代码,并确保使用对您有意义的语法
这是上下文
CoinsContext.js
import React, { createContext, useContext, useState, useEffect } from "react";
import { getCoin } from "@api";
const CoinsContext = createContext({});
export const CoinsContextProvider = ({ children }) => {
const [selectedCoin, setSelectedCoin] = useState(null);
const [coins, setCoins] = useState([]);
useEffect(() => {
const fetchAPI = async () => {
const data = await getCoin();
setCoins(data);
};
fetchAPI();
}, []);
return (
<CoinsContext.Provider value={{ selectedCoin, setSelectedCoin, coins }}>
{children}
</CoinsContext.Provider>
);
};
export const useCoins = () => useContext(CoinsContext);
要使用它,您需要包装将要使用上下文的所有页面,例如,因为您希望Details.js和Company.js使用它,所以您需要用它包装这两个页面。 我只包装整个应用程序,这意味着整个应用程序都可以使用它,但是您可以随意做您想做的事情。
应该是这样的:
index.js
import React from "react";
import ReactDOM from "react-dom";
import App from "./App";
import { CoinsContextProvider } from "./CoinsContext";
ReactDOM.render(
<React.StrictMode>
<CoinsContextProvider>
<App />
</CoinsContextProvider>
</React.StrictMode>,
document.getElementById("root")
);
现在我们已经设置了CoinsContext,可以在您的组件上使用它
Company.js
import React from "react";
import { Col, Image, Row } from "react-bootstrap";
import "./Company.scss";
// *spinner
import Loader from "./Loader";
import { useCoins } from "./CoinsContext";
const Company = () => {
const { coins, selectedCoin, setSelectedCoin } = useCoins();
return (
<>
{coins.length > 0 ? (
coins.map((coin) => (
<Row
className={
selectedCoin === coin.id
? "p-2 pe-3 border-top d-flex align-items-center company-list-single-active"
: "p-2 border-top d-flex align-items-center company-list-single"
}
onClick={() => {
setSelectedCoin(coin.id);
// console.log(coin.id);
// console.log(coin.name);
}}
key={coin.id}
>
<Col xxl="2" xl="2" lg="3" md="3" sm="2" xs="2">
<Image
src={coin.image}
alt={coin.name}
className="coin-image mx-2"
fluid
/>
</Col>
<Col>
<span>{coin.name}</span>
</Col>
</Row>
))
) : (
<Loader />
)}
</>
);
};
export default Company;
Details.js
import React, { useState, useEffect } from "react";
import axios from "axios";
import { useCoins } from "./CoinsContext";
const Details = () => {
const { selectedCoin, coins, setSelectedCoin } = useCoins();
const [data, setData] = useState({
name: "",
id: "",
});
const apiDetails = async () => {
await axios
.get(`https://api.coingecko.com/api/v3/coins/${"ethereum"}`)
.then((r) => {
// console.log(response);
setData({
name: r.data.name,
id: r.data.id,
});
return setData;
});
};
useEffect(() => {
(async () => {
const response = await apiDetails();
setData({
name: response.data.name,
id: response.data.id,
});
})();
}, []);
return (
<div>
<h1>{data.name}</h1>
<h1>{data.id}</h1>
</div>
);
};
export default Details;
我们就完事了!现在,您不仅在组件之间共享selectedCoin,而且还将所有硬币提取逻辑放在您的上下文中,这总体上是正确的操作
相关文章