return 如何在 React 中分别使用父子组件?
How to use return a parent and child component separately in React?
我有一个 GetData 组件,我可以在其中进行 API 调用。然后我将数据作为 props 转发给将使用数据的 graph 组件。在应用程序中,我然后 return GetData 组件来呈现图形。问题是 两个图现在合并为一个组件。我想把它们分开,这样我就可以给两个组件一个自己的框,并在每个组件旁边放一个按钮框。
有没有办法分别处理这些组件,以便为两个图形提供单独的容器并在它们旁边放置按钮组件?
这是我的代码:
获取数据:
import React, { useState, useEffect, Fragment } from "react";
import axios from "axios";
import GraphChart from "../components/GraphChart";
import BarChart from "../components/BarChart";
const config = {
"Content-Type": "application/json",
Accept: "application/json",
};
const GetData = () => {
const [arrayFlow, setArrayFlow] = useState([]);
// eslint-disable-next-line react-hooks/exhaustive-deps
useEffect(async () => {
const { data } = await axios({
url: "http://192.168.170./*",
method: "GET",
data: null,
withCredentials: true,
headers: config,
});
console.log(data);
const newData = data.value.map((d) => {
const idNumber = d._idNumber;
const startDate =
d.startDate;
const endDate =
d._endDate;
return {
idNumber,
startDate,
endDate,
};
});
setArrayFlow(newData);
}, []);
return (
<>
<GraphChart flow={arrayFlow} />
<BarChart flow={arrayFlow} />
</>
);
};
export default GetData;
App.js:
import "./App.css";
import React from "react";
import GetData from './apiData/GetData'
import { Button } from "./components/button/Button";
import GraphChart from "./components/GraphChart";
const App = () => {
return (
<div className="app">
<div className="example">
<div className="graph-box">
<div id="wrapper">
<GraphChart />
</div>
<div className="side-bar">
<Button>Sort</Button>
</div>
</div>
<div className="graph-box">
<div id="wrapper">
<GetData />
</div>
<div className="side-bar">
<Button>Sort</Button>
</div>
</div>
</div>
</div>
);
};
export default App;
图表,去除杂乱:
import React, { useEffect, useState } from "react";
import Chart from "react-apexcharts";
import _ from "lodash";
import { format, parseISO } from "date-fns";
const GraphChart = ({ instroom }) => {
const [category, setCategory] = useState([]);
const [data, setData] = useState([]);
useEffect(() => {
let series = [];
let categories = [];
let orderedFlow = _.orderBy(
flow,
["startDate"],
["asc", "desc"]
);
for (let i = 0; i < orderedFlow.length; i++) {
series.push(orderedFlow[i].idNumber);
categories = categories.concat(
format(
parseISO(orderedFlow[i].startDate),
"dd MMM YYY"
)
);
}
setCategory(categories);
setData(series);
}, [flow]);
return (
<div>
<Chart
options={{
chart: {
id: "basic-graph",
}}}
series={[
{
name: "ID",
data: data,
},
]}
type="area"
width="1500"
height="500"
/>
</div>
);
};
export default GraphChart;
为什么不创建 useGetData
挂钩,而是使用 <GetData/>
组件?
那个钩子将负责获取数据。您可以从 <Graphs/>
的父级调用它并向它们提供数据。
useGetData
代码看起来像这样:
useGetData.js
const useGetData = () => { // You can also pass some params to it
const [data,setData] = useState(null);
const [isLoading,setIsLoading] = useState(true);
const [error,setError] = useState(null);
useEffect(() => {
// CALL AXIOS
// ON SUCCESS
// setData(data) and setIsLoading(false)
// ON ERROR
// setError(error) and setIsLoading(false)
},[]);
return {
data,
isLoading,
error
};
};
App.js
const { data, isLoading, error } = useGetdata();
return (
isLoading ? <Spinner/>
: error ? <Error/>
: <Chart1 data={data}/> and <Chart2 data={data}/>
);
我有一个 GetData 组件,我可以在其中进行 API 调用。然后我将数据作为 props 转发给将使用数据的 graph 组件。在应用程序中,我然后 return GetData 组件来呈现图形。问题是 两个图现在合并为一个组件。我想把它们分开,这样我就可以给两个组件一个自己的框,并在每个组件旁边放一个按钮框。
有没有办法分别处理这些组件,以便为两个图形提供单独的容器并在它们旁边放置按钮组件?
这是我的代码:
获取数据:
import React, { useState, useEffect, Fragment } from "react";
import axios from "axios";
import GraphChart from "../components/GraphChart";
import BarChart from "../components/BarChart";
const config = {
"Content-Type": "application/json",
Accept: "application/json",
};
const GetData = () => {
const [arrayFlow, setArrayFlow] = useState([]);
// eslint-disable-next-line react-hooks/exhaustive-deps
useEffect(async () => {
const { data } = await axios({
url: "http://192.168.170./*",
method: "GET",
data: null,
withCredentials: true,
headers: config,
});
console.log(data);
const newData = data.value.map((d) => {
const idNumber = d._idNumber;
const startDate =
d.startDate;
const endDate =
d._endDate;
return {
idNumber,
startDate,
endDate,
};
});
setArrayFlow(newData);
}, []);
return (
<>
<GraphChart flow={arrayFlow} />
<BarChart flow={arrayFlow} />
</>
);
};
export default GetData;
App.js:
import "./App.css";
import React from "react";
import GetData from './apiData/GetData'
import { Button } from "./components/button/Button";
import GraphChart from "./components/GraphChart";
const App = () => {
return (
<div className="app">
<div className="example">
<div className="graph-box">
<div id="wrapper">
<GraphChart />
</div>
<div className="side-bar">
<Button>Sort</Button>
</div>
</div>
<div className="graph-box">
<div id="wrapper">
<GetData />
</div>
<div className="side-bar">
<Button>Sort</Button>
</div>
</div>
</div>
</div>
);
};
export default App;
图表,去除杂乱:
import React, { useEffect, useState } from "react";
import Chart from "react-apexcharts";
import _ from "lodash";
import { format, parseISO } from "date-fns";
const GraphChart = ({ instroom }) => {
const [category, setCategory] = useState([]);
const [data, setData] = useState([]);
useEffect(() => {
let series = [];
let categories = [];
let orderedFlow = _.orderBy(
flow,
["startDate"],
["asc", "desc"]
);
for (let i = 0; i < orderedFlow.length; i++) {
series.push(orderedFlow[i].idNumber);
categories = categories.concat(
format(
parseISO(orderedFlow[i].startDate),
"dd MMM YYY"
)
);
}
setCategory(categories);
setData(series);
}, [flow]);
return (
<div>
<Chart
options={{
chart: {
id: "basic-graph",
}}}
series={[
{
name: "ID",
data: data,
},
]}
type="area"
width="1500"
height="500"
/>
</div>
);
};
export default GraphChart;
为什么不创建 useGetData
挂钩,而是使用 <GetData/>
组件?
那个钩子将负责获取数据。您可以从 <Graphs/>
的父级调用它并向它们提供数据。
useGetData
代码看起来像这样:
useGetData.js
const useGetData = () => { // You can also pass some params to it
const [data,setData] = useState(null);
const [isLoading,setIsLoading] = useState(true);
const [error,setError] = useState(null);
useEffect(() => {
// CALL AXIOS
// ON SUCCESS
// setData(data) and setIsLoading(false)
// ON ERROR
// setError(error) and setIsLoading(false)
},[]);
return {
data,
isLoading,
error
};
};
App.js
const { data, isLoading, error } = useGetdata();
return (
isLoading ? <Spinner/>
: error ? <Error/>
: <Chart1 data={data}/> and <Chart2 data={data}/>
);