我在Reaction中有一款TODO应用程序.当我在应用程序中点击<h2>项时.它会将其带到编辑模式.但当我try 从<h2>中 Select 文本时,它仍然进入编辑模式.我不希望这种事发生.我如何才能阻止这种情况的发生?我认为window.getSelection()不起作用,因为点击首先被注册,然后发生 Select .因此,当注册点击时,它没有选定的文本.

以下是该问题的必要代码块:

<h2 onClick={() => editTodo(index)}>{t.text}</h2>

function editTodo(index) {
  if(window.getSelection().toString()!=='')
    setList(list.map((x, i) => { if (i !== index) { return x } else { return { ...x, edit: true } } }))
}

如你所见,我试了window.getSelection()次,但不起作用

推荐答案

判断所选内容的type是否为"范围".如果是,请不要更新状态:

document.getSelection().type === 'Range'

工作示例:

const { useState } = React;

const Demo = () => {
  const [edit, setEdit] = useState(false);
  
  function editTodo(index) {
    if (document.getSelection().type === 'Range') return;
    
    setEdit(true)
  }

  return (
    <div>
      <h2 
        onClick={() => editTodo()}
        onSelectStart={e => stopPropogation()}
        >text</h2>
      <div>Edit: {JSON.stringify(edit)}</div>
    </div>
  )
}

ReactDOM
  .createRoot(root)
  .render(<Demo />)
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/18.2.0/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/18.2.0/umd/react-dom.production.min.js"></script>

<div id="root"></div>

此外,您的editTodo函数有点麻烦,您可以让它更简洁一些(请参见代码中的注释):

function editTodo(index) {
  if(document.getSelection().type === 'Range') return; // bail out 

  setList(prevList => // use an updater functio get the previous state
    prevList.map((x, i) => // use an arrow function to avoid the need for explicit return
      i !== index // use a ternary instead of if/else
        ? x
        : { ...x, edit: true }
    )
  )
}

Javascript相关问答推荐

是否有方法在OpenWeatherMap API中获取过go 的降水数据?

在贝塞尔曲线的直线上找不到交叉点:(使用@Pomax的bezier.js)

Cypress -使用commands.js将数据测试id串在一起失败,但在将它们串在一起时不使用命令有效

if/else JavaScript中的条件行为

在nextjs服务器端api调用中传递认证凭证

如何为我的astro页面中的相同组件自动创建不同的内容?

函数返回与输入对象具有相同键的对象

手机上的渲染错误文本必须在文本组件中渲染,但在浏览器上没有问题<><>

还原器未正确更新状态

如何在使用rhandsontable生成表时扩展数字输入验证?

如何将innerHTML字符串修剪为其中的特定元素?

在Matter.js中添加从点A到另一个约束的约束

如何在Svelte中从一个codec函数中调用error()?

在使用REACT更改了CSS类之后,无法更改CSS样式

有没有办法通过使用不同数组中的值进行排序

为什么NULL不能在构造函数的.Prototype中工作

按特定顺序将4个数组组合在一起,按ID分组

通过解构/功能组件接收props-prop验证中缺少错误"

更改管线时不渲染组件的react

如何使用fltter_js将对象作为参数传递给javascrip?