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

在触发tab模糊事件后,将焦点放在新渲染的文本输入上

徐学潞
2023-03-14

我有一个带有文本输入的React(15.3.2)组件。

(无论我在哪里说“渲染”,实际上都是渲染或取消隐藏;我已经尝试了两者。)

当输入元素模糊时,我使用文本输入渲染一个新组件。

我想给新的文本输入焦点。

我尝试了componentDidMountcomponentWillUpdate,以及componentdiddupdate;我尝试了命名和函数refs;我试过了。

聚焦本身是工作的,例如,一旦它被渲染,如果我点击初始输入,焦点会转移到新输入(这是一个错误,但与聚焦相比,微不足道)。

第一个输入有一个onBlur,它设置用于告知第二个输入渲染与否的状态。

在模糊处理程序中,我尽可能地停止事件。

当我从第一个元素中进行制表时,我已经“超过”了新渲染的元素,例如,我当前的裸体设计中的浏览器选项卡栏–我猜新元素还没有渲染?

class SecondInput extends Component {
  componentDidUpdate = (prevProps, prevState) => {
    if (!this.props.hidden) this._input.focus()
  }

  render = () => 
    <input type="text" hidden={this.props.hidden} ref={(c) => this._input = c}
}

class NewItem extends Component {
  state = { itemEntered: false }

  itemBlurred = (e) => {
    e.preventDefault()
    e.stopPropagation()
    this.setState({ itemEntered: true })
  }

  render = () =>
    <div>
      Item: <input type="text" onBlur={this.itemBlurred} />
      <SecondInput hidden={!this.state.itemEntered} />
    </div>
}

有什么想法或提示吗?我不得不相信这是显而易见的,因为这种情况肯定一直在发生。

我也对任何其他形式的组件层次结构持开放态度,例如,如果我需要一个容器以某种方式包装所有这些东西,那很好。

反应15.3.2

共有1个答案

拓拔霄
2023-03-14

您看到的问题似乎是,当您按tab键时,页面上没有更多可聚焦的元素,因此焦点转到地址栏。由于某些原因,当焦点位于地址栏上时,只需调用this.\u input.focus()不会像您预期的那样获取焦点。

为了解决这个问题,我添加了一个空div,并根据是否显示第二个输入设置tabIndex属性。

为了让事情更简单,我将输入焦点放在挂载上,而不是使用隐藏属性。这可能在你的情况下工作,也可能不工作,但它似乎更干净,因为如果它是一个受控的输入,它将防止输入在每个键盘上调用焦点。

let Component = React.Component;


class SecondInput extends Component {
  componentDidMount(){
    this.textInput.focus()
  }

  render(){
    return (
      <input type="text" ref={(input) => this.textInput = input} />
    )
  }
}

class NewItem extends Component {
  state = { itemEntered: false }

  itemBlurred = (e) => {
    //e.preventDefault()
    //e.stopPropagation()
    this.setState({ itemEntered: true })
  }

  render = () =>
    <div>
      Item: <input type="text" onBlur={this.itemBlurred} />
      {
        this.state.itemEntered ? [
          <SecondInput/>
        ] : []
       }
       <div tabIndex={this.state.itemEntered ? null :  0}/>
    </div>
}

ReactDOM.render(<NewItem />, document.body);
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.3.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.3.0/react-dom.min.js"></script>
 类似资料:
  • 问题内容: 呈现组件后,将焦点设置在特定文本字段上的反应方式是什么? 文档似乎建议使用引用,例如: 在渲染函数中的输入字段上进行设置,然后调用: 但是我应该在哪里称呼它呢?我已经尝试了几个地方,但无法正常工作。 问题答案: 您应该这样做,而不是。像这样

  • 我正在使用react,希望输入文本显示内存数据存储中的值,然后在值更改时更新存储,从而触发重新渲染。我看到的问题是,我的输入文本在重读时失去了焦点。我已经尝试设置key属性,覆盖shouldComponentUpdate并返回false,以防止react重新为组件命名,但没有效果。不管怎样,后者似乎不是一个好的长期解决方案。 从文档: 请注意,在未来的React中,可能会将ashidCompone

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

  • 问题内容: 我有一些自定义验证代码,其中包括$ formatter。(为了正确起见,我将货币以便士存储,但以磅为便士显示。) 如果用户在输入中键入“ 10”(这是一个有效值),则输入移至下一个字段后,输入仍显示“ 10”。 我希望它显示10.00以保持一致性。 如果模型将值更改为1000,那么格式化程序将使该字段显示为“ 10.00”。 我希望格式化程序在field.blur()上运行(只要输入有

  • 我想在我停止在输入文本框中键入字符(而不是在键入字符时)后触发一个事件。 我尝试过: 但是这个例子为每个输入的字符产生一个超时,如果我输入20个字符,我会收到大约20个AJAX请求。 在这个小提琴上,我用一个简单的警报而不是AJAX来演示同样的问题。 有解决办法吗,还是我只是用了一个糟糕的方法?

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