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”
echarts-gl map3d渲染中国地图,绑定zrender点击事件,在点击地图元素的时候,为什么zrender事件会触发两次?第一次的event.target的值是undefined,第二次event.target才有值 代码
我想删除李每当用户点击删除按钮。所以我传递了索引,但它在我点击它之前被触发了,我想我传递值是错误的。 http://jsfiddle.net/axhpuepq
在ElementPlus UI 中el-popover中内容循环出来的点击事件需要点击第二次才能触发? 代码如下 for循环出来的li点击需要第二次才触发 不是循环的点击一次就行 补充(点击事件放在li上也不行,所以我才委托到UL上的)
我接到一个需求就是类似一个创建一个考试试卷,每次点击按钮,添加一个新的组件,这个组件可以是选择题,也可以是是非题,我现在想要实现这个按钮,因为这个生成试卷的功能比较复杂,所以我想要每一步代码都非常精简,优雅,目前看到以下代码可以实现功能,已经算是比较简练的了,但是还是发上来,看看大佬门有没有更好的实现思路,让代码更优雅。