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

如何在按enter键时将焦点设置为下一个输入在react js with refs中

谭健柏
2023-03-14

Iam在地图中使用多个输入我想在单击“回车”时将焦点设置为下一个输入。在裁判的帮助下

Iam使用材质ui文本字段获取输入

我在react类组件中尝试了wihtout ref,但在hooks中无效,类组件代码:

constructor(props) {
this.state = {}
}

inputRefs=[];

 _handleKeyPress = e => {
        const {currentTarget} = e;
            let inputindex = this.inputRefs.indexOf(currentTarget)
            if (inputindex < this.inputRefs.length - 1) {
                this.inputRefs[inputindex + 1].focus()
            }
            else {
                this.inputRefs[0].focus()
            }
      };

在“内部渲染”中添加了此“内部贴图”功能

this.state.data.map((data) => return (
<TextField 
     inputProps = {{onKeyPress:(e) => this.function1(e, data)}}
     onChange={this.changevaluefunction} 
     inputRef={ref => this.inputRefs.push(ref)} 
     onFocus={this.handleFocus}  ref={`input${id}`} /> ))

共有2个答案

薛欣德
2023-03-14

我用功能组件以不同的方式实现了解决方案。我已经获取了4个字段,并使用createRefhook设置了它的ref。

我可以从您的解决方案中看到,每当您在当前元素上按Enter键时,您都希望将焦点移动到下一个输入元素。

我在onKeyUp处理程序中传递下一个目标元素参数以及实际事件,然后检测是否按下Enter键。如果Enter键被按下并且Target etElem存在,那么我将焦点移动到传递的Target etElem。通过这种方式,您可以更好地控制输入。

你可以在这里看到我的解决方案

https://codesandbox.io/s/friendly-leftpad-2nx91?file=/src/App.js

import React, { useRef } from "react";
import TextField from "@material-ui/core/TextField";
import "./styles.css";

const inputs = [
  {
    id: "fName",
    label: "First Name"
  },
  {
    id: "lName",
    label: "Last Name"
  },
  {
    id: "gender",
    label: "Gender"
  },
  {
    id: "address",
    label: "Address"
  }
];

export default function App() {
  const myRefs = useRef([]);

  const handleKeyUp = (e, targetElem) => {
    if (e.key === "Enter" && targetElem) {
      targetElem.focus();
    }
  };

  return (
    <div>
      {inputs.map((ipt, i) => (
        <TextField
          onKeyUp={(e) =>
            handleKeyUp(e, myRefs.current[i === inputs.length - 1 ? 0 : i + 1])
          }
          inputRef={(el) => (myRefs.current[i] = el)}
          id={ipt.id}
          fullWidth
          style={{ marginBottom: 20 }}
          label={ipt.label}
          variant="outlined"
          key={ipt.id}
        />
      ))}
    </div>
  );
}

常雪风
2023-03-14

您可以将this.inputRefs转换为React ref,使其在渲染过程中保持不变,除此之外,您几乎可以删除对任何this对象的所有引用。

示例组件:

const LENGTH = 10;
const clamp = (min, max, val) => Math.max(min, Math.min(val, max));

export default function App() {
  const [data] = useState([...Array(LENGTH).keys()]);

  const inputRefs = useRef([]); // <-- ref to hold input refs

  const handleKeyPress = index => () => {                   // <-- enclose in scope
    const nextIndex = clamp(0, data.length - 1, index + 1); // <-- get next index
    inputRefs.current[nextIndex].focus();                   // <-- get ref and focus
  };

  return (
    <div className="App">
      {data.map((data, index) => (
        <div key={index}>
          <TextField
            inputProps={{ onKeyPress: handleKeyPress(index) }}   // <-- pass index
            inputRef={(ref) => (inputRefs.current[index] = ref)} // <-- save input ref
          />
        </div>
      ))}
    </div>
  );
}
 类似资料: