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}`} /> ))
我用功能组件以不同的方式实现了解决方案。我已经获取了4个字段,并使用createRef
hook设置了它的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>
);
}
您可以将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>
);
}
我遇到了一个奇怪的错误,我的搜索输入组件,它失去了对每个按键的关注,不知道为什么。 我还得到了一个
我有一个windows窗体,我需要当用户按Enter时将焦点设置为下一个控件。任何想法如何实现这一点(不使用关键新闻事件)
问题内容: 我想在用户按下键盘上的Enter键时传递值。在事件中,我得到的价值,但在如何获得这个值是按键? 码: 问题答案: 使用事件,并在其中检查用户按下的键的键码。密钥的密钥代码为13,检查代码并在其中放置逻辑。 检查以下示例: 注意: 用Material-Ui 替换元素,并定义其他属性。
null 任何帮助都将不胜感激。
问题内容: 呈现组件后,将焦点设置在特定文本字段上的反应是什么? 文档似乎建议使用引用,例如: 在渲染函数中的输入字段上进行设置,然后调用: 但是我应该在哪里称呼它?我已经尝试了几个地方,但无法正常工作。 问题答案: 您应该这样做,而不是。像这样