【问题标题】:ReactJS and autofocusReactJS 和自动对焦
【发布时间】:2019-11-15 16:23:53
【问题描述】:

我有一个带有<input>react-bootstrap 模态。我想在<input>上设置自动对焦属性

以下工作正常,但在控制台中显示警告

<input type="text" autofocus='true' />
Warning: Invalid DOM property `autofocus`. Did you mean `autoFocus`?

以下选项不起作用,因为它们在打开模式时不会聚焦输入:

<input type="text" autoFocus='true' />
<input type="text" autoFocus={true} />
<input type="text" autoFocus />

设置自动对焦的推荐方法是什么。或者我应该如何将运行良好的示例的警告静音?

注意:这是反应 16.8.6

【问题讨论】:

标签: javascript reactjs bootstrap-modal react-bootstrap autofocus


【解决方案1】:

如果您正在使用 React Hooks,请将 useCallback() 添加到您的组件,并将 ref={callback} 添加到表单控件:

import React, { useCallback } from 'react'

function InputComponent() {
    const autoFocus = useCallback(el => el ? el.focus() : null, [])

    return <input type="text" ref={autoFocus} />
}

export default InputComponent

您也可以将 &lt;input&gt; 替换为 React Bootstrap FormControl

【讨论】:

  • 很棒的解决方案。
  • 这里为什么使用useCallback 而不是useRefuseCallback 不是为了保持回调的身份以避免不必要的重新渲染吗?我的理解是这里的用例需要useRef + useEffect
【解决方案2】:

Refs是你想要的,

constructor(props) {
    super(props);
    this.myRef = React.createRef();
}

componentDidMount(){
  this.myRef.current.focus();
}

<input type="text"  ref={this.myRef} />

【讨论】:

  • 我希望有更多的 HTML 方式。但是,当您第二次打开模式时,我声称“有效”的变体实际上并不有效。
  • componentDidMount 仅在安装阶段工作,当您重新打开模式时,您的组件不会通过componentDidMount 功能,您将不会在这里获得焦点。为此,您需要一些其他生命周期方法,例如 componentDidUpdate
  • 如果您有ref={this.setMyRef},您仍然可以使用autoFocussetMyRef 处理程序是将隐式传递的输入引用设置为绑定到输入 html 元素的参数的函数。对于这些情况,为输入元素创建一个包装器组件是有意义的。
  • 是的,您可以这样做。请参阅我在回答中提供的链接中的Callback Refs 部分。
【解决方案3】:

如果你使用 react 钩子,你可以编写自己的简单自动对焦钩子:

import { useEffect, useState } from "react";

export const useAutoFocus = (inputId: string) => {
    const [initialized, setInitialized] = useState(false);
    useEffect(() => {
        if(!initialized) {
            document.getElementById("email").focus();
            setInitialized(true);
        }
    });
};

以及简单的使用例如

useAutoFocus("email")

在你的表格中。

【讨论】:

  • 如果inputId改变了怎么办?您可能希望使用带有 useEffect 的依赖数组,而不是依赖 useState。
  • 这仅用于初始焦点,因为最新的反应会引发 html 属性 autofocus 的错误,即使它在物理上有效。随意调整您的需求!
猜你喜欢
  • 1970-01-01
  • 2018-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多