реакция-выбор отсоединенной кнопки сброса не работает с отключенным атрибутом

#javascript #reactjs #react-select #searchbar

#javascript #reactjs #реакция-выбор #панель поиска

Вопрос:

У меня есть эта панель поиска, которая использует react-select, дизайн которой обязал меня создать отдельную кнопку сброса. Эта кнопка сброса должна быть отключена до тех пор, пока пользователь не начнет печатать, и как только он нажмет на нее, он сбросит поиск (очевидно) и вернется в отключенное состояние.

У меня есть этот пример кода

 class App extends React.Component {
  constructor(props) {
    super(props);

    const options = [
      { value: "one", label: "One" },
      { value: "two", label: "Two" },
      { value: "three", label: "Three" },
      { value: "four", label: "Four" },
      { value: "five", label: "Five" }
    ];

    this.state = {
      select: {
        value: null,
        options
      },
      isDisabled: true
    };
  }

  setValue = (value) => {
    this.setState((prevState) => ({
      select: {
        ...prevState.select,
        value
      }
    }));
  };

  handleChange = (value) => {
    this.setValue(value);
    this.setState({ isDisabled: false });
  };

  handleInputChange = (value) => {
    if (value.length < 1) {
      this.setState({ isDisabled: true });
    }
    if (value.length > 0) {
      this.setState({ isDisabled: false });
    }
  };

  handleClick = () => {
    console.log('reset!');  ===> not happening!
    this.setValue(null);
    this.setState({ isDisabled: true });
  };

  render() {
    const { select, isDisabled } = this.state;

    return (
      <div style={styles}>
        <p>
          <button type="button" onClick={this.handleClick} disabled={isDisabled}>
            Reset value
          </button>
        </p>
        <Select
          name="form-field-name"
          value={select.value}
          onChange={this.handleChange}
          onInputChange={this.handleInputChange}
          options={select.options}
          isSearchable={true}
          isMulti
        />
      </div>
    );
  }
}
  

ссылка на код https://codesandbox.io/s/react-select-detached-reset-button-fqr74

Состояние самой кнопки работает нормально, включается и отключается в нужный момент, но оно полностью игнорирует событие щелчка и не сбрасывается. Если я удалю disabled атрибут, событие щелчка сработает, но затем я потеряю отключенное состояние кнопки.

Какие-либо советы?

Спасибо!

Ответ №1:

Проблема в том, что onInputChange вызывается, как только select теряет фокус и отключает кнопку. Это произойдет, если вы уже выбрали некоторые значения, поскольку значение prop все равно будет пустым. Просто добавьте проверку для любого значения во входных данных перед отключением кнопки.

  handleInputChange = (value) => {
    if (value.length < 1) {
      this.setState({ isDisabled: true });
    }
    //Check if SELECT has any value
    if (value.length > 0 || !!this.state.select.value) {
     this.setState({ isDisabled: false });
    }
 };
  

Комментарии:

1. Спасибо за ваш ответ @MosheSommers . Я просто исправлю одну маленькую вещь при проверке. if (value.length < 1 || !!this.state.select.value) { this.setState({ isDisabled: true }); } if (value.length > 0 || this.state.select.value) { this.setState({ isDisabled: false }); } Теперь все работает так, как должно! Большое спасибо!

2. @danihazler вы имели value.length < 1 amp;amp; !!this.state.select.value в виду, что он отключен только в том случае, если они оба не имеют значения?