我已经在这个问题上工作了几个小时。在这种情况下,我有一个表单,允许用户从选择字段中选择多个类。每次用户选择新类时,都会更新数组。我在控制对象在数组中的位置时遇到了很多麻烦。如果对象发生故障,则用户屏幕上的选择字段会更改,这不是非常用户友好的。
我已经使用下面的代码设法解决了这个问题,但是,它似乎很复杂。我想知道是否有一种“更好”或“更简单/更简洁”的方式来写我所做的事情。我是一个初级,自学成才的编码员。我问这个是因为我想学习。
分类数组
classes = [
{
classId: 'yP9w2urWSz3Y4kbhN',
active: true,
},
{
classId: '3x8cNzzr4DQ4PioM7',
active: false,
},
];
**表单类选择字段**
{this.state.classes.map((myClass) => {
if (myClass.active) {
return (
<div key={myClass.classId} className="mb-3">
<FormGroup>
<Input
type="select"
name="classId"
value={myClass.classId}
onChange={this.handleClassSelect(myClass.classId)}
id="classId"
>
<option>Select class</option>
{myClass.options.map(eachClass => (
<option key={eachClass._id} value={eachClass._id}>{eachClass.name} 1 {eachClass._id}</option>
))}
</Input>
{(myClass && myClass.classError) ? <FormFeedback>{myClass.classError}</FormFeedback> : null}
</FormGroup>
</div>
})})}
更新表单的代码
let newValueObject = {
[name]: value,
active: true,
activeDate: new Date(),
};
const newClasses = [];
// map over the current array. Update where required and push elements into newClasses array
this.state.classes.map((myClass, index) => {
if (myClass.classId === value) {
newClasses.push({
...myClass,
[name]: value,
active: true,
});
newValueObject = {
...myClass,
[name]: value,
active: true,
};
}
if (myClass.classId === classId && isNaN(myClass.classId)) {
newClasses.push({
...myClass,
[name]: classId,
active: false,
});
}
if (myClass.classId !== value && myClass.classId !== classId) {
newClasses.push({
...myClass,
});
}
});
// Check to see if value of select field excists in newClass array
const classIdExist = newClasses.some(myClass => myClass.classId === classId);
const valueExist = newClasses.some(myClass => myClass.classId === value);
// Check the index of value
const valueIndex = newClasses.findIndex(myClass => myClass.classId === value);
// Check the index of classId
const classIdIndex = newClasses.findIndex(myClass => myClass.classId === classId);
// If select value or select classId are found in the array
// make sure array is in the correct order. The order will effect the way they
// appear on the client form.
if (classIdExist && valueExist) {
// fix order of array
if (classIdIndex > valueIndex) {
newClasses.splice(classIdIndex, 0, newValueObject);
newClasses.splice(valueIndex, 1);
}
if (classIdIndex < valueIndex) {
newClasses.splice(valueIndex, 1);
newClasses.splice(classIdIndex, 0, newValueObject);
}
} else if (classIdExist && !valueExist) {
// add new value
newClasses.splice(classIdIndex, 0, newValueObject);
} else if (!classIdExist && valueExist) {
// dont do anything, element in the right place in array
} else {
newClasses.push(newValueObject);
}
console.log('newClasses', newClasses);