Як встановити значення за замовчуванням у response-select


86

У мене виникла проблема з реакцією-вибором. Я використовую форму 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>

Але проблема в тому, що мій випадаючий список не має значення за замовчуванням, як я бажаю. Що я роблю не так? Будь-які ідеї?


це правильно: value = {props.input.value}. з якою проблемою ви стикаєтесь?
Вед,

Моя проблема полягає в тому, що я хочу, щоб мій вибір мав значення за замовчуванням, коли я вперше його відтворюю, але я не можу
user7334203

1
що таке значення props.input.value, коли воно відображається першим?
Вед,

Це моя проблема. Як встановити для нього значення за замовчуванням?
користувач7334203

яке значення ти хочеш?
Вед,

Відповіді:


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
Суть прив’язки з редукцією / реакцією полягає в тому, що інтерфейс користувача відображає цінність об’єкта в реальному часі. цей підхід роз'єднує цю прив'язку. Подумайте про встановлення значення за замовчуванням у редукторі.
Джозеф Юнке,

2
@JosephJuhnke спочатку перевірте питання. Це як встановити значення за замовчуванням.
Вед,

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

9
Зараз defaultValueу новій версії є поле.
Хонгбо Мяо,

3
хитра річ у тому, що вам потрібно встановити для вибраного об'єкта поле 'defaultValue', а не значення параметрів. напр., 0,1,2
andyCao

46

Я використовував параметр 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 це не так: responsejs.org/docs/uncontrole-components.html#default-values
Олексій

38

Якщо ви прийшли сюди для реакції-вибору 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

У мене була подібна помилка. Переконайтеся, що ваші параметри мають атрибут value.

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

Потім встановіть відповідність значення елемента selects спочатку до значення параметрів.

<select 
    value={this.value} />

Я думаю, що це найкраще / найелегантніше рішення. Я правильно вважаю це?
user2026178

значення не зміниться, якщо це зробити, у вас є функція write onChange занадто встановлена ​​зміна
raghul

1
Це для елемента <select> ванільного HTML, а не для реакції-вибору <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

@AlexVentura Я зробив свій код трохи повнішим і протестував його в своїй системі. Я не отримую попередження щодо контрольованого введення. Спробуйте оновити свій код на основі моєї відредагованої відповіді та опублікуйте те, що знайдете.
Dan Meigs

2

Я просто пройшов це сам і вирішив встановити значення за замовчуванням для функції INIT редуктора.

Якщо ви прив'язуєте свій вибір за допомогою redux, тоді найкраще не "розв'язувати" його значенням за замовчуванням select, яке не відображає фактичне значення, замість цього встановіть значення під час ініціалізації об'єкта.


1

Якщо ви не використовуєте redux-форму, а для змін використовуєте локальний стан, то ваш компонент реакції-вибору може виглядати так:

class MySelect extends Component {

constructor() {
    super()
}

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

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


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. Змініть стан значення параметра за замовчуванням у цій функції обробника події на нуль

    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

Я часто використовую щось подібне.

Значення за замовчуванням з реквізитів у цьому прикладі

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.