【发布时间】:2022-08-06 21:05:05
【问题描述】:
我有这个数据,每次用户想要添加更多颜色时,它都会在color 字段中添加颜色。像这样的东西:color: [\"blue\",\"green\",\"yellow\"]或array。截至目前,如果我要添加更多颜色,它只会覆盖第一种颜色。
如何在不覆盖先前值的情况下更新字段 color?
index.js
import React from \"react\";
import { useForm } from \"react-hook-form\";
import FieldArray from \"./fieldArray\";
import ReactDOM from \"react-dom\";
import \"./styles.css\";
import { Button } from \"@mui/material\";
const defaultValues = {
test: [
{
product: \"\",
nestedArray: [{ size: \"\", color: \"\", design: \"\" }]
}
]
};
function App() {
const {
control,
register,
handleSubmit,
getValues,
errors,
reset,
setValue
} = useForm({
defaultValues
});
const onSubmit = (data) => console.log(\"data\", data);
return (
<form onSubmit={handleSubmit(onSubmit)}>
<h1>Array of Array Fields</h1>
<p>
The following example demonstrate the ability of building nested array
fields.
</p>
<FieldArray
{...{ control, register, defaultValues, getValues, setValue, errors }}
/>
<button type=\"button\" onClick={() => reset(defaultValues)}>
Reset
</button>
<Button type=\"submit\">Submit</Button>
{/* <input type=\"submit\" /> */}
</form>
);
}
const rootElement = document.getElementById(\"root\");
ReactDOM.render(<App />, rootElement);
fieldArray.js
import React from \"react\";
import { useFieldArray } from \"react-hook-form\";
import NestedArray from \"./nestedFieldArray\";
import { InputLabel } from \"@mui/material\";
import Size from \"./Drop_drowns/Size\";
let renderCount = 0;
export default function Fields({ control, register, setValue, getValues }) {
const { fields, append, remove, prepends } = useFieldArray({
control,
name: \"test\"
});
renderCount++;
const productItems = [
{ label: \"Shirt1\", value: \"Shirt1\" },
{ label: \"Shirt2\", value: \"Shirt2\" },
{ label: \"Shirt3\", value: \"Shirt3\" },
{ label: \"Shirt4\", value: \"Shirt4\" }
];
const menuItems = [
{ label: \"S\", value: \"S\" },
{ label: \"M\", value: \"M\" },
{ label: \"L\", value: \"L\" }
];
return (
<>
<ul>
{fields.map((item, index) => {
return (
<li key={item.id}>
<label>Item {index + 1}</label>
<InputLabel id=\"demo-simple-select-label\">Product</InputLabel>
<Size
name={`test[${index}].product`}
menuItems={productItems}
refer={register({ required: true })}
defaultValue={item.product}
control={control}
/>
<InputLabel id=\"demo-simple-select-label\">Size</InputLabel>
<Size
name={`test[${index}].size`}
menuItems={menuItems}
refer={register({ required: true })}
defaultValue={item.size}
control={control}
/>
<InputLabel id=\"demo-simple-select-label\">color</InputLabel>
<Size
name={`test[${index}].color`}
menuItems={menuItems}
refer={register({ required: true })}
defaultValue={item.color}
control={control}
/>
<button type=\"button\" onClick={() => remove(index)}>
Delete
</button>
<NestedArray nestIndex={index} {...{ control, register }} />
</li>
);
})}
</ul>
<section>
<button
type=\"button\"
onClick={() => {
append({ name: \"append\" });
}}
>
Add product
</button>
</section>
<span className=\"counter\">Render Count: {renderCount}</span>
</>
);
}
嵌套字段数组
import React from \"react\";
import { useFieldArray } from \"react-hook-form\";
import Size from \"./Drop_drowns/Size\";
import { InputLabel } from \"@mui/material\";
//only changed here the name nestedArray to variations
export default ({ nestIndex, control, register }) => {
const { fields, remove, append } = useFieldArray({
control,
name: `test[${nestIndex}].variantion`
});
const menuItems = [
{ label: \"S\", value: \"S\" },
{ label: \"M\", value: \"M\" },
{ label: \"L\", value: \"L\" }
];
const colorItems = [
{ label: \"red\", value: \"red\" },
{ label: \"green\", value: \"green\" },
{ label: \"blue\", value: \"blue\" }
];
return (
<div>
{fields.map((item, k) => {
return (
<div key={item.id} style={{ marginLeft: 20 }}>
{/* <Size
name={`test[${nestIndex}].variantion[${k}].size`}
menuItems={menuItems}
refer={register({ required: true })}
defaultValue={item.size}
control={control}
/> */}
<InputLabel id=\"demo-simple-select-label\">Color</InputLabel>
<Size
name={`test[${nestIndex}].color`}
menuItems={colorItems}
refer={register({ required: true })}
defaultValue={item.color}
control={control}
/>
{/* <input
name={`test[${nestIndex}].variantion[${k}].color`}
ref={register({ required: true })}
defaultValue={item.field}
style={{ marginRight: \"25px\" }}
/> */}
<button type=\"button\" onClick={() => remove(k)}>
Delete Colors
</button>
</div>
);
})}
<button
type=\"button\"
onClick={() =>
append({
field1: \"field1\",
field2: \"field2\"
})
}
>
Add Colors
</button>
<hr />
</div>
);
};
-
对于每个衬衫尺码,您可以选择多种颜色吗?那么多种颜色是否意味着多种衬衫?或者 1 件衬衫/尺码有多种颜色?
标签: javascript reactjs react-hook-form