如何使用 Material UI 自动完成和反应挂钩为多个输入字段填充值
How to populate values for multiple input field using Material UI Autocomplete and react hooks
Q1。我使用了 Autocomplete materialui 库,其中我创建了输入字段字段,该字段正在消耗一个对象,但在安慰值时我有未定义的值。
Q2。如果我为 Item Name 字段选择值,我如何为多个输入字段获取填充值,而其余输入字段,即 mrp、sellprice 等将从使用 Item Name 字段值的对象填充。(附图片)
Form img
const initialFValues = {
id: 0,
itemName: "",
mrp: "",
buyPrice: "",
sellPrice: "",
qty: "",
manufactureId: "",
manufactureDate: new Date(),
expiryDate: new Date(),
};
export default function ItemForm(props) {
const { addOrEdit, recordForEdit, invoiceId } = props;
const validate = (fieldValues = values) => {
let temp = { ...errors };
if ("itemName" in fieldValues)
temp.itemName = fieldValues.itemName ? "" : "This field is required.";
if ("mrp" in fieldValues)
temp.mrp = fieldValues.mrp.length > 1 ? "" : "Price is invalid.";
if ("buyPrice" in fieldValues)
temp.buyPrice =
fieldValues.buyPrice.length > 1 ? "" : "Price is invalid.";
if ("sellPrice" in fieldValues)
temp.sellPrice =
fieldValues.sellPrice.length > 1 ? "" : "Price is invalid.";
if ("qty" in fieldValues)
temp.qty = fieldValues.qty.length > 0 ? "" : "Qty is invalid.";
if ("manufactureId" in fieldValues)
temp.manufactureId =
fieldValues.manufactureId.length !== 0 ? "" : "This field is required.";
setErrors({
...temp,
});
if (fieldValues === values)
return Object.values(temp).every((x) => x === "");
};
const {
values,
setValues,
errors,
setErrors,
handleInputChange,
resetForm,
} = useForm(initialFValues, true, validate);
const handleSubmit = (e) => {
// console.log("InvoiceId: " + invoiceId);
e.preventDefault();
if (validate()) {
values.invoiceId = invoiceId;
addOrEdit(values, resetForm);
}
};
useEffect(() => {
if (recordForEdit != null)
setValues({
...recordForEdit,
});
values.itemName=itemName.name
}, [recordForEdit, setValues]);
// consuming from useform
const handleInputChange = e => {
const { name, value } = e.target
setValues({
...values,
[name]: value
})
console.log(values.itemName) // -> this value is undefined
if (validateOnChange)
validate({ [name]: value })
}
return (
<Form onSubmit={handleSubmit}>
<Grid container>
<Grid item xs={6}>
<Autocomplete
id="itemName"
name="itemName"
error={errors.itemName}
[enter image description here][1]value={values.itemName=itemName.name} -> this value is undefined
onChange={handleInputChange}
options={itemName}
getOptionLabel={(option) => option.name}
style={{ width: 300 }}
renderInput={(params) => (
<TextField {...params} label="Item Name" variant="outlined" />
)}
/>
{/* <Controls.Input
name="itemName"
label="Item Name"
value={values.itemName}
onChange={handleInputChange}
error={errors.itemName}
/> */}
<Controls.Input
name="mrp"
label="MRP"
value={values.mrp}
onChange={handleInputChange}
error={errors.mrp}
/>
<Controls.Input
name="buyPrice"
label="Buy Price"
value={values.buyPrice}
onChange={handleInputChange}
error={errors.buyPrice}
/>
<Controls.Input
name="sellPrice"
label="Sell Price"
value={values.sellPrice}
onChange={handleInputChange}
error={errors.sellPrice}
/>
<Controls.Input
name="qty"
label="Quantity"
value={values.qty}
onChange={handleInputChange}
error={errors.qty}
/>
</Grid>
<Grid item xs={6}>
<Controls.SelectCustom
name="manufactureId"
label="Manufacture Name"
value={values.manufactureId}
onChange={handleInputChange}
options={itemService.getItemCollection()}
error={errors.manufactureId}
/>
<Controls.DatePicker
name="manufactureDate"
label="Date of Manufacture"
autoOk={false}
value={values.manufactureDate}
onChange={handleInputChange}
/>
<Controls.DatePicker
name="expiryDate"
label="Date of Expiry"
value={values.expiryDate}
onChange={handleInputChange}
/>
<div>
<Controls.Button type="submit" text="Submit" />
<Controls.Button text="Reset" color="default" onClick={resetForm} />
</div>
</Grid>
</Grid>
</Form>
);
}
您可以创建另一个“onChange”属性,然后执行如下操作:
let's say you did onChange={handleInputChangeForAutoComplete}
const handleInputChangeForAutoComplete = (e,v) => {
if(v!==null)
{
var a = itemName.filter(option => option.id===v.id);
if(a.length!==0){
setValues({
...values,
itemName: v,
mrp: a[0].mrp,
buyPrice: a[0].buyPrice,
sellPrice: a[0].sellPrice,
qty:a[0].qty
})
}
}
Q1。我使用了 Autocomplete materialui 库,其中我创建了输入字段字段,该字段正在消耗一个对象,但在安慰值时我有未定义的值。
Q2。如果我为 Item Name 字段选择值,我如何为多个输入字段获取填充值,而其余输入字段,即 mrp、sellprice 等将从使用 Item Name 字段值的对象填充。(附图片)
Form img
const initialFValues = {
id: 0,
itemName: "",
mrp: "",
buyPrice: "",
sellPrice: "",
qty: "",
manufactureId: "",
manufactureDate: new Date(),
expiryDate: new Date(),
};
export default function ItemForm(props) {
const { addOrEdit, recordForEdit, invoiceId } = props;
const validate = (fieldValues = values) => {
let temp = { ...errors };
if ("itemName" in fieldValues)
temp.itemName = fieldValues.itemName ? "" : "This field is required.";
if ("mrp" in fieldValues)
temp.mrp = fieldValues.mrp.length > 1 ? "" : "Price is invalid.";
if ("buyPrice" in fieldValues)
temp.buyPrice =
fieldValues.buyPrice.length > 1 ? "" : "Price is invalid.";
if ("sellPrice" in fieldValues)
temp.sellPrice =
fieldValues.sellPrice.length > 1 ? "" : "Price is invalid.";
if ("qty" in fieldValues)
temp.qty = fieldValues.qty.length > 0 ? "" : "Qty is invalid.";
if ("manufactureId" in fieldValues)
temp.manufactureId =
fieldValues.manufactureId.length !== 0 ? "" : "This field is required.";
setErrors({
...temp,
});
if (fieldValues === values)
return Object.values(temp).every((x) => x === "");
};
const {
values,
setValues,
errors,
setErrors,
handleInputChange,
resetForm,
} = useForm(initialFValues, true, validate);
const handleSubmit = (e) => {
// console.log("InvoiceId: " + invoiceId);
e.preventDefault();
if (validate()) {
values.invoiceId = invoiceId;
addOrEdit(values, resetForm);
}
};
useEffect(() => {
if (recordForEdit != null)
setValues({
...recordForEdit,
});
values.itemName=itemName.name
}, [recordForEdit, setValues]);
// consuming from useform
const handleInputChange = e => {
const { name, value } = e.target
setValues({
...values,
[name]: value
})
console.log(values.itemName) // -> this value is undefined
if (validateOnChange)
validate({ [name]: value })
}
return (
<Form onSubmit={handleSubmit}>
<Grid container>
<Grid item xs={6}>
<Autocomplete
id="itemName"
name="itemName"
error={errors.itemName}
[enter image description here][1]value={values.itemName=itemName.name} -> this value is undefined
onChange={handleInputChange}
options={itemName}
getOptionLabel={(option) => option.name}
style={{ width: 300 }}
renderInput={(params) => (
<TextField {...params} label="Item Name" variant="outlined" />
)}
/>
{/* <Controls.Input
name="itemName"
label="Item Name"
value={values.itemName}
onChange={handleInputChange}
error={errors.itemName}
/> */}
<Controls.Input
name="mrp"
label="MRP"
value={values.mrp}
onChange={handleInputChange}
error={errors.mrp}
/>
<Controls.Input
name="buyPrice"
label="Buy Price"
value={values.buyPrice}
onChange={handleInputChange}
error={errors.buyPrice}
/>
<Controls.Input
name="sellPrice"
label="Sell Price"
value={values.sellPrice}
onChange={handleInputChange}
error={errors.sellPrice}
/>
<Controls.Input
name="qty"
label="Quantity"
value={values.qty}
onChange={handleInputChange}
error={errors.qty}
/>
</Grid>
<Grid item xs={6}>
<Controls.SelectCustom
name="manufactureId"
label="Manufacture Name"
value={values.manufactureId}
onChange={handleInputChange}
options={itemService.getItemCollection()}
error={errors.manufactureId}
/>
<Controls.DatePicker
name="manufactureDate"
label="Date of Manufacture"
autoOk={false}
value={values.manufactureDate}
onChange={handleInputChange}
/>
<Controls.DatePicker
name="expiryDate"
label="Date of Expiry"
value={values.expiryDate}
onChange={handleInputChange}
/>
<div>
<Controls.Button type="submit" text="Submit" />
<Controls.Button text="Reset" color="default" onClick={resetForm} />
</div>
</Grid>
</Grid>
</Form>
);
}
您可以创建另一个“onChange”属性,然后执行如下操作:
let's say you did onChange={handleInputChangeForAutoComplete}
const handleInputChangeForAutoComplete = (e,v) => {
if(v!==null)
{
var a = itemName.filter(option => option.id===v.id);
if(a.length!==0){
setValues({
...values,
itemName: v,
mrp: a[0].mrp,
buyPrice: a[0].buyPrice,
sellPrice: a[0].sellPrice,
qty:a[0].qty
})
}
}