[英]Test field looses focus after I input a character
I have a list of input fields with reorder-able functionality, but the issues is the textfield looses focus on every onChange hit.我有一个具有可重新排序功能的输入字段列表,但问题是文本字段失去了对每个 onChange 命中的关注。 I am using react-draggable-list package.
我正在使用react-draggable-list package。
I looked into related questions and tried giving keys to all the component but it still doesn't work.我查看了相关问题并尝试为所有组件提供密钥,但它仍然不起作用。
Find my code base here .在这里找到我的代码库。
Below is the Multi-Input field for my form.下面是我的表单的多输入字段。
import { Box, Button, IconButton, TextField } from "@material-ui/core";
import CloseIcon from "@material-ui/icons/Close";
import DragIcon from "@material-ui/icons/OpenWith";
import ReorderableList from "./ReorderableList";
import { uniqueId } from "lodash";
import React, { FC, useState } from "react";
export interface ReorderableTierFieldProps {}
const ReorderableTierField: FC<ReorderableTierFieldProps> = (props) => {
const [values, setValues] = useState<{ name: string; id: string }[]>([
{ name: "Input", id: uniqueId() }
]);
const handleRemove = (itemIndex: number) => {
let items = [...values];
items.splice(itemIndex, 1);
setValues([...items]);
};
const renderAssetItem = (
item: any,
dragHandleProps: any = {},
dragged?: boolean
) => {
return (
<Box display="flex" mb={2}>
<TextField
key={`text`}
value={values[item.itemIndex].name || ""}
onChange={(v) => {
let items = [...values];
items[item.itemIndex].name = v.target.value;
setValues([...items]);
}}
/>
<IconButton size="small" onClick={() => handleRemove(item.itemIndex)}>
<CloseIcon />
</IconButton>
<div id="drag" className="drag" {...dragHandleProps}>
<DragIcon />
</div>
</Box>
);
};
const onReorder = (newList: any[]) => {
setValues([...newList]);
};
const onAdd = () => {
setValues((v) => [...v, { id: uniqueId(), name: "" }]);
//formikProps.setFieldValue('partnerTiers', [...values, { id: uniqueId() }])
};
return (
<Box width={"100%"} key="gamma">
<ReorderableList<{ id: string; name: string }>
key="beta"
list={values.map((ite, index) => ({ ...ite, itemIndex: index }))}
handleUpdateListOrder={onReorder}
renderItem={renderAssetItem}
/>
<Button size="small" onClick={onAdd}>
{"Add tier"}
</Button>
</Box>
);
};
export default ReorderableTierField;
Below is Reorderable List component.下面是可重新排序的列表组件。
import React, { Component } from "react";
import DraggableList, { TemplateProps } from "react-draggable-list";
import { Box } from "@material-ui/core";
interface IProps<T = any> {
list: T[];
handleUpdateListOrder: (
nexList: T[],
movedItem: T,
oldIndex: number,
newIndex: number
) => void;
renderItem: (
item: T,
dragHandleProps: any,
dragged: boolean
) => React.ReactElement;
}
function ReorderableList<T extends any>(props: IProps<T & { id: string }>) {
const { list } = props;
class MyRender extends Component<TemplateProps<T & { id: string }, unknown>> {
render() {
let { item, itemSelected, dragHandleProps } = this.props;
const dragged = itemSelected !== 0;
return props.renderItem(item, dragHandleProps, dragged);
}
}
return (
<Box key="list_container">
<DraggableList
key="display"
list={list || []}
itemKey={(ite) => ite.id}
template={MyRender as any}
onMoveEnd={(nexList, movedItem, oldIndex, newIndex) =>
props.handleUpdateListOrder(
[...nexList],
movedItem,
oldIndex,
newIndex
)
}
/>
</Box>
);
}
export default ReorderableList;
add autoFocus property to TextField将 autoFocus 属性添加到 TextField
<TextField
id={item.itemIndex}
autoFocus={currentItem === item.itemIndex}
value={values[item.itemIndex].name || ""}
onChange={(v) => {
let items = [...values];
items[item.itemIndex].name = v.target.value;
setCurrentItem(item.itemIndex);
setValues([...items]);
}}
/>
I did modification to your code please check here我对您的代码进行了修改,请在此处查看
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.