У меня есть 3 текстовых поля MaterialUI, которые отображаются n раз (n - это целое число, введенное пользователем перед визуализацией поля формы, здесь я сохранил его в переменной с именем groupMembersCount). Я использую функциональный компонент в ReactJS, определяя массив с хуками useState как:
const [groupDetails, setGroupDetails] = React.useState([
{ fullName: "", phoneNo: "", gender: "" },
]);
Я получаю его динамически визуализируемым следующим образом:
export default function DynamicGroupMember() {
const [groupMembersCount, setGroupMembersCount] = useState(0);
const [show, setShow] = useState(false);
const [groupDetails, setGroupDetails] = useState([
{fullName: "", phoneNo: "", gender: ""},
]);
function handleChange(event, index) {
console.log(event.target.value, index);
let newArr = [...groupDetails]; // copying the old datas array
let item = newArr[index];
item = {...item, [event.target.name]: event.target.value};
newArr[index] = item;
setGroupDetails(newArr);
}
return (
<div>
Number of Group: <TextField name="groupMembersCount" onChange={(event) => {
setGroupMembersCount(event.target.value)
}}/>
{Array.apply(null, {length: groupMembersCount}).map(
(e, i) => (
<div key={i}>
<strong>Member #{i + 1}</strong>
<div className="getIndex" name={i + 1}>
<TextField
id={`name${i + 1}`}
name="fullName"
variant="outlined"
margin="none"
label="Name"
onChange={(event) => {
handleChange(event, i)
}}
/>
<TextField
id={`phoneNo${i + 1}`}
name="phoneNo"
variant="outlined"
margin="none"
label="Mobile Number"
onChange={(event) => {
handleChange(event, i)
}}
/>
<Select
id={`gender${i + 1}`}
name="gender"
variant="outlined"
margin="none"
label="Gender"
onChange={(event) => {
handleChange(event, i)
}}
>
<option value="MALE">Male</option>
<option value="FEMALE">Female</option>
<option value="OTHER">Other</option>
</Select>
</div>
</div>
)
)}
<Button onClick={() => {
setShow(true)
}}>Show</Button>
{
show ?
groupDetails.map(member =>
<Card>
<CardContent>
<Typography color="textSecondary" gutterBottom>
{member.fullName}
</Typography>
<Typography variant="h5" component="h2">
{member.phoneNo}
</Typography>
<Typography color="textSecondary">
{member.gender}
</Typography>
</CardContent>
</Card>) : null
}
</div>
);
}
Я хочу создать один onChange в динамически отображаемом поле формы (phoneNo) для проверки того, что пользователь вводит, и в этом методе обработчика я добавлю два реквизита «error», чтобы сделать поле номера мобильного телефона красным, и «helperText» для отображения сообщения (например. неправильный номер, если пользователь вводит алфавит в номере). теперь, если я проверяю валидацию числового поля, ошибка и helperText появляются во всех полях ввода номера мобильного телефона (в n раз отображаемых строках). Я хочу, чтобы он указывал c в строке, в которую вводит пользователь.
Надеюсь, я хорошо объяснил формулировку проблемы, если нет, пожалуйста, запросите любую информацию.