React-select'de varsayılan bir değer nasıl ayarlanır


91

React-select'i kullanırken bir sorun yaşıyorum. Redux formunu kullanıyorum ve react-select bileşenimi redux formuyla uyumlu hale getirdim. İşte 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}
    />
);

ve işte bunu nasıl oluşturuyorum:

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

Ancak sorun şu ki, açılır menümün istediğim gibi varsayılan bir değeri olmaması. Neyi yanlış yapıyorum? Herhangi bir fikir?


bu doğrudur: değer = {props.input.value}. karşılaştığınız sorun nedir?
Ved

Benim sorunum, seçimimin ilk oluşturduğumda bir defaultValue değerine sahip olmasını istemem ama yapamıyorum
user7334203

1
props.input.value ilk görüntülendiğinde değeri nedir?
35'te Ved

Bu benim sorunum. Varsayılan bir değere sahip olacak şekilde nasıl ayarlanır?
user7334203

ne değer istiyorsun
Ved

Yanıtlar:


69

Sanırım böyle bir şeye ihtiyacın var:

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

6
Redux / react ile bağlamadaki nokta, kullanıcı arabiriminin nesnenin değerini gerçek zamanlı olarak yansıtmasıdır. bu yaklaşım, bu bağlamayı ayırır. Düşürücüdeki varsayılan değeri ayarlamayı düşünün.
Joseph Juhnke

2
@JosephJuhnke önce soruyu kontrol edin. Varsayılan değerin nasıl ayarlanacağıdır.
Ved

5
selectedValueolarak değiştirildi value. Dokümanları kontrol edin react-select.com/props
transang

11
Orada defaultValuetarla yeni sürümünde artık.
Hongbo Miao

3
İşin zor yanı, seçili nesneyi seçeneklerin değeri yerine 'defaultValue' alanına ayarlamanız gerektiğidir. ör. 0,1,2
andyCao

50

DefaultValue parametresini kullandım, aşağıdaki kod, varsayılan bir değere nasıl ulaştığımı ve açılır menüden bir seçenek belirlendiğinde varsayılan değeri güncellediğimi gösteriyor.

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

8
Teşekkürler, artık defaultValue'nun sadece değer yerine nesneyi aldığını biliyorum.
Dennis Liu

1
React belgelerine veya intelisense'e göre değil: reactjs.org/docs/uncontrolled-components.html#default-values
Alex

@Alex - (ve 2 yıl sonra buradaki herkes için), bu soru bir bileşen kitaplığı olan react-select'e gönderme yapıyordu. Bağlandığınız dokümanlar, yerel HTML seçme öğelerine referanstır.
Rashad Nasir

38

Şimdi sadece bir nesne olarak kabul sürüm 2 - Buraya için geldiyseniz v2 seçme-tepki ve hala sorun olan value,defaultValue vb

Yani, value={{value: 'one', label: 'One'}}sadece yerine kullanmayı deneyin value={'one'}.


Çok teşekkür ederim
Johnny Bigoode

eksik. buna bir değer ayarlarsanız, değeri artık değiştiremezsiniz
Toskan

@Toskan - evet, bu ReactJS ve tek yönlü veri bağlamanın ilkelerinden biridir ve sadece bu kitaplığı değil tüm form öğelerini etkiler. Kontrollü Bileşene sahip olmayı seçerseniz, değişikliği react dışında kendiniz halletmeniz gerekir. Bu cevap ondan bahsediyor ve React Belgelerine
bağlanıyor

tamam yeterince adil, peki çözümünüz hangi sorunu çözüyor? yani bir değeri zor kodlamak mı?
Toskan

Davası {value: 'one', label: 'One'}Burada verilen sadece bir örnektir. Uygulamanızda bu, aynı yapıya sahip bir değişken / destek olacaktır.
eedrah

14

Ben de benzer bir hata yaşıyordum. Seçeneklerinizin bir değer özelliğine sahip olduğundan emin olun.

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

Ardından, seçilen öğe değerini başlangıçta options değeriyle eşleştirin.

<select 
    value={this.value} />

Bunun en iyi / en zarif çözüm olduğunu düşünüyorum. Bunu düşünmekte haklı mıyım?
user2026178

Eğer böyle yaparsanız değer değişmeyecek, Değiştir fonksiyonuna da
yazacaksınız,

1
Bu, vanilya bir HTML <select> öğesi içindir, bir react-select <Select> değil, bunun içindi. Muhafaza büyük fark yaratabilir :)
Mike Goatly

6

@ İsaac-pak'ın cevabını genişleterek, bir prop içindeki bileşeninize varsayılan değeri iletmek istiyorsanız, varsayılanın ilk kez seçildiğinden emin olmak için bunu componentDidMount () yaşam döngüsü yönteminde durumunda kaydedebilirsiniz.

Not, aşağıdaki kodu daha eksiksiz hale getirmek ve yorum başına başlangıç ​​değeri olarak boş bir dize kullanmak için güncelledim.

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

Bunu anlıyorum: Uyarı: valuedestek selectboş olmamalıdır. Bileşeni veya undefinedkontrolsüz bileşenleri temizlemek için boş bir dize kullanmayı düşünün .
Jason Rice

Ben de aynısını yapıyorum ve şu uyarıyı alıyorum: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 Kodumu biraz daha eksiksiz hale getirdim ve sistemimde test ettim. Kontrollü girdi konusunda uyarı alamıyorum. Kodunuzu düzenlenmiş yanıtıma göre güncellemeyi deneyin ve bulduklarınızı geri gönderin.
Dan Meigs

2

Bunu kendim inceledim ve redüktör INIT işlevinde varsayılan değeri ayarlamayı seçtim.

Seçiminizi redux ile bağlarsanız, o zaman en iyisi gerçek değeri temsil etmeyen bir varsayılan seçim değeriyle 'bağını çözmeyin', bunun yerine nesneyi başlattığınızda değeri ayarlayın.


2

DefaultInputValue props'larını şu şekilde kullanın:

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

          

daha fazla referans için https://www.npmjs.com/package/react-select


1

Redux-form kullanmıyorsanız ve değişiklikler için yerel durumu kullanıyorsanız, react-select bileşeniniz aşağıdaki gibi görünebilir:

class MySelect extends Component {

constructor() {
    super()
}

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

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

1

Seçeneklerde grupları kullanıyorsanız derin arama yapmanız gerekir:

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

0

Seçenekleriniz böyleyse

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

Sizin {props.input.value}biriyle eşleşmesi gerektiğini 'value'de senin{props.options}

Anlamı, props.input.valueya 'one'da olmalıdır'two'


0

İn select değerini otomatik seçmek için.

görüntü açıklamasını buraya girin

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

Select etiketinde değer özelliğini kullanın

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

çözüm benim için çalışıyor.


0
  1. Yapıcıdaki varsayılan seçenek metni için bir durum özelliği oluşturun
    • Varsayılan seçenek değeri hakkında endişelenmeyin
  2. Oluşturma işlevine bir seçenek etiketi ekleyin. Yalnızca durum ve üçlü ifade kullanarak göster
  3. Bir seçenek seçildiğinde işlenecek bir işlev oluşturun
  4. Bu olay işleyici işlevindeki varsayılan seçenek değerinin durumunu null olarak değiştirin

    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

Sık sık böyle bir şey kullanıyorum.

Bu örnekteki sahne donanımlarından varsayılan değer

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> 
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.