- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想单击 Card extra 中的 X 按钮以显示“Confirm Remove Todo modal”。
现实是当我点击 X 按钮然后它从 Card 事件中看到“Edit Todo modal”时。
我该如何解决?
{todos.map(todo => (
<Card
className={styles.CardTodo}
headStyle={{ textAlign: 'left' }}
bodyStyle={{ textAlign: 'left' }}
key={todo._id}
title={todo.title}
onClick={() => handleSelectTodo(todo._id)}
extra={
<Button
type="danger"
shape="circle"
style={{ color: 'white', zIndex: 10 }}
onClick={() => handleRemoveTodo(todo._id)}
>
X
</Button>
}
>
{todo.description}
</Card>
))}
.
.
e.stopPropagation() 对我很有用。
它是 handleRemoveTodo() 是打开另一个模式的函数。但是那个模式没有得到“Todo object”
当我删除 e.stopPropagation() 时,模态将再次获取 Todo 对象
const handleRemoveTodo = () => {
setModalConfirmRemoveVisible(true)
}
const handleConfirmRemove = async todoId => {
console.log('Hello', todoId)
setIsRemoveLoading(true)
try {
await axios.delete(`/todos/${todoId}`, apiConfig)
} catch (err) {
console.error(err)
console.error(err.response.data)
}
await fetchTodos()
setModalConfirmRemoveVisible(false)
setIsRemoveLoading(false)
}
return (
{modalConfirmRemoveVisible && (
<ModalConfirmRemoveTodo
visible={modalConfirmRemoveVisible}
todo={todo}
isRemoveLoading={isRemoveLoading}
onConfirmRemoveTodo={handleConfirmRemove}
onCancel={() => setModalConfirmRemoveVisible(false)}
onConfirmRemove={handleConfirmRemove}
/>
)}
)
const ModalConfirmRemoveTodo = props => {
const { visible, isRemoveLoading, onCancel, todo, onConfirmRemove } = props
console.log('ModalConfirmRemoveTodo', todo)
return (
<>
<Modal
visible={visible}
title={<Title level={3}>Remove Todo</Title>}
okButtonProps={{ loading: isRemoveLoading, disabled: isRemoveLoading }}
okText="Remove"
okType="danger"
onOk={() => onConfirmRemove(todo._id)}
onCancel={onCancel}
>
Want delete {todo.title} ?
</Modal>
</>
)
}
最佳答案
这称为事件冒泡。当事件发生在某个元素上时,它首先会在该元素上运行处理程序,然后在其父元素上运行,然后一直向上在其他祖先元素上运行。
详情请引用这篇文章:https://javascript.info/bubbling-and-capturing#bubbling
下面是我对你的问题的解决方案。我没有打开模式,而是使用一个简单的警报来模拟它。
您当前的问题:https://codesandbox.io/s/event-bubbling-bojvq
您会看到 Chrome 警报会弹出两次。前者来自extra
的onClick
,后者来自Card
的onClick
。
解决方案:https://codesandbox.io/s/prevent-bubbling-zkxk6
只需添加一个简单的e.stopPropagation()
即可防止extra
按钮onClick
中的冒泡。请引用:https://javascript.info/bubbling-and-capturing#stopping-bubbling获取更多信息。
回到您的代码,只需像这样更新您的 Button 的 onClick
:
onClick={e => { e.stopPropagation(); handleRemoveTodo(todo._id)}}
关于reactjs - Ant 设计 : How can I handle Button in Card extra onClick event?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61040013/
我是一名优秀的程序员,十分优秀!