为什么未选中复选框以做出反应?
why checkbox is not checked in react?
我正在尝试实现 Auto complete
具有 checkbox
。
https://material-ui.com/components/autocomplete/#autocomplete
但是当我在 final-form
中实现相同的组件时,我无法检查我的选项,为什么?
这是我的代码
https://codesandbox.io/s/relaxed-breeze-hv58o
<Autocomplete
{...rest}
multiple={multiple}
disableCloseOnSelect={true}
options={
multiple
? maxReached
? []
: options.filter(option => !value.includes(option.value))
: options
}
defaultValue={
multiple
? options.filter(option => value.includes(option.value))
: options.find(option => option.value === value)
}
onChange={
multiple
? (_e, values) => {
setMaxReached(value.length >= max - 1);
onChange(values.map(option => option.value));
}
: (_e, option) => onChange(option.value)
}
getOptionLabel={option => option.label}
noOptionsText={
maxReached
? formatMessage({ id: "components.autocomplete.max" }, { max })
: formatMessage({ id: "components.autocomplete.no" })
}
renderOption={(option, { selected }) => (
<React.Fragment>
<Checkbox
icon={icon}
checkedIcon={checkedIcon}
style={{ marginRight: 8 }}
checked={selected}
/>
{option.label}
</React.Fragment>
)}
renderInput={params => (
<TextField
{...params}
{...restInput}
label={label}
placeholder={placeholder || ""}
helperText={
hasError ? formatMessage({ id: error }, { label }) : helperText
}
error={hasError}
fullWidth
/>
)}
/>
);
};
您的代码存在一些问题 (fixed version):
- 您正在调用
onChange
使 React-Final-Form
重新呈现,这导致 Autocomplete
组件重新呈现,并删除 select 状态。要解决此问题,您必须使用 getOptionSelected
选项。
getOptionSelected={(option, value) => {
return option.value === value.value;
}}
options={
options
}
onChange={(_e, values) => {
onChange(values);
}
- 您正在根据
Autocomplete
组件过滤 options
,因此 selected 选项被过滤掉了。
所以从这个:
options={
multiple
? maxReached
? []
: options.filter(option => !value.includes(option.value))
: options
}
到
options={
options
}
我正在尝试实现 Auto complete
具有 checkbox
。
https://material-ui.com/components/autocomplete/#autocomplete
但是当我在 final-form
中实现相同的组件时,我无法检查我的选项,为什么?
这是我的代码 https://codesandbox.io/s/relaxed-breeze-hv58o
<Autocomplete
{...rest}
multiple={multiple}
disableCloseOnSelect={true}
options={
multiple
? maxReached
? []
: options.filter(option => !value.includes(option.value))
: options
}
defaultValue={
multiple
? options.filter(option => value.includes(option.value))
: options.find(option => option.value === value)
}
onChange={
multiple
? (_e, values) => {
setMaxReached(value.length >= max - 1);
onChange(values.map(option => option.value));
}
: (_e, option) => onChange(option.value)
}
getOptionLabel={option => option.label}
noOptionsText={
maxReached
? formatMessage({ id: "components.autocomplete.max" }, { max })
: formatMessage({ id: "components.autocomplete.no" })
}
renderOption={(option, { selected }) => (
<React.Fragment>
<Checkbox
icon={icon}
checkedIcon={checkedIcon}
style={{ marginRight: 8 }}
checked={selected}
/>
{option.label}
</React.Fragment>
)}
renderInput={params => (
<TextField
{...params}
{...restInput}
label={label}
placeholder={placeholder || ""}
helperText={
hasError ? formatMessage({ id: error }, { label }) : helperText
}
error={hasError}
fullWidth
/>
)}
/>
);
};
您的代码存在一些问题 (fixed version):
- 您正在调用
onChange
使React-Final-Form
重新呈现,这导致Autocomplete
组件重新呈现,并删除 select 状态。要解决此问题,您必须使用getOptionSelected
选项。
getOptionSelected={(option, value) => {
return option.value === value.value;
}}
options={
options
}
onChange={(_e, values) => {
onChange(values);
}
- 您正在根据
Autocomplete
组件过滤options
,因此 selected 选项被过滤掉了。 所以从这个:
options={
multiple
? maxReached
? []
: options.filter(option => !value.includes(option.value))
: options
}
到
options={
options
}