प्रतिक्रिया-चयन में डिफ़ॉल्ट मान कैसे सेट करें


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>

लेकिन समस्या यह है कि मेरी इच्छा के अनुसार मेरे ड्रॉपडाउन का डिफ़ॉल्ट मूल्य नहीं है। मैं क्या गलत कर रहा हूँ? कोई विचार?


यह सही है: मान = {props.input.value}। आप किस समस्या का सामना कर रहे हैं?
वेद

मेरा मुद्दा यह है कि मैं चाहता हूं कि मेरा चयन
डिफ़ॉल्टवैल्यू

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 / प्रतिक्रिया के साथ बंधन में बिंदु इसलिए है कि ui वास्तविक समय में वस्तु के मूल्य को दर्शाता है। यह दृष्टिकोण बाध्यकारी है कि decouples। Reducer में डिफ़ॉल्ट मान सेट करने पर विचार करें।
जोसेफ जुहानेके

2
@JosephJuhnke पहले प्रश्न की जाँच करें। यह डिफ़ॉल्ट मान सेट करने का तरीका है।
वेद

5
selectedValueको बदल दिया गया था value। डॉक्स प्रतिक्रिया की
स्थानांतरित करें

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
रिएक्ट डॉक्स या इंटेलिजेंस के अनुसार यह नहीं है: reactjs.org/docs/uncontrolled-compenders.html#default-values
Alex

38

आप यहाँ आए हैं प्रतिक्रिया का चयन वी 2, और अभी भी समस्या आ - संस्करण 2 अब केवल एक वस्तु के रूप में स्वीकार करता value, defaultValueआदि

यही है, value={{value: 'one', label: 'One'}}बस के बजाय, का उपयोग करने का प्रयास करें value={'one'}


बहुत बहुत धन्यवाद
जॉनी बिगोडे

अधूरा। यदि आप इसका मूल्य निर्धारित करते हैं, तो आप किसी भी लंबे समय तक वैल्यू नहीं बदल सकते हैं
तोस्कन

@ टोसकन - हाँ, यह रिएक्टजस के सिद्धांतों और एक तरह से डेटा बाइंडिंग में से एक है, और इस लाइब्रेरी को नहीं बल्कि सभी फॉर्म एलिमेंट्स को प्रभावित करता है। यदि आप एक नियंत्रित घटक के लिए चुनते हैं तो आपको प्रतिक्रिया के बाहर खुद को बदलने की आवश्यकता है। यह उत्तर इसके बारे में बात करता है और रिएक्ट डॉक्स के माध्यम से लिंक करता है: stackoverflow.com/questions/42522515/…
eedrah

ठीक है पर्याप्त, तो आप किस समस्या का समाधान करते हैं? वह है, हार्ड कोडिंग एक मूल्य?
तोस्कान

{value: 'one', label: 'One'}यहां दिया गया मामला केवल एक उदाहरण है। आपके आवेदन में यह एक समान संरचना के साथ एक चर / प्रोप होगा।
ईदराह

13

मुझे एक समान त्रुटि हो रही थी। सुनिश्चित करें कि आपके विकल्पों में एक मूल्य विशेषता है।

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

फिर विकल्प मूल्य के लिए शुरू में चयन तत्व मूल्य से मेल खाता है।

<select 
    value={this.value} />

मुझे लगता है कि यह सबसे अच्छा / सबसे सुरुचिपूर्ण समाधान है। क्या मैं यह सोचने में सही हूँ?
user2026178 19

मान में परिवर्तन नहीं होगा यदि आप ऐसा करते हैं, तो आपके पास
onChange

1
यह एक वेनिला HTML <select> एलीमेंट के लिए है, न कि रिएक्शन-सिलेक्ट <Select>, जो वह था जो प्रश्न था। आवरण सभी अंतर कर सकते हैं :)
माइक गोआली

5

@ Isaac-pak के उत्तर पर विस्तार करते हुए, यदि आप किसी प्रोप में अपने घटक के लिए डिफ़ॉल्ट मान को पास करना चाहते हैं, तो आप घटक को पहली बार चयनित करने के लिए इसे घटकडायमाउंट () जीवनचक्र विधि में स्थिति में सहेज सकते हैं।

ध्यान दें, मैंने इसे अधिक पूर्ण बनाने के लिए और टिप्पणी के अनुसार प्रारंभिक मूल्य के रूप में एक रिक्त स्ट्रिंग का उपयोग करने के लिए निम्नलिखित कोड अपडेट किया है।

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

मुझे यह मिलता है: चेतावनी: valueप्रस्ताव को 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).
एलेक्सवेंटुरायो

@AlexVentura मैंने अपना कोड थोड़ा और पूरा कर लिया है और अपने सिस्टम पर इसका परीक्षण किया है। मुझे नियंत्रित इनपुट के बारे में चेतावनी नहीं मिली है। मेरी संपादित प्रतिक्रिया के आधार पर अपने कोड को अपडेट करने का प्रयास करें और जो भी आपको मिले उसे वापस पोस्ट करें।
दान मीग्स

2

मैं बस खुद इस माध्यम से गया और reducer INIT फ़ंक्शन में डिफ़ॉल्ट मान सेट करने के लिए चुना।

यदि आप अपने चयन को redux से बाँधते हैं, तो इसे सर्वश्रेष्ठ डिफ़ॉल्ट मान के साथ 'de-bind' न करें, जो वास्तविक मान का प्रतिनिधित्व नहीं करता है, इसके बजाय जब आप ऑब्जेक्ट को इनिशियलाइज़ करते हैं तो मान सेट करें।


1

यदि आप redux-form का उपयोग नहीं कर रहे हैं और आप परिवर्तनों के लिए स्थानीय स्थिति का उपयोग कर रहे हैं, तो आपका प्रतिक्रिया-चयन घटक इस तरह दिख सकता है:

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

सेलेक्ट की वैल्यू को ऑटो सेलेक्ट करें।

यहां छवि विवरण दर्ज करें

<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={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 Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.