react中一次点击事件触发useReducer的dispatch会添加两个重复的内容。
以下是回调函数:
const handleCheck = (e, path, ifPublic, tbIndex, chooseTable) => {
e.stopPropagation();// chooseTable为true时:点击会添加、不会取消// 1. 显示逻辑// 复制一份const newData = ifPublic == 1 ? [...publicList] : [...privateList];// 拿到复制体指针let currentLevel = newData;// 迭代找当前path下的最末级for (let i = 0; i < path.length; i++) { if (i !== path.length - 1) { currentLevel = currentLevel[path[i]].children; } else { currentLevel = currentLevel[path[i]]; }}const table = currentLevel.tableList?.at(tbIndex);table.checked = chooseTable ? true : !table.checked;if (ifPublic == 1) { setPublicList(newData);} else if (ifPublic == 0) { setPrivateList(newData);}// 2. 保存逻辑const newList = [...tableList];const index = newList.findIndex((item) => item.tableId == table.tableId);if (chooseTable) { if (index < 0) { newList.push(table); }} else { if (index > -1) { newList.splice(index, 1); } else { newList.push(table); }}dispatch({ type: 'permissionAssignment/updateState', payload: { tableList: newList, selectedTable: chooseTable ? table : selectedTable, },});console.log('dispatch结束');
};
以下是onclick事件:
{item.tableList && expandedItems.includes(item.themeName) && ( <ul> {item.tableList.map((d, tbIndex) => ( <div key={d.tableId} className={CS( styles.dndnodeinput, 'flex items-center cursor-pointer pl-12 text-left justify-between ', { [styles.selected]: d.tableId === selectedTable?.tableId, // 'pr-2': theme == '未分类', }, )} > <Checkbox checked={d.checked} onClick={(e) => { handleCheck(e, [...parent, index], ifPublic, tbIndex); }} /> <div className={'mb-0 w-4/5'} // ellipsis={{ rows: 1, tooltip: true }} onClick={(e) => { handleCheck( e, [...parent, index], ifPublic, tbIndex, true, ); }} > {d.tableName} </div> </div> ))} </ul> )}
Checkbox的功能正常,div会有问题
从你提供的代码中,我注意到在<div>
标签的onClick
事件中,你调用handleCheck
函数并传递了相同的参数,这可能导致重复的dispatch
调用。
为了解决这个问题,你可以尝试将dispatch
的调用移到handleCheck
函数的外部,并确保每次点击时只调用一次dispatch
。
下面是一个修改后的示例代码:
{item.tableList && expandedItems.includes(item.themeName) && ( <ul> {item.tableList.map((d, tbIndex) => ( <div key={d.tableId} className={CS( styles.dndnodeinput, 'flex items-center cursor-pointer pl-12 text-left justify-between ', { [styles.selected]: d.tableId === selectedTable?.tableId, // 'pr-2': theme == '未分类', }, )} > <Checkbox checked={d.checked} onClick={(e) => { handleCheck(e, [...parent, index], ifPublic, tbIndex, false); }} /> <div className={'mb-0 w-4/5'} // ellipsis={{ rows: 1, tooltip: true }} onClick={(e) => { handleCheck(e, [...parent, index], ifPublic, tbIndex, true); }} > {d.tableName} </div> </div> ))} </ul>)}
在这个修改中,我改变了handleCheck
函数的参数,以便区分是点击Checkbox还是div。在Checkbox的onClick
事件中,我传递了false
作为最后一个参数。而在div的onClick
事件中,我传递了true
作为最后一个参数。这样,每次点击时,只有对应的handleCheck
函数会被调用,从而避免重复的dispatch
调用。
我要在按钮的click事件上向html表中添加一行。在那一行中,我有一个包含li元素的单元格。我已经为li元素分配了click事件。当我点击李的事件被解雇了很多次,我不知道为什么...好心的帮助。
我想在点击某个div(“.checker”)后触发点击输入事件。换句话说,点击'.checker'将模拟点击复选框上的点击事件,远程检查它。 我写的代码可以工作,但click只有在第二次单击后才触发,第一次单击失败时才触发。这种情况甚至不会发生在'.checker'上,也会发生在checkbox上。 下面的所有HTML都包装在jquery折叠菜单中。单击“H3”后,“.sub-tree-wrap”
我想删除李每当用户点击删除按钮。所以我传递了索引,但它在我点击它之前被触发了,我想我传递值是错误的。 http://jsfiddle.net/axhpuepq
我接到一个需求就是类似一个创建一个考试试卷,每次点击按钮,添加一个新的组件,这个组件可以是选择题,也可以是是非题,我现在想要实现这个按钮,因为这个生成试卷的功能比较复杂,所以我想要每一步代码都非常精简,优雅,目前看到以下代码可以实现功能,已经算是比较简练的了,但是还是发上来,看看大佬门有没有更好的实现思路,让代码更优雅。
问题内容: 我有以下代码,但我的问题是该事件被触发了两次。我不知道是什么原因造成的。我怀疑是由供应商前缀引起的,但并非如此。即使我只离开,它仍然会开火两次。 CSS JS 问题答案: 对于您和,每个已转换的属性都会触发。 您可以在访问与事件关联的属性。 没有“ transition s end”事件,因此您可能需要一些技巧,例如仅过滤其中一个过渡属性的回调处理。例如: ps。没有浏览器会触发该事件
本文向大家介绍解释下点击一个input输入框,依次会触发哪些事件?相关面试题,主要包含被问及解释下点击一个input输入框,依次会触发哪些事件?时的应答技巧和注意事项,需要的朋友参考一下 移入-按下-获取焦点-弹起; onmouseenter→onmousedown→onfocus→onmouseup;