Come impostare un valore predefinito in react-select


86

Ho un problema con l'utilizzo di react-select. Io uso redux form e ho reso il mio componente reatt-select compatibile con redux form. Ecco il codice:

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

e qui come lo rendo:

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

Ma il problema è che il mio menu a discesa non ha un valore predefinito come desidero. Cosa sto sbagliando? Qualche idea?


questo è corretto: value = {props.input.value}. qual è il problema che stai affrontando?
Ved

Il mio problema è che voglio che la mia selezione abbia un valore predefinito quando lo eseguo per la prima volta ma non posso
user7334203

1
qual è il valore di props.input.value quando viene renderizzato per primo?
Ved

Questo è il mio problema. Come impostarlo per avere un valore predefinito?
user7334203

che valore vuoi?
Ved

Risposte:


62

Immagino che tu abbia bisogno di qualcosa del genere:

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
Il punto nel collegamento con redux / react è che l'interfaccia utente riflette il valore dell'oggetto in tempo reale. questo approccio disaccoppia tale legame. Considera l'idea di impostare il valore predefinito nel riduttore.
Joseph Juhnke

2
@JosephJuhnke controlla prima la domanda. È come impostare il valore predefinito.
Ved

5
selectedValueera stato cambiato in value. Controlla i documenti react-select.com/props
transang

9
defaultValueOra c'è campo nella nuova versione.
Hongbo Miao

3
la cosa complicata è che devi impostare l'oggetto selezionato sul campo "defaultValue", invece del valore delle opzioni. es. 0,1,2
andyCao

46

Ho usato il parametro defaultValue, di seguito è riportato il codice in cui ho ottenuto un valore predefinito e aggiorna il valore predefinito quando viene selezionata un'opzione dal menu a discesa.

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

8
Grazie, ora so che defaultValue prende l'oggetto invece del solo valore.
Dennis Liu

1
Non secondo React docs o intelisense non lo fa: reactjs.org/docs/uncontrolled-components.html#default-values
Alex

38

Se sei venuto qui per reagire-select v2, e ancora problemi - versione 2 ora accetta solo un oggetto come value, defaultValue, etc.

Cioè, prova a usare value={{value: 'one', label: 'One'}}, invece di solo value={'one'}.


Grazie mille
Johnny Bigoode

incompleto. se imposti il ​​valore su quello, non puoi più cambiare il valore
Toskan

@Toskan - sì, questo è uno dei principi di ReactJS e dell'associazione dati unidirezionale e influisce su tutti gli elementi del modulo non solo su questa libreria. Devi gestire il cambiamento da solo al di fuori di React se scegli di avere una Componente Controllata. Questa risposta ne parla e collegamenti attraverso la Reagire Docs: stackoverflow.com/questions/42522515/...
eedrah

ok abbastanza, quindi quale problema risolvi? cioè, hard coding un valore?
Toskan

Il caso {value: 'one', label: 'One'}qui riportato è solo un esempio. Nella tua applicazione questa sarebbe una variabile / prop con una struttura identica.
eedrah

13

Ho riscontrato un errore simile. Assicurati che le tue opzioni abbiano un attributo di valore.

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

Quindi abbina inizialmente il valore dell'elemento selects al valore delle opzioni.

<select 
    value={this.value} />

Penso che questa sia la soluzione migliore / più elegante. Ho ragione nel pensarlo?
user2026178

il valore non cambierà in tal caso, è necessario scrivere sulla funzione Modifica anche impostare la modifica
raghul

1
Questo è per un elemento <select> HTML vanigliato, non per un <Select> di reazione-selezione, che è a cosa serviva la domanda. L'involucro può fare la differenza :)
Mike Goatly

5

Estendendo la risposta di @ isaac-pak, se vuoi passare il valore predefinito al tuo componente in un puntello, puoi salvarlo nello stato nel metodo del ciclo di vita componentDidMount () per assicurarti che il valore predefinito sia selezionato la prima volta.

Nota, ho aggiornato il codice seguente per renderlo più completo e per utilizzare una stringa vuota come valore iniziale per il commento.

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

Ottengo questo: Attenzione: valueprop on selectnon dovrebbe essere nullo. Considerare l'utilizzo di una stringa vuota per cancellare il componente o undefinedper i componenti non controllati.
Jason Rice,

Sto facendo lo stesso e ricevo questo avviso: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 Ho reso il mio codice un po 'più completo e l'ho testato sul mio sistema. Non ricevo l'avviso sull'input controllato. Prova ad aggiornare il tuo codice in base alla mia risposta modificata e pubblica ciò che trovi.
Dan Meigs

2

Ho appena fatto questo da solo e ho scelto di impostare il valore predefinito nella funzione INIT del riduttore.

Se vincoli la tua selezione con redux, allora meglio non "de-legarla" con un valore predefinito di selezione che non rappresenta il valore effettivo, invece imposta il valore quando inizializzi l'oggetto.


1

Se non stai usando redux-form e stai usando lo stato locale per le modifiche, il tuo componente di selezione-reazione potrebbe assomigliare a questo:

class MySelect extends Component {

constructor() {
    super()
}

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

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

1

Usa gli oggetti di scena defaultInputValue in questo modo:

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

          

per ulteriori riferimenti https://www.npmjs.com/package/react-select


0

Se le tue opzioni sono come questa

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

Il tuo {props.input.value}deve corrispondere uno dei 'value'nella vostra{props.options}

Significato, props.input.valuedovrebbe essere 'one'o'two'


0

Per selezionare automaticamente il valore di in selezionare.

inserisci qui la descrizione dell'immagine

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

Utilizza l'attributo value nel tag select

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

la soluzione sta funzionando per me.


0
  1. Crea una proprietà di stato per il testo dell'opzione predefinita nel costruttore
    • Non preoccuparti del valore dell'opzione predefinita
  2. Aggiungi un tag di opzione alla funzione di rendering. Mostra solo usando espressioni di stato e ternarie
  3. Crea una funzione per gestire quando un'opzione è stata selezionata
  4. Modificare lo stato del valore dell'opzione predefinita in questa funzione del gestore eventi su 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

Uso spesso qualcosa di simile.

Valore predefinito da props in questo esempio

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

È necessario eseguire una ricerca approfondita se si utilizzano i gruppi nelle opzioni:

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;
};
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.