প্রতিক্রিয়া-নির্বাচনের ক্ষেত্রে কীভাবে একটি ডিফল্ট মান সেট করা যায়


91

প্রতিক্রিয়া-নির্বাচন ব্যবহার করে আমার একটি সমস্যা আছে। আমি রিডেক্স ফর্মটি ব্যবহার করি এবং আমি আমার রিঅ্যাক্ট-সিলেক্ট উপাদানটি রিডুএক্স ফর্মের সাথে সামঞ্জস্যপূর্ণ করেছি। কোডটি এখানে:

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}} আপনি কি সমস্যা সম্মুখীন?
বেদ

আমার সমস্যাটি হ'ল আমি চাই যে আমার নির্বাচনটি যখন আমি প্রথমে রেন্ডার করি তখন একটি ডিফল্ট ভ্যালু থাকে তবে আমি পারি না
ব্যবহারকারী 7334203

4
প্রোপস.ইনপুট.মূল্যের মানটি কখন রেন্ডার হয়?
বেদ

এটাই আমার সমস্যা। এটি একটি ডিফল্ট মান আছে কীভাবে সেট করবেন?
ব্যবহারকারী 7334203

আপনি কি মূল্য চান?
বেদ

উত্তর:


69

আমার ধারণা আপনার এইরকম কিছু দরকার:

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
রিডুএক্স / রিএ্যাক্টের সাথে আবদ্ধ হওয়ার বিষয়টিটি তাই ইউআই রিয়েল টাইমে অবজেক্টটির মান প্রতিফলিত করে। এই পদ্ধতির যে বাধ্যতামূলক decouples। হ্রাসকারীর মধ্যে ডিফল্ট মান নির্ধারণ বিবেচনা করুন।
জোসেফ জুহনকে

4
@ জোসেফজুহনেকে প্রথমে প্রশ্নটি পরীক্ষা করুন। এটি কীভাবে ডিফল্ট মান সেট করবেন।
বেদ

6
selectedValueপরিবর্তন করা হয়েছে value। দস্তাবেজগুলি প্রতিক্রিয়া জানান
নির্বাচন

11
নেই defaultValueক্ষেত্র নতুন সংস্করণে এখন।
হংকবো মিয়াও

4
জটিল জিনিসটি হ'ল বিকল্পগুলির মানের পরিবর্তে আপনার নির্বাচিত অবজেক্টটিকে 'ডিফল্টভ্যালু' ক্ষেত্রে সেট করা দরকার। উদাহরণস্বরূপ 0,1,2
andyCao

50

আমি ডিফল্টভ্যালিউ প্যারামিটারটি ব্যবহার করেছি, নীচে কোডটি কীভাবে আমি একটি ডিফল্ট মান অর্জন করেছি এবং যখন কোনও বিকল্প ড্রপ-ডাউন থেকে নির্বাচন করা হয় তখন ডিফল্ট মান আপডেট করে update

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

8
ধন্যবাদ, এখন আমি জানি যে ডিফল্টভ্যালু কেবলমাত্র মানটির পরিবর্তে অবজেক্টটি গ্রহণ করে।
ডেনিস লিউ

4
রিঅ্যাক্ট ডক্স বা ইন্টিলেসেন্স অনুসারে নয় এটি হয় না: reactjs.org/docs/uncontrolled-components.html#default-values
অ্যালেক্স

@ অ্যালেক্স - (এবং এখানে 2 বছর পরে এখানে কারও জন্য), এই প্রশ্নটি একটি উপাদান লাইব্রেরি, প্রতিক্রিয়া-নির্বাচন প্রসঙ্গে ছিল। আপনি যে ডক্স সংযুক্ত করেছেন সেগুলি দেশীয় এইচটিএমএল নির্বাচনের উপাদানগুলির সাথে সম্পর্কিত।
রাশাদ নাসির

38

আপনি এখানে আসতে থাকেন তাহলে প্রতিক্রিয়া-নির্বাচন v2, এবং তবুও আপনার সমস্যা - সংস্করণ 2 এখন শুধুমাত্র একটি অবজেক্ট হিসেবে গ্রহণ করে value, defaultValueইত্যাদি

এটি হ'ল ন্যায়বিচারের value={{value: 'one', label: 'One'}}পরিবর্তে ব্যবহার করার চেষ্টা করুন value={'one'}


আপনাকে অনেক ধন্যবাদ
জনি বিগুড

