React - 关注 DOM 中的“输入”元素(呈现为列表元素)在按键后消失

纳斯卡萨扬

我希望在按键后保持对“输入”元素的关注

编码:

import React, { Component } from 'react'

class App extends Component {
  render() {
    return (
      <NewContactBox/>
    )
  }
}
class NewContactBox extends Component {
  constructor(props) {
    super(props)
    this.state = {
      name: '',
      email: '',
      phone: '',
    }
    this.fieldRefs = {
      name: React.createRef(),
      email: React.createRef(),
      phone: React.createRef(),
    }
  }
  hc = (ev, type, ref) => {
    this.setState({
      [type]: ev.target.value
    })
    // console.log(ref)
    ref.focus()
  }
  render() {
    const ContactInput = ({fields}) => (
      fields.map((f) => (
        <input
          key={f.id}
          className={`p-1 my-3 w-100 mr-3 ${f.id}`}
          size="16px"
          placeholder={f.placeholder}
          value={this.state[f.id]}
          ref={this.fieldRefs[f.id]}
          onChange={(e) => this.hc(e, f.id, this.fieldRefs[f.id].current)}
        />
      ))
    )
    return (
      <ContactInput
        fields={[
          { placeholder: "Name", id: 'name' },
          { placeholder: "Phone number", id: 'phone' },
          { placeholder: "Email", id: 'email' },
        ]}
      />
    )
  }
}

export default App

我试过了

  1. Change01 - 以另一种方式在 Input 标签中声明 refs

  2. Change02 - 没有将 ref 显式传递给 onChange,然后直接从 this.fieldrefs

constructor(props) {
  this.fieldRefs = {} // Change01
}
hc = (ev, type) => { //Change02
  this.setState({
    [type]: ev.target.value
  })
  // console.log(this.fieldRefs[type].current)
  this.fieldRefs[type].current.focus()
}
...
      <input
        ...
        ref={(el) => this.fieldRefs[f.id] = el} //Change01
        onChange={(e) => this.hc(e, f.id)} //Change02
      />

但这无济于事,每次按键后,body 元素都变成了活动元素。

邪恶的

也许你需要将你的ContactInput声明移到你的之外render(),否则每次重新渲染时你都会重新创建一个新组件。例如,

  render() {
    return (
      <this.ContactInput
        fields={[
          { placeholder: "Name", id: 'name' },
          { placeholder: "Phone number", id: 'phone' },
          { placeholder: "Email", id: 'email' },
        ]}
      />
    )
  }

  ContactInput = ({fields}) => (
    // If react complains about returning multiple component, add this React.Fragment short syntax
    <React.Fragment>
      {fields.map((f) => (
        <input
          key={f.id}
          className={`p-1 my-3 w-100 mr-3 ${f.id}`}
          size="16px"
          placeholder={f.placeholder}
          value={this.state[f.id]}
          ref={this.fieldRefs[f.id]}
          onChange={(e) => this.hc(e, f.id, this.fieldRefs[f.id].current)}
        />
      ))}
    <React.Fragment/> 
  )

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何关注导入的React组件中的元素?

来自分类Dev

如何关注导入的React组件中的元素?

来自分类Dev

嵌套的React <input>元素失去了对输入的关注

来自分类Dev

React:添加后如何设置对最后输入的关注?

来自分类Dev

自动关注最新的输入元素

来自分类Dev

如何关注“锚”元素?

来自分类Dev

无限关注元素

来自分类Dev

检查是否关注元素

来自分类Dev

重点关注Aurelia中的元素

来自分类Dev

反应-输入失去对按键的关注

来自分类Dev

TextInput / Input元素失去对按键的关注

来自分类Dev

如何在React中定位DOM元素列表

来自分类Dev

失去对输入的关注

来自分类Dev

将 ref 传递给组件道具,然后使用 React.createElement 在 div 单击时关注输入元素

来自分类Dev

在CakePHP中关注系统

来自分类Dev

RoutedUICommands和当前关注的元素

来自分类Dev

关注多个元素及其属性

来自分类Dev

双击后无法摆脱对元素的关注

来自分类Dev

双击后无法摆脱对元素的关注

来自分类Dev

Javascript - 关闭 Modal 后关注元素

来自分类Dev

在jQuery中输入并关注事件?

来自分类Dev

如何重新呈现已在React组件中删除的子DOM元素?

来自分类Dev

输入组件:React 无法识别 DOM 元素上的道具

来自分类Dev

关注表单中的所有元素

来自分类Dev

React-组件更新后如何获取真实的DOM元素

来自分类Dev

React + Backbone,目标容器不是DOM元素

来自分类Dev

从React子元素获取DOM节点

来自分类Dev

React:是否可以访问DOM元素的props?

来自分类Dev

React:是否可以访问DOM元素的props?