reactjs 如何以编程方式响应焦点输入

mrphzbgm  于 2023-01-25  发布在  React
关注(0)|答案(7)|浏览(172)

我正在尝试实现一个非常简单的用例,即UI特性,其中:
1.有一个标签,里面有一些内容
1.如果单击,文本输入会将其替换为可用标注的内容
1.用户可以编辑内容
1.按Enter键时,输入将隐藏,标注将返回更新的内容
我终于可以得到所有正确的(事实上与MongoBD后端,redux等),唯一的事情,我永远不能做(支付一整天的谷歌搜索和阅读S.O.F类似的职位)是这样的:
当我的文本输入出现时,我无法将焦点转移到它!首先我累了这样:

<div className={((this.state.toggleWordEdit) ? '' : 'hidden')}>
<input id={this.props.word._id} className="form-control"
        ref="updateTheWord" 
        defaultValue={this.state.word}
        onChange={this.handleChange}
        onKeyPress={this.handleSubmit}
        autoFocus={this.state.toggleWordEdit}/></div>
    <div className={((this.state.toggleWordEdit) ? 'hidden' : '')}>
      <h3 onClick={this.updateWord}>
        {this.state.word}</h3>
    </div>

但是autoFocus肯定不起作用(我“猜”是因为表单被呈现了,但是处于隐藏状态,使得autoFocus无用)。
接下来,我尝试在我的this.updateWor,我在谷歌和S.O.F.上找到的许多建议:

this.refs.updateTheWord.focus();

再加上类似的建议都不起作用。我还试图愚弄React只是为了看看是否在所有我可以做些什么!我用真实的的DOM:

const x = document.getElementById(this.props.word._id);
    x.focus();

也不管用。有一件事我甚至无法理解,无法用语言表达,那就是这样一个建议:having ref as a method (I "guess")我甚至没有尝试它,因为我有多个这样的组件,我需要ref来进一步获得每个组件的值,我无法想象如果我的ref没有命名,我如何才能获得的值!
所以,你能不能给予一个想法,帮助我理解,在情况下,我不使用一个窗体(因为我需要一个单一的输入框来取代标签)我怎么可以设置它的焦点时,它的CSS( Bootstrap )类正在失去'隐藏'请?

rkue9o1l

rkue9o1l1#

你使用refs的方式不是最好的方式,或者它不再是最好的实践。尝试一些像这样的事情

class MyClass extends React.Component {
  constructor(props) {
    super(props);
    this.focus = this.focus.bind(this);
  }

  focus() {
    this.textInput.current.focus();
  }

  render() {

    return (
      <div>
        <input
          type="text"
          ref={(input) => { this.textInput = input; }} />
        <input
          type="button"
          value="Set Focus"
          onClick={this.focus}
        />
      </div>
    );
  }
}
    • 更新**

React 16.3起,您可以使用**React.createRef()**API

class MyClass extends React.Component {
  constructor(props) {
    super(props);
    // create a ref to store the textInput DOM element
    this.textInput = React.createRef();
    this.focus = this.focus.bind(this);
  }

  focus() {
    // Explicitly focus the text input using the raw DOM API
    // Note: we're accessing "current" to get the DOM node
    this.textInput.current.focus();
  }

  render() {
    // tell React that we want to associate the <input> ref
    // with the `textInput` that we created in the constructor
    return (
      <div>
        <input
          type="text"
          ref={this.textInput} />
        <input
          type="button"
          value="Set Focus"
          onClick={this.focus}
        />
      </div>
    );
  }
}

React 18.xx以上版本,您可以使用**useRef**挂钩

import React, { useRef } from "react";

export const Form = () => {
  const inputRef = useRef(null);

  const focus = () => {
    inputRef.current.focus();
  };

  return (
    <div>
      <input type="text" ref={inputRef} />
      <input type="button" value="Set Focus" onClick={focus} />
    </div>
  );
};
8dtrkrch

8dtrkrch2#

只需将自动对焦属性添加到input。(* 当然,在JSX中它是autoFocus*)

<input autoFocus ...
46qrfjad

46qrfjad3#

使用焦点挂钩

// General Focus Hook
const useFocus = (initialFocus = false, id = "") => {
    const [focus, setFocus] = useState(initialFocus)
    const setFocusWithTrueDefault = (param) => setFocus(isBoolean(param)? param : true)
    return ([
        setFocusWithTrueDefault, {
            autoFocus: focus,
            key: `${id}${focus}`,
            onFocus: () => setFocus(true),
            onBlur: () => setFocus(false),
        },
    ])
}

const FocusDemo = () => {

    const [labelStr, setLabelStr] = useState("Your initial Value")
    const [setFocus, focusProps] = useFocus(true)

    return (
        <> {/* React.Fragment */}
            <input
                onChange={(e)=> setLabelStr(e.target.value)}
                value={labelStr}
                {...focusProps}
            />
            <h3 onClick={setFocus}>{labelStr}</h3>
        </>
    )
    
}

获取更完整的click here演示。

tpxzln5u

tpxzln5u4#

除了前面的答案之外,我还添加了setTimeout以使其工作

handleClick() {

    if (this.searchInput) {
        setTimeout(() => {

            this.searchInput.focus();

        }, 100);
    }
}

其中,searchInput是输入的jsx ref

<input
      type="text"
      name="searchText"
      ref={(input) => { this.searchInput = input; }}
      placeholder="Search" />

handleClick()是任何元素的onClick处理程序

bihw5rsg

bihw5rsg5#

@BenCarp typescript 中的回答
inputRef传递给input,然后调用setFocus将焦点设置到它。

export const useInputFocus = (): [MutableRefObject<HTMLInputElement | undefined>, () => void] => {
  const inputRef = useRef<HTMLInputElement>();
  const setFocus = (): void => {
    const currentEl = inputRef.current;
    if (currentEl) {
      currentEl.focus();
    }
  };
  return [inputRef, setFocus];
};
33qvvth1

33qvvth16#

每次更新组件时使用componentDidUpdate方法

componentDidUpdate(prevProps, prevState) {
     this.input.focus();
}
wz1wpwve

wz1wpwve7#

您可以使用“useRef”钩子并引用输入控件,然后使用reference.current.focus()

相关问题