我尝试在点击后改变每个按钮的背景颜色。问题是,它适用于所有的按钮在一起,而不是只为一个被点击。我想,我应该使用e,或者index来修复它,但我真的不知道如何做到这一点。
App.js
const initialState = [
{
person: "Ela",
age: 48
},
{
person: "Natalia",
age: 28
}
];
const green = "#39D1B4";
const yellow = "#FFD712";
export default function App() {
const [person, setPerson] = useState(initialState);
const [buttonColor, setButtonColor] = useState(green);
function handleColorChange(e) {
const button = e.target.style.backgroundColor;
const newButton = e.target.style.backgroundColor;
const newColor = buttonColor === green ? yellow : green;
setButtonColor(newColor);
}
return (
<div className="App">
{person.map((per, i) => {
return (
<Person
color={buttonColor}
key={i}
index={i}
onClick={handleColorChange}
person={per}
/>
);
})}
</div>
);
}
Person.js
import React from "react";
export default function Person({ person, onClick, color, index }) {
return (
<>
<h3>My name is {person.person}</h3>
<h3>My age is {person.age}</h3>
<button
style={{ backgroundColor: color }}
color={color}
name={person.person}
onClick={onClick}
index={index}
>
Change color
</button>
{index}
</>
);
}
谢谢你!
4条答案
按热度按时间vsmadaxz1#
你可以这样做。基本上跟踪整个人。并根据人数(即0,1)更新相应的按钮值:
下面是demo:https://stackblitz.com/edit/react-3ca52l
qv7cva1a2#
您应该将更改背景颜色的逻辑移动到Person组件。因此,每个按钮都有自己的状态和颜色值。
因为现在你把按钮的颜色存储在父组件中,并与所有的子组件共享它,这就是为什么当一个子组件改变颜色时,另一个子组件也会收到这个改变。
h6my8fg23#
只需将handleColorChange方法和buttonColor状态移动到Person组件中,这样颜色更改只会影响每个按钮本身,如下所示;
App.js
Person.js
工作示例over here
eulz3vhy4#
设置您的新颜色为您的按钮不状态。
setState调用render,所有按钮都从state获取颜色。
或者你必须在你的 Person 中有颜色 prop ,并在事件中改变颜色。(Than元素必须从Person获取颜色)