当前位置: 首页 > 知识库问答 >
问题:

前端 - react中一次点击事件触发useReducer的dispatch会添加两个重复的内容?

岑驰
2024-01-23

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会有问题

共有1个答案

白学
2024-01-23

从你提供的代码中,我注意到在<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上的)

  • 我接到一个需求就是类似一个创建一个考试试卷,每次点击按钮,添加一个新的组件,这个组件可以是选择题,也可以是是非题,我现在想要实现这个按钮,因为这个生成试卷的功能比较复杂,所以我想要每一步代码都非常精简,优雅,目前看到以下代码可以实现功能,已经算是比较简练的了,但是还是发上来,看看大佬门有没有更好的实现思路,让代码更优雅。