วิธีตั้งค่าเริ่มต้นใน react-select


91

ฉันมีปัญหาในการใช้ react-select ฉันใช้แบบฟอร์ม 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>

แต่ปัญหาคือดรอปดาวน์ของฉันไม่มีค่าเริ่มต้นตามที่ฉันต้องการ ฉันทำอะไรผิด? ความคิดใด ๆ ?


ถูกต้อง: value = {props.input.value} ปัญหาที่คุณพบคืออะไร?
Ved

ปัญหาของฉันคือฉันต้องการให้การเลือกของฉันมีค่าเริ่มต้นเมื่อฉันแสดงผลครั้งแรก แต่ฉันทำไม่ได้
user7334203

1
ค่าของ props.input.value คืออะไรเมื่อแสดงครั้งแรก
Ved

นั่นคือปัญหาของฉัน จะตั้งค่าให้มีค่าเริ่มต้นได้อย่างไร?
user7334203

คุณต้องการค่าอะไร?
Ved

คำตอบ:


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
จุดในการผูกด้วย redux / react ดังนั้น ui จึงสะท้อนค่าของวัตถุตามเวลาจริง วิธีนี้แยกการผูกมัดนั้น พิจารณาการตั้งค่าเริ่มต้นในตัวลด
Joseph Juhnke

2
@JosephJuhnke ตรวจสอบคำถามก่อน เป็นวิธีการตั้งค่าเริ่มต้น
Ved

6
selectedValuevalueได้ถูกเปลี่ยนไป ตรวจสอบเอกสารreact-select.com/props
transang

11
ขณะนี้มีdefaultValueฟิลด์ในเวอร์ชันใหม่
Hongbo Miao

3
สิ่งที่ยุ่งยากคือคุณต้องตั้งค่าวัตถุที่เลือกเป็นฟิลด์ 'defaultValue' แทนที่จะเป็นค่าของตัวเลือก เช่น 0,1,2
andyCao

51

ฉันใช้พารามิเตอร์ 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 ใช้วัตถุแทนที่จะเป็นเพียงค่า
Dennis Liu

1
ไม่เป็นไปตามเอกสาร React หรือ intelisense มันไม่ได้: reactjs.org/docs/uncontrolled-components.html#default-values
Alex

@ Alex - (และสำหรับทุกคนที่นี่ในอีก 2 ปีต่อมา) คำถามนี้อ้างอิงถึง react-select ซึ่งเป็นไลบรารีคอมโพเนนต์ เอกสารที่คุณเชื่อมโยงอ้างอิงถึงองค์ประกอบ HTML Select ดั้งเดิม
Rashad Nasir

38

หากคุณมาที่นี่เพื่อตอบสนองการเลือก v2 และยังคงมีปัญหา - รุ่นที่ 2 ตอนนี้ยอมรับเฉพาะวัตถุที่เป็นvalue, defaultValueฯลฯ

นั่นคือลองใช้แทนเพียงvalue={{value: 'one', label: 'One'}}value={'one'}


ขอบคุณมาก
Johnny Bigoode

ไม่สมบูรณ์ หากคุณตั้งค่าเป็นค่านั้นคุณจะไม่สามารถเปลี่ยนมูลค่าได้อีกต่อไป
Toskan

@Toskan - ใช่นี่เป็นหนึ่งในหลักการของ ReactJS และการเชื่อมข้อมูลทางเดียวและมีผลต่อองค์ประกอบฟอร์มทั้งหมดไม่ใช่แค่ไลบรารีนี้ คุณต้องจัดการการเปลี่ยนแปลงด้วยตัวเองนอกเหนือจากการตอบสนองหากคุณเลือกที่จะมีส่วนประกอบที่ควบคุม คำตอบนี้พูดถึงเรื่องนี้และเชื่อมโยงไปยัง React Docs: stackoverflow.com/questions/42522515/…
eedrah

โอเคยุติธรรมพอแล้วคุณแก้ปัญหาอะไรได้บ้าง นั่นคือการเข้ารหัสค่ายาก?
ทศกัณฐ์

กรณีที่{value: 'one', label: 'One'}ระบุนี้เป็นเพียงตัวอย่างเท่านั้น ในแอปพลิเคชันของคุณนี่จะเป็นตัวแปร / เสาที่มีโครงสร้างเหมือนกัน
eedrah

14

ฉันพบข้อผิดพลาดที่คล้ายกัน ตรวจสอบให้แน่ใจว่าตัวเลือกของคุณมีแอตทริบิวต์ค่า

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

จากนั้นจับคู่ค่าองค์ประกอบที่เลือกในตอนแรกกับค่าตัวเลือก

<select 
    value={this.value} />

ฉันคิดว่านี่เป็นทางออกที่ดีที่สุด / สง่างามที่สุด ฉันคิดถูกหรือเปล่า
user2026178

ค่าจะไม่เปลี่ยนแปลงหากทำเช่นนั้นคุณได้เขียนฟังก์ชัน onChange ด้วยเช่นกันตั้งค่าการเปลี่ยนแปลง
raghul

1
สิ่งนี้มีไว้สำหรับองค์ประกอบ <select> HTML ของวานิลลาไม่ใช่ <Select> ตอบสนองซึ่งเป็นคำถามสำหรับ ปลอกสามารถสร้างความแตกต่างได้ :)
Mike Goatly

6

การขยายคำตอบของ @ isaac-pak หากคุณต้องการส่งผ่านค่าเริ่มต้นไปยังส่วนประกอบของคุณใน prop คุณสามารถบันทึกไว้ในสถานะในวิธีการวงจรชีวิต componentDidMount () เพื่อให้แน่ใจว่าค่าเริ่มต้นถูกเลือกในครั้งแรก

หมายเหตุฉันได้อัปเดตรหัสต่อไปนี้เพื่อให้สมบูรณ์ยิ่งขึ้นและใช้สตริงว่างเป็นค่าเริ่มต้นต่อความคิดเห็น

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

ฉันได้รับสิ่งนี้: คำเตือน: valueprop on selectไม่ควรเป็นโมฆะ พิจารณาใช้สตริงว่างเพื่อล้างส่วนประกอบหรือundefinedสำหรับส่วนประกอบที่ไม่มีการควบคุม
Jason Rice

ฉันทำเช่นเดียวกันและได้รับคำเตือนนี้: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 ฉันได้ทำให้รหัสของฉันสมบูรณ์ขึ้นเล็กน้อยและทดสอบกับระบบของฉัน ฉันไม่ได้รับคำเตือนเกี่ยวกับอินพุตที่ควบคุม ลองอัปเดตโค้ดของคุณตามคำตอบที่แก้ไขแล้วโพสต์สิ่งที่คุณพบ
Dan Meigs


2

ฉันเพิ่งทำสิ่งนี้ด้วยตัวเองและเลือกที่จะตั้งค่าเริ่มต้นที่ฟังก์ชันลด INIT

หากคุณเชื่อมโยงสิ่งที่คุณเลือกเข้ากับ redux ดังนั้นอย่าดีที่สุดที่จะ "ยกเลิกการผูก" ด้วยค่าเริ่มต้นที่เลือกซึ่งไม่ได้แสดงถึงค่าจริงให้ตั้งค่าเมื่อคุณเริ่มต้นวัตถุแทน


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. เพิ่มแท็กตัวเลือกในฟังก์ชันการแสดงผล แสดงเฉพาะโดยใช้ state และ ternary expression
  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.