在ReactJS中使用map方法在单击时更新按钮文本

sc4hvdpw  于 2022-10-15  发布在  React
关注(0)|答案(1)|浏览(91)

我正在渲染包含按钮的对象数组中的一些数据。我从最初设置为**“选择”的状态追加按钮文本。我想要的是,当我点击任何按钮时,它的值应该更新为“选定**”。目前,当我单击任何按钮时,所有按钮值都会更新。

const TestPage = () =>{
    let buttons = [
        {name:'Select1', id:1}, 
        {name:'Select2', id:2}, 
        {name:'Select3', id:3}
    ]

    const [btnText, setbtnText] = useState('Select')

    const handleClick = () =>{
        setbtnText('Selected')
    }
    return(
        <div>
            {!!buttons && buttons.map(item =>{
                return(
                    <p key={item.id}>
                        <Button btnType='button' btnText={btnText} clickHandler={handleClick} />
                    </p>
                )
            })}
        </div>
    )
}

export default TestPage;
zujrkrfu

zujrkrfu1#

每个按钮都需要有自己的状态。当您在多个按钮之间共享一个变量时,如果任何处理程序更改了单个变量,则所有操作都将发生变化。

const Example = () => {
  const [buttons, setButtons] = React.useState([
    {name: "Select", id: 1}, 
    {name: "Select", id: 2}, 
    {name: "Select", id: 3},
  ]);

  const handleButtonClick = i => {
    setButtons(prevState => {
      const nextState = prevState.map(btn => ({
        ...btn, name: "Select"
      }));
      nextState[i].name = "Selected";
      return nextState;
    });
  };

  return (
    <div>
      {buttons.map(({name, id}, i) => 
        <button
          key={id}
          onClick={() => handleButtonClick(i)}
       >
         {name}
       </button>
      )}
    </div>
  );
};

ReactDOM.createRoot(document.querySelector("#app"))
  .render(<Example />);
<script crossorigin src="https://unpkg.com/react@18/umd/react.development.js"></script>
<script crossorigin src="https://unpkg.com/react-dom@18/umd/react-dom.development.js"></script>
<div id="app"></div>

另一种方法是将id传递给点击处理程序,并使用const i = buttons.findIndex(btn => btn.id === id)来确定应该更改哪个按钮的名称。

相关问题