Jak ustawić wartość domyślną w React-select


86

Mam problem z użyciem funkcji React-Select. Używam formy Redux i dostosowałem mój komponent React-Select do formy Redux. Oto kod:

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}
    />
);

a tutaj jak to renderuję:

<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>

Ale problem polega na tym, że moje menu nie ma domyślnej wartości, jak chcę. Co robię źle? Jakieś pomysły?


to jest poprawne: value = {props.input.value}. jaki jest problem, przed którym stoisz?
Wed

Moim problemem jest to, że chcę, aby mój wybór miał wartość defaultValue, kiedy po raz pierwszy go renderuję, ale nie mogę
user7334203

1
jaka jest wartość właściwości props.input.value, gdy jest renderowana jako pierwsza?
Wed

To mój problem. Jak ustawić, aby miał wartość domyślną?
user7334203

jaką chcesz wartość?
Wed

Odpowiedzi:


62

Myślę, że potrzebujesz czegoś takiego:

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
Punktem powiązania z redux / reaguje jest to, aby ui odzwierciedlało wartość obiektu w czasie rzeczywistym. takie podejście uniezależnia to wiązanie. Rozważ ustawienie domyślnej wartości reduktora.
Joseph Juhnke

2
@JosephJuhnke najpierw sprawdź pytanie. To jak ustawić wartość domyślną.
Wed

5
selectedValuezostał zmieniony na value. Sprawdź dokumenty react-select.com/props
transang

9
W defaultValuenowej wersji jest teraz pole.
Hongbo Miao

3
trudność polega na tym, że musisz ustawić wybrany obiekt na pole „defaultValue” zamiast wartości opcji. np. 0, 1, 2
andyCao

46

Użyłem parametru defaultValue, poniżej znajduje się kod, w jaki sposób osiągnąłem wartość domyślną, a także zaktualizowałem wartość domyślną po wybraniu opcji z listy rozwijanej.

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

8
Dzięki, teraz wiem, że defaultValue przyjmuje obiekt, a nie tylko wartość.
Dennis Liu

1
Nie według React docs lub intelisense, nie: awarejs.org/docs/uncontrolled-components.html#default-values
Alex

38

Jeśli trafiłeś tutaj reagują-select v2, a nadal występują problemy - wersja 2 teraz przyjmuje tylko jako przedmiot value, defaultValueitd

Oznacza to, że value={{value: 'one', label: 'One'}}zamiast po prostu spróbuj użyć value={'one'}.


Dziękuję bardzo
Johnny Bigoode

niekompletny. jeśli ustawisz tę wartość, nie możesz już zmienić wartości
Toskan

@Toskan - tak, jest to jedna z zasad ReactJS i jednokierunkowego wiązania danych i dotyczy wszystkich elementów formularza, nie tylko tej biblioteki. Jeśli zdecydujesz się na komponent kontrolowany, musisz sam poradzić sobie ze zmianą, poza reakcją. Ta odpowiedź mówi o tym i prowadzi do React Docs: stackoverflow.com/questions/42522515/ ...
eedrah

ok, w porządku, więc jaki problem rozwiązujesz? czyli twarde zakodowanie wartości?
Toskan

Podany tu przypadek {value: 'one', label: 'One'}jest tylko przykładem. W twojej aplikacji byłaby to zmienna / prop o identycznej strukturze.
eedrah

13

Miałem podobny błąd. Upewnij się, że opcje mają atrybut wartości.

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

Następnie dopasuj początkowo wartość elementu selects do wartości opcji.

<select 
    value={this.value} />

Myślę, że to najlepsze / najbardziej eleganckie rozwiązanie. Czy mam rację, myśląc tak?
user2026178

wartość nie ulegnie zmianie jeśli tak zrobisz, musisz też napisać funkcję
onChange

1
To jest dla zwykłego elementu HTML <select>, a nie re-select <Select>, do czego było pytanie. Okrywa może zrobić różnicę :)
Mike Goatly

5

Rozszerzając odpowiedź @ isaac-pak, jeśli chcesz przekazać domyślną wartość do swojego komponentu we właściwości, możesz zapisać ją w stanie w metodzie cyklu życia componentDidMount (), aby upewnić się, że wartość domyślna zostanie wybrana za pierwszym razem.

Uwaga, zaktualizowałem następujący kod, aby był bardziej kompletny i użyłem pustego ciągu jako wartości początkowej w komentarzu.

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
};

Rozumiem: Ostrzeżenie: valuepodpórka selectnie powinna być zerowa. Rozważ użycie pustego ciągu, aby wyczyścić składnik lub undefinedniekontrolowane składniki.
Jason Rice

Robię to samo i otrzymuję ostrzeżenie: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 Mój kod stał się trochę bardziej kompletny i przetestowałem go w moim systemie. Nie dostaję ostrzeżenia o kontrolowanym wejściu. Spróbuj zaktualizować kod na podstawie mojej edytowanej odpowiedzi i opublikuj ponownie to, co znalazłeś.
Dan Meigs

2

Po prostu przeszedłem przez to sam i wybrałem ustawienie domyślnej wartości w funkcji INIT reduktora.

Jeśli powiążesz zaznaczenie z redux, najlepiej nie usuwaj go z domyślną wartością select, która nie reprezentuje rzeczywistej wartości, zamiast tego ustaw wartość podczas inicjalizacji obiektu.


1

Jeśli nie używasz formularza redux i używasz stanu lokalnego do zmian, Twój komponent re-select może wyglądać następująco:

class MySelect extends Component {

constructor() {
    super()
}

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

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

1

Użyj właściwości defaultInputValue w następujący sposób:

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

          

aby uzyskać więcej informacji, https://www.npmjs.com/package/react-select


0

Jeśli masz takie możliwości

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

Twój {props.input.value}powinien pasować do jednego z 'value'w twoim{props.options}

Znaczenie props.input.valuepowinno być albo 'one'albo'two'


0

Aby automatycznie wybrać wartość w wybierz.

wprowadź opis obrazu tutaj

<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>

Użyj atrybutu value w tagu select

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

rozwiązanie działa dla mnie.


0
  1. Utwórz właściwość stanu dla domyślnego tekstu opcji w konstruktorze
    • Nie martw się o domyślną wartość opcji
  2. Dodaj tag opcji do funkcji renderowania. Pokaż tylko przy użyciu stanu i wyrażenia trójskładnikowego
  3. Utwórz funkcję, która ma być obsługiwana po wybraniu opcji
  4. Zmień stan domyślnej wartości opcji w tej funkcji obsługi zdarzeń na 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

Często używam czegoś takiego.

Wartość domyślna z właściwości w tym przykładzie

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

Musisz przeprowadzić głębokie wyszukiwanie, jeśli używasz grup w opcjach:

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;
};
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.