我正在使用react-select
实现https://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html#method-i-has_many-label-Options中的自动完成选择字段。我已经从他们的演示中使用了代码,但是不是在本地处理onChange和状态,而是从其他作为自动完成选择组件父级的组件进行此操作。
这是我的实现方式
function NoOptionsMessage(props) {
return (
<Typography
color="textSecondary"
className={props.selectProps.classes.noOptionsMessage}
{...props.innerProps}
>
{props.children}
</Typography>
);
}
function inputComponent({ inputRef, ...props }) {
return <div ref={inputRef} {...props} />;
}
function Control(props) {
return (
<TextField
fullWidth
InputProps={{
inputComponent,
inputProps: {
className: props.selectProps.classes.input,
inputRef: props.innerRef,
children: props.children,
...props.innerProps,
},
}}
{...props.selectProps.textFieldProps}
/>
);
}
function Option(props) {
return (
<MenuItem
buttonRef={props.innerRef}
selected={props.isFocused}
component="div"
style={{
fontWeight: props.isSelected ? 500 : 400,
}}
{...props.innerProps}
>
{props.children}
</MenuItem>
);
}
function Placeholder(props) {
return (
<Typography
color="textSecondary"
className={props.selectProps.classes.placeholder}
{...props.innerProps}
>
{props.children}
</Typography>
);
}
function SingleValue(props) {
return (
<Typography className={props.selectProps.classes.singleValue} {...props.innerProps}>
{props.children}
</Typography>
);
}
function ValueContainer(props) {
return <div className={props.selectProps.classes.valueContainer}>{props.children}</div>;
}
function MultiValue(props) {
return (
<Chip
tabIndex={-1}
label={props.children}
className={classNames(props.selectProps.classes.chip, {
[props.selectProps.classes.chipFocused]: props.isFocused,
})}
onDelete={props.removeProps.onClick}
deleteIcon={<CancelIcon {...props.removeProps} />}
/>
);
}
function Menu(props) {
return (
<Paper square className={props.selectProps.classes.paper} {...props.innerProps}>
{props.children}
</Paper>
);
}
const components = {
Control,
Menu,
MultiValue,
NoOptionsMessage,
Option,
Placeholder,
SingleValue,
ValueContainer,
};
class AutocompleteSelect extends React.Component {
render() {
const { classes, theme, options, value, handleChange, placeholder, isClearable, isMulti } = this.props;
const selectStyles = {
input: base => ({
...base,
color: theme.palette.text.primary,
'& input': {
font: 'inherit',
},
}),
};
return (
<NoSsr>
<Select
classes={classes}
styles={selectStyles}
options={options}
components={components}
value={value}
onChange={(event) => handleChange(event.value)}
placeholder={placeholder}
isClearable={isClearable}
isMulti={isMulti}
/>
</NoSsr>
);
}
}
AutocompleteSelect.propTypes = {
classes: PropTypes.object.isRequired,
theme: PropTypes.object.isRequired,
handleChange: PropTypes.func.isRequired,
options: PropTypes.array.isRequired,
};
AutocompleteSelect.defaultProps = {
isClearable: false,
isMulti: false,
placeholder: '',
value: undefined,
};
export default withStyles(styles, { withTheme: true })(AutocompleteSelect);
我可以在浏览器控制台中看到value
字段得到了select
,并且父组件中的state
正在正确更新onChange
事件,但是该字段的值未呈现。我在这里做什么错了?