【问题标题】:React - two buttons - a click on one of them opens bothReact - 两个按钮 - 单击其中一个会同时打开
【发布时间】:2021-05-15 13:39:37
【问题描述】:

我有一个带有 onClick 处理程序及其状态的 React 按钮组件 - 说明它是否在单击时打开。如果我在包装容器中呈现两个这样的组件,然后单击其中一个,两个按钮都会更新状态。我应该如何处理状态,以便在不使用 id 的情况下只更新一个按钮?

import React, {useState} from 'react';

const Button = (props) => {
   const [open, setOpen] = useState(false);
   const text = open ? 'Open' : 'Closed';
   const toggleButton = () => { setOpen(!open) };
   
   return (
     <button onClick={toggleButton}>{text}</button>
   )
}

// parent component
import React from 'react';
import Button from './Button'

const ButtonsWrapper = () => {
    return (
        <div>
            <Button />
            <Button />
        </div>
    )
}

我还尝试反转逻辑并将状态放入包装器组件中,然后将 onClick 处理程序作为道具传递给按钮,但情况相同。当其中一个被点击时,它们都会同时改变状态。

我正在使用 React Hooks。

【问题讨论】:

  • 您能帮我们在codesandbox上重现您的问题吗?
  • 请给我一些时间。
  • 我看不出这段代码有什么问题。同意小提琴或其他东西会很好。
  • 我再次检查,这段代码有效 - codepen.io/bakrall/pen/WNooMbR - 你是对的。非常感谢您的帮助!

标签: reactjs react-hooks


【解决方案1】:

我的理解是,您是说当您单击一个按钮时,两个按钮的状态似乎都已更新,但您只希望单击的按钮更新其状态。 (即,如果您单击按钮 A,则只有该按钮将显示“打开”作为其文本,按钮 B 将继续显示关闭)

如果以上是正确的,那么你的代码应该已经做了正确的事情。如果没有,那么您可能在其他地方有一个错误会导致这种情况。

但是,如果您想单击一个按钮并且两者都应该切换状态,那么您可以通过跟踪父组件中的状态来实现:

import React, {useState} from 'react';

const Button = (props) => {
   const text = props.isOpen ? 'Open' : 'Closed';

   const handleClick = () => {
     // do some stuff you want each button to do individually
     .....

     props.onClick()
   }
   
   return (
     <button onClick={handleClick}>{text}</button>
   )
}

// parent component
import React from 'react';
import Button from './Button'

const ButtonsWrapper = () => {
    const [buttonState, setButtonState] = useState(false)
    return (
        <div>
            <Button onClick={() => setButtonState(!buttonState)} isOpen={buttonState} />
            <Button onClick={() => setButtonState(!buttonState)} isOpen={buttonState} />
        </div>
    )
}

【讨论】:

  • 你的第一个理解是对的——我想点击一个,只有这个应该更新状态。不过,您是说它应该可以工作。
  • 非常感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多