reactjs - React - 两个按钮 - 单击其中一个会同时打开
问题描述
我有一个带有 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。
解决方案
我的理解是,您是说当您单击一个按钮时,两个按钮的状态似乎都已更新,但您只希望单击的按钮更新其状态。(即,如果您单击按钮 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>
)
}
推荐阅读
- google-apps-script - 如何创建修改 Google 表格中特定单元格的 URL?
- bash - Bash:[[ -v xxx ]] 在登录 shell 中测试失败
- r - 替换R中列表列表中的值
- python - 在容器化网站中临时存储图像数据的最佳方式是什么?
- node.js - NestJs - 如何修改拦截器
- ruby-on-rails - actioncable中未订阅频道流的信息
- unix - 在 UNIX 中保持相同顺序从另一个文件中查找一个文件的内容
- go - Golang Api Kind Struct Creation 上的类型冲突
- java - 单个 netty 服务器中的多个 Socket 服务器
- python - 将输入发送到后台运行的 Bluestacks 应用程序