Стилизация react-select v2 с помощью material-ui - Заменить компонент ввода

У меня возникла проблема с заменой компонента ввода для response-select v2 на компонент ввода из пользовательского интерфейса материала.

До сих пор я пытался использовать поле codeandbox ниже, но не могу активировать фильтрацию при вводе в поле ввода?

https://codesandbox.io/s/jjjwoj3yz9

Также приветствуются любые отзывы о реализации замены Option. Правильно ли я поступаю, беря текст выбранной опции и ищу объект Option из моего списка опций, чтобы перейти к функции selectOption?

Очень признателен, Эрик


person drivenj17    schedule 14.06.2018    source источник


Ответы (1)


V1

обратитесь к документации отсюда: https://material-ui.com/demos/autocomplete/

он предоставляет четкую документацию о том, как использовать response-select с material-ui

вот рабочий пример для вашего вопроса: https://codesandbox.io/s/p9jpl9l827

как вы можете видеть, входной компонент material-ui может принимать react-select как inputComponent.

V2

Это почти то же самое, что и предыдущий подход:

реализовать компонент ввода:

<div className={classes.root}>
  <Input
   fullWidth
    inputComponent={SelectWrapped}
    value={this.state.value}
    onChange={this.handleChange}
    placeholder="Search your color"
    id="react-select-single"
    inputProps={{
     options: colourOptions
    }}
  />
</div>

а затем SelectWrapped реализация компонента должна быть:

function SelectWrapped(props) {
  const { classes, ...other } = props;

  return (
    <Select
      components={{
        Option: Option,
        DropdownIndicator: ArrowDropDownIcon
      }}
      styles={customStyles}
      isClearable={true}
      {...other}
    />
  );
}

и я переопределяю компонент Option и DropdownIndicator, чтобы сделать его более материальным, и также добавил customStyles:

const customStyles = {
  control: () => ({
    display: "flex",
    alignItems: "center",
    border: 0,
    height: "auto",
    background: "transparent",
    "&:hover": {
      boxShadow: "none"
    }
  }),
  menu: () => ({
    backgroundColor: "white",
    boxShadow: "1px 2px 6px #888888", // should be changed as material-ui
    position: "absolute",
    left: 0,
    top: `calc(100% + 1px)`,
    width: "100%",
    zIndex: 2,
    maxHeight: ITEM_HEIGHT * 4.5
  }),
  menuList: () => ({
    maxHeight: ITEM_HEIGHT * 4.5,
    overflowY: "auto"
  })
};

и вариант:

class Option extends React.Component {
  handleClick = event => {
    this.props.selectOption(this.props.data, event);
  };

  render() {
    const { children, isFocused, isSelected, onFocus } = this.props;
    console.log(this.props);
    return (
      <MenuItem
        onFocus={onFocus}
        selected={isFocused}
        onClick={this.handleClick}
        component="div"
        style={{
          fontWeight: isSelected ? 500 : 400
        }}
      >
        {children}
      </MenuItem>
    );
  }
}

пожалуйста, найдите пример здесь: https://codesandbox.io/s/7k82j5j1qx

обратитесь к документации из response select, и вы можете добавить больше изменений, если хотите.

надеюсь, это поможет вам.

person Nadun    schedule 15.06.2018
comment
Привет @gluttony, спасибо за ответ. Однако я ищу решение, использующее реакцию выбора версии 2 (т.е. 2.0.0-beta6 в моем примере с кодами и ящиком). Я видел документацию на сайте material-ui.com/demos/autocomplete, к сожалению, это для версии 1 response-select. С Уважением - person drivenj17; 15.06.2018
comment
@Nadun, я считаю, что оба примера кода песочницы устарели. - person Sachin Kumar; 19.06.2020