অসম্পূর্ণ যদি আপনি এটির জন্য মান সেট করেন, আপনি আর মূল্যবানিকে পরিবর্তন করতে পারবেন না
তোসকান

@ তোসকান - হ্যাঁ, এটি রিঅ্যাকটিজেএস এবং একমুখী ডেটা বাঁধাইয়ের অন্যতম মূলনীতি এবং এটি কেবল এই গ্রন্থাগারকেই নয় সমস্ত ফর্মের উপাদানগুলিকে প্রভাবিত করে। আপনি যদি নিয়ন্ত্রিত উপাদান চয়ন করেন তবে আপনাকে প্রতিক্রিয়ার বাইরে নিজেকে পরিবর্তন করতে হবে। মাধ্যমে এটি এবং লিঙ্ক সম্পর্কে এই উত্তরটি আলোচনা প্রতিক্রিয়া দস্তাবেজ: stackoverflow.com/questions/42522515/...
eedrah

ঠিক আছে যথেষ্ট ন্যায্য, সুতরাং আপনি কোন সমস্যার সমাধান করবেন? যে, হার্ড কোডিং একটি মান?
তোসকান

{value: 'one', label: 'One'}এখানে দেওয়া ক্ষেত্রে নিছক একটি উদাহরণ। আপনার প্রয়োগে এটি একটি অভিন্ন কাঠামো সহ একটি পরিবর্তনশীল / প্রপ হবে।
এড্রাহ

14

আমারও তেমন ত্রুটি হয়েছিল। আপনার বিকল্পগুলির একটি মান বৈশিষ্ট্য রয়েছে তা নিশ্চিত করুন।

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

তারপরে প্রাথমিকভাবে নির্বাচিত উপাদান মানের সাথে বিকল্পগুলির মানটি মিলান match

<select 
    value={this.value} />

আমি মনে করি এটি সেরা / সবচেয়ে মার্জিত সমাধান। আমি কি ভেবে সঠিক?
ব্যবহারকারী 2026178

মান যদি বদলাবে না তবে তা বদলে যাবে, আপনি onChange ফাংশনটিও পরিবর্তন সেট করে
লিখেছেন

4
এটি একটি ভ্যানিলা এইচটিএমএল <সিলেক্ট> উপাদানটির জন্য, একটি প্রতিক্রিয়া-নির্বাচন <নির্বাচন> না, যা প্রশ্নটি ছিল তার জন্য। কেসিং সমস্ত পার্থক্য আনতে পারে :)
মাইক গোটলি

6

@ 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).
পাচ্ছি

@ অ্যালেক্সভেনচুরা আমি আমার কোডটি কিছুটা আরও সম্পূর্ণ তৈরি করেছি এবং এটি আমার সিস্টেমে পরীক্ষা করেছি। নিয়ন্ত্রিত ইনপুট সম্পর্কে আমি সতর্কতা পাই না। আমার সম্পাদিত প্রতিক্রিয়ার উপর ভিত্তি করে আপনার কোড আপডেট করার চেষ্টা করুন এবং আপনি যা খুঁজে পান তা ফিরে পোস্ট করুন।
ড্যান মিগস


2

আমি কেবল এটি নিজেই পেরেছি এবং হ্রাসকারী আইএনআইটি ফাংশনে ডিফল্ট মান সেট করতে বেছে নিয়েছি।

আপনি যদি সিডিকে রেডেক্সের সাথে বেঁধে রাখেন তবে সেরা ডিফল্ট মান নির্বাচন না করে এটি 'ডি-বাইন্ড' না করে প্রকৃত মানকে উপস্থাপন করে না, পরিবর্তে যখন আপনি বস্তুর সূচনা করবেন তখন মানটি সেট করুন।


1

আপনি যদি রিডেক্স-ফর্ম ব্যবহার করছেন না এবং আপনি পরিবর্তনের জন্য স্থানীয় রাষ্ট্র ব্যবহার করছেন তবে আপনার প্রতিক্রিয়া-বাছাই উপাদানটি দেখতে এইরকম হতে পারে:

class MySelect extends Component {

constructor() {
    super()
}

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

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

1

আপনি বিকল্পগুলিতে গোষ্ঠীগুলি ব্যবহার করেন তবে আপনাকে গভীর অনুসন্ধান করতে হবে:

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

আপনার বিকল্পগুলি যদি এটির মতো হয়

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> 
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.