You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

删除第二行后如何将焦点恢复至第一个TextField?

解决删除第二行后焦点回到第一个TextField的问题

我在代码里给第一个TextField加了autoFocus,首次渲染能正常获焦,但按Tab切到第二个Del按钮点击删除第二行后,焦点就丢了。试过用ref但没生效,怎么实现删除后焦点回到第一个TextField?

问题原因

  • autoFocus仅在组件首次挂载时触发,删除第二行时第一个TextField已经存在,不会重新挂载,所以autoFocus不会再次生效。
  • 之前的ref代码只是给TextField绑定了引用,但没有在状态变化后主动调用焦点方法,因此没达到预期效果。

解决方法

使用useEffect监听第二行的状态(b),当b从true变为false(即第二行被删除)时,手动调用第一个TextField的焦点方法。

修改后的代码

import React, { useState, useRef, useEffect } from "react";
import ReactDOM from "react-dom"
import { TextField, Button, Paper } from "@mui/material"

function App() {
  const [a, setA] = useState(true)
  const [b, setB] = useState(true)
  const firstInputRef = useRef(null)

  // 监听b的状态变化,删除第二行时聚焦第一个输入框
  useEffect(() => {
    if (!b && firstInputRef.current) {
      firstInputRef.current.focus()
    }
  }, [b])

  return (
    <Paper>
      {a && <div> 
        <TextField ref={firstInputRef} autoFocus />
        <Button onClick={() => setA(!a)}> Del </Button>
      </div>}
      {b && <div>
        <TextField />
        <Button onClick={() => setB(!b)}> Del </Button>
      </div>}
      <Button onClick={() => { setA(true); setB(true) }}>Reset</Button>
    </Paper>
  );
}

关键说明

  • useEffect的依赖数组设为[b],确保只有当b的值变化时才执行回调逻辑。
  • 当第二行被删除(b变为false)且ref引用存在时,调用focus()方法让第一个输入框重新获取焦点。
  • 如果直接用组件ref不生效,可改用inputRef直接获取底层input元素,替换为<TextField inputRef={firstInputRef} />,后续焦点调用逻辑不变。

内容的提问来源于stack exchange,提问作者GRZa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 04:02:55