【问题标题】:onClick() works on the first click only - ReactonClick() 仅适用于第一次点击 - React
【发布时间】:2020-11-21 05:16:06
【问题描述】:

我试图让 onClick() 函数对每个按钮都有效(结果相同),但到目前为止 onClick() 只有效一次。

如果我再次单击按钮(相同或不同),弹出窗口将不再起作用。

你能帮忙吗?我不知道如何解决它。

function Challange() {
  const [isPopped, setPop] = useState(false);

  const pop = () => {
    setPop(true);
  };

  return (
    <>
      {isPopped && <Dialog2 />}
      <div className="challanges">
        <h1 className="newchallenge">Choose New Challange</h1>
        <button className="challangeBtn" onClick={pop}>
          Eat Vegetarian (31days)
        </button>
        <button className="challangeBtn" onClick={pop}>
          Take the bike to work (14days)
        </button>
        <button className="challangeBtn" onClick={pop}>
          Recycle your plastic bottles (31days)
        </button>
        <button className="challangeBtn" onClick={pop}>
          Use public transport to commute (31days)
        </button>
        <button className="challangeBtn" onClick={pop}>
          Don't fly an airplane (365days)
        </button>
      </div>
    </>
  );
}

export default Challange;

【问题讨论】:

  • 你有没有打电话给setPop(false)?在您提供的代码中,它仅以一种方式发生,因此一旦将其设置为 true,它将永远保持为 true,因此任何后续点击都不会改变任何内容。

标签: javascript reactjs onclick


【解决方案1】:

您的弹出函数代码仅将状态设置为 true,因此它永远不会再次为 false。你可以这样改。

const pop = () => {
        setPop(!isPopped);
      };

【讨论】:

  • 谢谢!这行得通!唯一的问题是现在我需要点击按钮两次才能得到响应!知道为什么吗?
  • 我需要查看代码的其他部分来回答这个问题,可能与其他钩子有关。
  • 问题是弹出状态由所有按钮共享,因此如果您单击一个按钮,它会更改每个按钮的状态...控制台日志 isPopped 您会看到我在说什么
  • 有什么办法解决吗?
【解决方案2】:

在您的情况下,setPop 可以采用布尔值或返回布尔值的方法。 React 中句柄切换的最佳实践如下:

const pop = () => {
   setPop(currentValue => !currentValue);
};

另外,使用useCallback 钩子来管理点击等事件并避免在每次渲染时重新初始化你的方法:

const pop = useCallback(() => {
   setPop(currentValue => !currentValue);
}, []);

【讨论】:

  • 她遇到的问题是每个按钮共享相同的状态,这就是为什么她认为她需要单击两次才能获得所需的结果。每个按钮都需要有自己的状态
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-05-19
  • 2021-01-03
  • 2016-12-03
  • 1970-01-01
  • 1970-01-01
  • 2022-01-24
  • 1970-01-01
相关资源
最近更新 更多