Как установить значение по умолчанию в response-select


88

У меня проблема с использованием response-select. Я использую форму redux, и я сделал свой компонент выбора реакции совместимым с формой redux. Вот код:

const MySelect = props => (
    <Select
        {...props}
        value={props.input.value}
        onChange={value => props.input.onChange(value)}
        onBlur={() => props.input.onBlur(props.input.value)}
        options={props.options}
        placeholder={props.placeholder}
        selectedValue={props.selectedValue}
    />
);

и вот как я это визуализирую:

<div className="select-box__container">
    <Field
    id="side"
    name="side"
    component={SelectInput}
    options={sideOptions}
    clearable={false}
    placeholder="Select Side"
    selectedValue={label: 'Any', value: 'Any'}
    />
</div>

Но проблема в том, что в моем раскрывающемся списке нет значения по умолчанию, как мне хотелось бы. Что я делаю не так? Любые идеи?


это правильно: значение = {props.input.value}. с какой проблемой вы столкнулись?
Вед

Моя проблема в том, что я хочу, чтобы мой выбор имел значение по умолчанию при первом рендеринге, но я не могу
user7334203

1
каково значение props.input.value при первом рендеринге?
Вед

Это моя проблема. Как установить для него значение по умолчанию?
user7334203

какую ценность вы хотите?
Вед

Ответы:


62

Думаю, вам нужно что-то вроде этого:

const MySelect = props => (
<Select
    {...props}
    value={props.options.filter(option => option.label === 'Some label')}
    onChange={value => props.input.onChange(value)}
    onBlur={() => props.input.onBlur(props.input.value)}
    options={props.options}
    placeholder={props.placeholder}
  />
);

5
Смысл связывания с redux / react заключается в том, что пользовательский интерфейс отражает значение объекта в реальном времени. этот подход разъединяет эту привязку. Рассмотрите возможность установки значения по умолчанию в редукторе.
Джозеф Юнке,

2
@JosephJuhnke сначала проверьте вопрос. Вот как установить значение по умолчанию.
Вед

5
selectedValueбыл изменен на value. Проверьте документы react-select.com/props
transang

9
В defaultValueновой версии есть поле.
Хунбо Мяо,

3
сложность заключается в том, что вам нужно установить для выбранного объекта значение поля defaultValue вместо значения параметров. например, 0,1,2
andyCao 01

47

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

<Select
  name="form-dept-select"
  options={depts}
  defaultValue={{ label: "Select Dept", value: 0 }}
  onChange={e => {
              this.setState({
              department: e.label,
              deptId: e.value
              });
           }}
/>

8
Спасибо, теперь я знаю, что defaultValue принимает объект, а не просто значение.
Деннис Лю

1
Не согласно документации React или intelisense, это не так: reactjs.org/docs/uncontrolled-components.html#default-values
Alex

38

Если вы пришли сюда для response-select v2 и по-прежнему испытываете проблемы - версия 2 теперь принимает объект только как value, defaultValueи т. Д.

То есть попробуйте использовать value={{value: 'one', label: 'One'}}, а не просто value={'one'}.


Большое спасибо
Джонни Бигуд

неполный. если вы установите для него значение, вы больше не сможете его изменить
Тоскан

@Toskan - да, это один из принципов ReactJS и односторонней привязки данных, он влияет на все элементы формы, а не только на эту библиотеку. Если вы решите использовать контролируемый компонент, вам необходимо самостоятельно обработать изменение, не реагируя на него. Этот ответ говорит об этом и ссылается на React Docs: stackoverflow.com/questions/42522515/…
eedrah

Хорошо, честно, так какую проблему вы решаете? то есть жесткое кодирование значения?
Тоскан

Приведенный здесь случай {value: 'one', label: 'One'}является просто примером. В вашем приложении это будет переменная / опора с идентичной структурой.
eedrah

13

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

<option key={index} value={item}> {item} </option>

Затем сначала сопоставьте значение элемента select со значением options.

<select 
    value={this.value} />

Я думаю, что это лучшее / самое элегантное решение. Правильно ли я так думаю?
user2026178

значение не изменится, если это так, у вас есть функция записи onChange, также установите изменение
raghul

1
Это для ванильного HTML-элемента <select>, а не для response-select <Select>, для чего был задан вопрос. Корпус может иметь
решающее

5

Расширяя ответ @ isaac-pak, если вы хотите передать значение по умолчанию вашему компоненту в опоре, вы можете сохранить его в состоянии в методе жизненного цикла componentDidMount (), чтобы гарантировать, что значение по умолчанию будет выбрано в первый раз.

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

export default class MySelect extends Component {

    constructor(props) {
        super(props);
        this.state = {
            selectedValue: '',
        };
        this.handleChange = this.handleChange.bind(this);

        this.options = [
            {value: 'foo', label: 'Foo'},
            {value: 'bar', label: 'Bar'},
            {value: 'baz', label: 'Baz'}
        ];

    }

