如何在 React 中重用具有不同 props 的组件?
How can I reuse a component with different props in React?
我有一个父组件,我需要多次重用一个名为 Chart 但具有不同道具的子组件,但发生的是第一个组件是唯一被修改的组件,并且还被最后一个组件的道具修改图表组件。
我知道中心号是通过组件的return修改的,但是useEffect里面的逻辑怎么实现呢?如果有人能帮助我,我是 React 的新手,谢谢。
代码
const Dashboard = () => {
return (
<>
<div className="chartContainerMain">
<div className="chartsContainer">
<div className="chartContainer">
<p className="nameChart">chart 1</p>
<Chart color="red" number={45} /> ///// This is the component i need
to reuse
</div>
<div className="chartContainer">
<p className="nameChart">chart 2</p>
<Chart color="blue" number={90} /> ///// This is the component i
need to reuse
</div>
</div>
</div>
</>
);
};
export default Dashboard;
//-------- COMPONENT CHART CODE ---------------[![enter image description here][1]][1]
import { useEffect } from "react";
import "./chart.css";
const Chart = ({ color, number }) => {
useEffect(() => {
let circle = document.querySelector(".circle");
circle.style.strokeDasharray = `${number} 100`;
circle.style.stroke = `${color}`;
}, [color, number]);
return (
<>
<div className="donut-chart">
<svg viewBox="0 0 32 32">
<circle className="circle" r="16" cx="16" cy="16" />
</svg>
<div className="donut-center">
<p className="centerNumber">{number}%</p>
</div>
</div>
</>
);
};
export default Chart;
你可以看到这张图片
https://i.stack.imgur.com/762F6.png
您 运行 遇到的问题可能与您尝试使用 <Chart />
组件修改 DOM 节点(document.querySelector(".circle")
) 直接,特别是因为 document.querySelector(".circle")
将 return 它找到的第一个元素。相反,您的 <Chart />
组件本身应该渲染该节点并根据道具应用您需要的任何样式。您可能根本不需要 useEffect
挂钩...
const Chart = ({ color, number }) => {
return (
<>
<div className="donut-chart">
<svg viewBox="0 0 32 32">
<circle className="circle"
r="16"
cx="16"
cy="16"
style={{strokeDasharray: `${number} 100`, stroke: color}}/>
</svg>
<div className="donut-center">
<p className="centerNumber">{number}%</p>
</div>
</div>
</>
);
};
export default Chart;
我不太确定您 运行 遇到的确切问题是什么,但根据您的问题和代码示例,希望这对您有所帮助,或者至少为您指明了正确的方向。
在你的情况下使用来自父级的道具的最简单方法是直接将它们注入 <cirlce style={{ strokeDasharray: `${number}, 100`, stroke: color }} />
元素的内联样式并完全删除 useEffect
。
你可以查看 react 样式的文档 https://reactjs.org/docs/dom-elements.html#style
我有一个父组件,我需要多次重用一个名为 Chart 但具有不同道具的子组件,但发生的是第一个组件是唯一被修改的组件,并且还被最后一个组件的道具修改图表组件。
我知道中心号是通过组件的return修改的,但是useEffect里面的逻辑怎么实现呢?如果有人能帮助我,我是 React 的新手,谢谢。
代码
const Dashboard = () => {
return (
<>
<div className="chartContainerMain">
<div className="chartsContainer">
<div className="chartContainer">
<p className="nameChart">chart 1</p>
<Chart color="red" number={45} /> ///// This is the component i need
to reuse
</div>
<div className="chartContainer">
<p className="nameChart">chart 2</p>
<Chart color="blue" number={90} /> ///// This is the component i
need to reuse
</div>
</div>
</div>
</>
);
};
export default Dashboard;
//-------- COMPONENT CHART CODE ---------------[![enter image description here][1]][1]
import { useEffect } from "react";
import "./chart.css";
const Chart = ({ color, number }) => {
useEffect(() => {
let circle = document.querySelector(".circle");
circle.style.strokeDasharray = `${number} 100`;
circle.style.stroke = `${color}`;
}, [color, number]);
return (
<>
<div className="donut-chart">
<svg viewBox="0 0 32 32">
<circle className="circle" r="16" cx="16" cy="16" />
</svg>
<div className="donut-center">
<p className="centerNumber">{number}%</p>
</div>
</div>
</>
);
};
export default Chart;
你可以看到这张图片 https://i.stack.imgur.com/762F6.png
您 运行 遇到的问题可能与您尝试使用 <Chart />
组件修改 DOM 节点(document.querySelector(".circle")
) 直接,特别是因为 document.querySelector(".circle")
将 return 它找到的第一个元素。相反,您的 <Chart />
组件本身应该渲染该节点并根据道具应用您需要的任何样式。您可能根本不需要 useEffect
挂钩...
const Chart = ({ color, number }) => {
return (
<>
<div className="donut-chart">
<svg viewBox="0 0 32 32">
<circle className="circle"
r="16"
cx="16"
cy="16"
style={{strokeDasharray: `${number} 100`, stroke: color}}/>
</svg>
<div className="donut-center">
<p className="centerNumber">{number}%</p>
</div>
</div>
</>
);
};
export default Chart;
我不太确定您 运行 遇到的确切问题是什么,但根据您的问题和代码示例,希望这对您有所帮助,或者至少为您指明了正确的方向。
在你的情况下使用来自父级的道具的最简单方法是直接将它们注入 <cirlce style={{ strokeDasharray: `${number}, 100`, stroke: color }} />
元素的内联样式并完全删除 useEffect
。
你可以查看 react 样式的文档 https://reactjs.org/docs/dom-elements.html#style