当前位置: 首页 > 知识库问答 >
问题:

使用条件渲染对输入[type=“number”]进行反应设置焦点

逄皓轩
2023-03-14

在阅读了React设置焦点和带有超时的React焦点后,我仍然有点困惑,在输入上设置焦点的正确跨浏览器选项是什么。

我有一个问题与条件渲染输入可能有焦点后渲染在,其中输入放置在td

1)解决方案与组件didUpdate:

//...
componentDidUpdate() {
  this.input && this.input.focus();
}

render() {
  const show = this.state.isShown;

  return (
    <td className="editable">
      {!show ? (
        <input
          type="number"
          ref={(input) => { this.input = input }}
          value={this.state.value}
          onBlur={this.save}
          onKeyPress={e =>
            e.which === 13 || e.keyCode === 13 ? this.save() : null}
      />
    ) : (
        <span onClick={this.onTdClick}>{this.props.name}</span>
      )}
    </td>
  );
}

此解决方案适用于Chrome、IE11、Edge,但不适用于最新的Firefox(单击span后,输入事件不会出现)。

2)解决方案与请求动画帧:

//...
componentDidUpdate() {
  if (!this.state.isShown) {
    requestAnimationFrame(() => {
      this.input && this.input.focus();
    })
  }
}

render() {
  // same above
}

该解决方案适用于Chrome、IE11、Edge,但当试图设置焦点时,Firefox仍然不显示输入。

3) 设置超时的解决方案(回调,n):

  //...
  componentDidUpdate() {
    if (!this.state.isShown) {
      setTimeout(() => {
        this.input && this.input.focus()
      }, 50);
    }
  }

  render() {
   // same above
  }

本案例适用于Chrome、IE11、Edge和(最后)Firefox,但似乎这是最“丑陋”的案例。

另外,autoFocusattr不适用于这种情况,这里我有条件渲染,所以需要在单击后设置焦点

所以,我的问题是:我们有没有正确的方法来解决Firefox的w/o设置setTimeout

现场测试示例:codepen


共有1个答案

司寇书
2023-03-14
import React from 'react';

const MyInput = React.createClass({

    componentDidMount(){
        this.elem.focus();
    },

    render(){
        return(
            <input
                ref={(elem) => {this.elem = elem}}
                type="text"
            />
        );
    }
});
export default MyInput;

渲染<代码>

 类似资料:
  • 我有一个组件,它获取作为道具的项目集合,并将它们映射到作为父组件的子组件呈现的组件集合。我们使用存储在WebSQL中的图像作为字节数组。在函数中,我从项中获取图像ID,并对进行异步调用,以获取图像的字节数组。我的问题是,我不能在React中传播这个promise,因为它不是为了处理渲染中的promise而设计的(至少我可以告诉你)。我来自一个背景,所以我想我正在寻找类似于关键字的东西来重新同步分支

  • 我正在编写文本输入,并在事件中调用,因此React重新呈现我的UI。问题是文本输入总是失去焦点,所以我需要为每个字母重新聚焦:D。

  • 问题内容: 我已经实现了一个Modal组件,该组件在屏幕上显示一个模态对话框。通常,模态将有条件地显示。我可以通过两种方法在render函数中执行此操作: 在Modal组件中,我使用this.props.show为其自身添加了一个不同的类。如果为假,它将添加display:none以隐藏模式。 另一种方式是这样的: 这用于确定是否在渲染中添加Modal。 我想找出的是: 这两种方式有何不同? 其中

  • 问题内容: 呈现组件后,将焦点设置在特定文本字段上的反应是什么? 文档似乎建议使用引用,例如: 在渲染函数中的输入字段上进行设置,然后调用: 但是我应该在哪里称呼它?我已经尝试了几个地方,但无法正常工作。 问题答案: 您应该这样做,而不是。像这样

  • 我无法理解为什么我的AppReact组件呈现两次,如下面的gif所示。 我插入了一个控制台。在返回组件之前记录日志,查看组件渲染的次数。 每当我移除useState钩子时,我的应用程序只会呈现一次我认为应该呈现的效果。任何关于为什么会发生这种情况的指导都是受欢迎的

  • CodeSandBox:https://codesandbox.io/embed/react-table-editable-content-ggvcy 当试图处理React表中的输入时,我的输入失去焦点,因此一次只能键入1个字符。 如何修复我的渲染周期,以允许输入? 编辑:我不小心用工作版本的代码更新了沙盒,尽管它还有另一个bug:如何在刷新更新期间捕获由于焦点模糊更改而导致的react事件?