Не удается отменить выбор начальных значений из компонента Select с параметрами и значениями в качестве объекта

#reactjs #grommet

#reactjs #втулка

Вопрос:

Я не могу отменить выбор значений по умолчанию, которые я установил в состоянии.

Я использую пример из codesandbox Grommet.

Единственным изменением на данный момент является добавление массива объектов вместо массива строк. См. ЗНАЧЕНИЕ prop в документах упоминается массив объектов ..

 const OPTIONS = [
  {
    label: "Expansion",
    value: "1"
  },
  {
    label: "Rollout",
    value: "2"
  }
];

export default class extends Component {
  state = {
    value: [
      {
        label: "Rollout",
        value: "2"
      }
    ],
    options: OPTIONS
  };

  render() {
    const { options, value } = this.state;
    return (
      <Select
        multiple={true}
        value={value}
        labelKey="label"
        valueKey="value"
        onSearch={searchText => {
          const regexp = new RegExp(searchText, "i");
          this.setState({ options: OPTIONS.filter(o => o.match(regexp)) });
        }}
        onChange={event => {
          console.log({ event });
          this.setState({
            value: event.value,
            options: OPTIONS
          });
        }}
        options={options}
      />
    );
  }
}
 

В журналах я получаю selected: [ -1, 1 ] , когда пытаюсь отменить Rollout выбор параметра, и Rollout он по-прежнему визуально выделяется / выбирается в представлении.

Ответ №1:

Вот ваш рабочий код, вам нужно проверить, есть ли уже выбранное значение в выборе, затем удалить его из значений, и если его нет в выбранном, добавьте значения. Я изменил функцию onChange, как показано ниже. Дайте мне знать, если возникнут какие-либо проблемы.

 import React, { Component } from "react";
import { Select } from "grommet";
import SandboxComponent from "./SandboxComponent";

const OPTIONS = [
  {
    label: "Expansion",
    value: "1"
  },
  {
    label: "Rollout",
    value: "2"
  }
];

export default class extends Component {
  state = {
    value: [
      {
        label: "Rollout",
        value: "2"
      }
    ],
    options: OPTIONS
  };

  render() {
    const { options, value } = this.state;
    return (
      <Select
        multiple={true}
        value={value}
        labelKey="label"
        valueKey="value"
        selected={0}
        onSearch={searchText => {
          const regexp = new RegExp(searchText, "i");
          this.setState({ options: OPTIONS.filter(o => o.match(regexp)) });
        }}
        onChange={event => {
          let isExist = value.find(item => {
            return item.value === event.option.value;
          });
          let newValue;
          if (isExist) {
            newValue = value.filter(item => {
              return item.value !== event.option.value;
            });
          } else {
            newValue = value;
            newValue.push(event.option);
          }

          this.setState({
            value: newValue
          });
        }}
        options={options}
      />
    );
  }
}