【问题标题】:React how to focus div when contentEditable is set to true?当 contentEditable 设置为 true 时反应如何聚焦 div?
【发布时间】:2021-11-24 09:12:48
【问题描述】:

我有一些类似以下的反应代码(最小的可重现示例):

import React, { useState } from 'react';

const Todo = ({todo}) => {
    const [isUpdating, setisUpdating] = useState(false)

    const updateItemHandler = (e) => {
        setisUpdating(true);
    }

    return(
        <div onClick={updateItemHandler} className={fa ${isUpdating ? "fa-check" : "fa-pencil"}`}></div>
        <div id={todo.id}>
            <div suppressContentEditableWarning={true}
             contentEditable = {isUpdating}>{todo.value}
            </div>
        </div>
    )
}

export default Todo;

当我单击 div 时,它确实将 contentEditable 更改为 true,但我还想同时关注新可编辑的 div。我尝试像这样修改我的 updateItemHandler 函数:

    const updateItemHandler = (e) => {
        setisUpdating(true);
        e.focus();
    }

但是 React 抛出了一个错误/说这里的焦点不是一个函数。

当我将 contentEditable 更改为 true 时,有什么方法可以自动聚焦 div?

谢谢

【问题讨论】:

  • 你没有提供 updateItemHandler 回调的使用位置,但无论如何,它应该是 e.target.focus() 而不是 e.focus()
  • 抱歉刚刚更新了代码以提供它,谢谢 - 我认为 e.target.focus() 不会在这里工作,因为那时 React 将尝试关注您单击的图标而不是文本框

标签: javascript reactjs react-hooks contenteditable setfocus


【解决方案1】:

你可以试试这样的

import React, { useState, useRef } from 'react';

const Todo = ({todo}) => {
    const ref = useRef(null)
    const [isUpdating, setisUpdating] = useState(false)

    const updateItemHandler = (e) => {
        setisUpdating(true);
        ref.current.focus()
    }

    return(
        <div className="row text-center" id={todo.id}>
            <div suppressContentEditableWarning={true}
             contentEditable = {isUpdating} ref={ref}>{todo.value}
            </div>
        </div>
    )
}

export default Todo;

使用 ref(参考)可能会对您有所帮助

【讨论】:

  • hm 这似乎应该可以完美运行,因为当我打印出 ref.current.focus 时,我得到了实际的 HTML 元素,但由于某种原因, .focus() 调用实际上并没有聚焦它(即将光标放在新的可编辑文本字段上)。
  • 更新发现了,这是由于设置超时可以克服的奇怪行为:stackoverflow.com/a/37162116/11634814
猜你喜欢
  • 2022-11-14
  • 1970-01-01
  • 1970-01-01
  • 2012-09-28
  • 1970-01-01
  • 1970-01-01
  • 2011-01-24
  • 2020-11-17
  • 2017-11-05
相关资源
最近更新 更多