    componentDidMount() {
        this.setState({
            selectedValue: this.props.defaultValue,
        })
    }

    handleChange(selectedOption) {
        this.setState({selectedValue: selectedOption.target.value});
    }

    render() {
        return (
            <Select
                value={this.options.filter(({value}) => value === this.state.selectedValue)}
                onChange={this.handleChange}
                options={this.options}
            />
        )
    }
}

MySelect.propTypes = {
    defaultValue: PropTypes.string.isRequired
};

Я получаю следующее: Предупреждение: параметр valueprop on selectне должен быть нулевым. Рассмотрите возможность использования пустой строки для очистки компонента или undefinedдля неконтролируемых компонентов.
Джейсон Райс

Я делаю то же самое и получаю предупреждение:Warning: A component is changing a controlled input of type hidden to be uncontrolled. Input elements should not switch from controlled to uncontrolled (or vice versa).
alexventuraio 01

@AlexVentura Я сделал свой код более полным и протестировал его на своей системе. Я не получаю предупреждения о контролируемом вводе. Попробуйте обновить свой код на основе моего отредактированного ответа и опубликуйте то, что найдете.
Дэн Мейгс

2

Я просто прошел через это сам и решил установить значение по умолчанию в функции INIT редуктора.

Если вы связываете свой выбор с помощью redux, тогда лучше не «отменять привязку» его со значением по умолчанию для выбора, которое не представляет фактическое значение, вместо этого установите значение при инициализации объекта.


1

Если вы не используете redux-form и используете локальное состояние для изменений, ваш компонент response-select может выглядеть следующим образом:

class MySelect extends Component {

constructor() {
    super()
}

state = {
     selectedValue: 'default' // your default value goes here
}

render() {
  <Select
       ...
       value={this.state.selectedValue}
       ...
  />
)}

1

Используйте реквизиты defaultInputValue следующим образом:

<Select
   name="name"
   isClearable
   onChange={handleChanges}
   options={colourOptions}
   isSearchable="true"
   placeholder="Brand Name"
   defaultInputValue="defaultInputValue"
/>

          

для получения дополнительной информации https://www.npmjs.com/package/react-select


0

Если ваши варианты такие

var options = [
  { value: 'one', label: 'One' },
  { value: 'two', label: 'Two' }
];

Вы {props.input.value}должны соответствовать одному из 'value'в вашем{props.options}

Значение props.input.valueдолжно быть либо, 'one'либо'two'


0

Чтобы автоматически выбрать значение в select.

введите описание изображения здесь

<div className="form-group">
    <label htmlFor="contactmethod">Contact Method</label>
    <select id="contactmethod" className="form-control"  value={this.state.contactmethod || ''} onChange={this.handleChange} name="contactmethod">
    <option value='Email'>URL</option>
    <option value='Phone'>Phone</option>
    <option value="SMS">SMS</option>
    </select>
</div>

Используйте атрибут value в теге select

value={this.state.contactmethod || ''}

решение работает для меня.


0
  1. Создайте свойство состояния для текста параметра по умолчанию в конструкторе
    • Не беспокойтесь о значении параметра по умолчанию
  2. Добавьте тег опции к функции рендеринга. Показывать только с использованием состояния и тернарного выражения
  3. Создайте функцию для обработки, когда была выбрана опция
  4. Измените состояние значения параметра по умолчанию в этой функции обработчика событий на null

    Class MySelect extends React.Component
    {
        constructor()
        {
            super()
            this.handleChange = this.handleChange.bind(this);
            this.state = {
                selectDefault: "Select An Option"
            }
        }
        handleChange(event)
        {
            const selectedValue = event.target.value;
            //do something with selectedValue
            this.setState({
                selectDefault: null
            });
        }
        render()
        {
            return (
            <select name="selectInput" id="selectInput" onChange={this.handleChange} value= 
                {this.selectedValue}>
             {this.state.selectDefault ? <option>{this.state.selectDefault}</option> : ''}
                {'map list or static list of options here'}
            </select>
            )
        }
    }
    

0

Я часто использую что-то подобное.

Значение по умолчанию из props в этом примере

if(Defaultvalue ===item.value) {
    return <option key={item.key} defaultValue value={item.value}>{plantel.value} </option>   
} else {
    return <option key={item.key} value={item.value}>{plantel.value} </option> 
}

0

Вам нужно делать глубокий поиск, если вы используете группы в опциях:

options={[
  { value: 'all', label: 'All' },
  {
    label: 'Specific',
    options: [
      { value: 'one', label: 'One' },
      { value: 'two', label: 'Two' },
      { value: 'three', label: 'Three' },
    ],
  },
]}
const deepSearch = (options, value, tempObj = {}) => {
  if (options && value != null) {
    options.find((node) => {
      if (node.value === value) {
        tempObj.found = node;
        return node;
      }
      return deepSearch(node.options, value, tempObj);
    });
    if (tempObj.found) {
      return tempObj.found;
    }
  }
  return undefined;
};
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.