Я использую перехватчики React для своего приложения React 16.13.0. Я пытаюсь написать общую c функцию для обновления атрибута сложного объекта в моем состоянии.
const [coop, setCoop] = React.useState(props.coop);
Моя форма содержит элементы, подобные приведенным ниже
<Input
inputType={"text"}
title={"Name"}
name={"name"}
value={coop.name}
placeholder={"Enter cooperative name"}
handleChange={handleInput}
errors={errors}
/>
...
<Input
inputType={"text"}
title={"Street"}
name={"coop.addresses[0].formatted"}
value={coop.addresses[0].formatted}
placeholder={"Enter address street"}
handleChange={handleInput}
errors={errors}
/>
I ' Я пытался написать следующие функции, но я не знаю, как сослаться на общий атрибут c моего состояния «coop» в моей функции.
const handleInput = (e) => {
let self = this;
let value = e.target.value;
let name = e.target.name;
if (name.indexOf("[") === -1) {
console.log("updating " + name + " with value:" + value);
setValue(coop, name, value);
} else {
const keys = name.split(/[\[\].]+/);
setCoop(updateValue(coop, keys, value));
}
};
const updateValue = (obj, name, value, index = 0) => {
if (name.length - 1 > index) {
const isArray = Array.isArray(obj[name[index]]);
obj[name[index]] = this.updateValue(
isArray ? [...obj[name[index]]] : { ...obj[name[index]] },
name,
value,
index + 1
);
} else {
obj = { ...obj, [name[index]]: value };
}
return obj;
};
...
const setValue = (obj, is, value) => {
console.log("setting " + is + " of value: " + value);
if (typeof is == "string") return setValue(obj, is.split("."), value);
else if (is.length === 1 && value !== undefined) {
return setCoop({ coop: obj[is[0]] = value });
} else if (is.length === 0) return obj;
else return setValue(obj[is[0]], is.slice(1), value);
};
Проблемы с этой строкой
setCoop({ coop: obj[is[0]] = value });
Как мне сослаться на общий c атрибут «coop» и его значение?