Cách đặt giá trị mặc định trong chọn phản ứng


88

Tôi gặp sự cố khi sử dụng react-select. Tôi sử dụng biểu mẫu redux và tôi đã làm cho thành phần chọn phản ứng của mình tương thích với biểu mẫu redux. Đây là mã:

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

và đây là cách tôi kết xuất nó:

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

Nhưng vấn đề là trình đơn thả xuống của tôi không có giá trị mặc định như tôi muốn. Tôi đang làm gì sai? Có ý kiến ​​gì không?


điều này đúng: value = {props.input.value}. vấn đề bạn gặp phải là gì?
Ved

Vấn đề của tôi là tôi muốn tôi chọn để có một defaultValue khi tôi lần đầu tiên làm cho nó, nhưng tôi không thể
user7334203

1
giá trị của props.input.value là bao nhiêu khi nó hiển thị đầu tiên?
Ved

Đó là vấn đề của tôi. Làm cách nào để đặt nó có giá trị mặc định?
user7334203 19/04

bạn muốn giá trị nào?
Ved

Câu trả lời:


62

Tôi đoán bạn cần một cái gì đó như thế này:

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
Điểm liên kết với redux / react là ui phản ánh giá trị của đối tượng trong thời gian thực. cách tiếp cận này tách rời ràng buộc đó. Xem xét đặt giá trị mặc định trong bộ giảm tốc.
Joseph Juhnke

2
@JosephJuhnke hãy kiểm tra câu hỏi trước. Đó là cách đặt giá trị mặc định.
Ved

5
selectedValueđã được đổi thành value. Kiểm tra docs react-select.com/props
transang

10
Hiện có defaultValuetrường trong phiên bản mới.
Hongbo Miao,

3
điều khó khăn là bạn cần đặt đối tượng đã chọn thành trường 'defaultValue', thay vì giá trị của các tùy chọn. ví dụ: 0,1,2
andyCao

47

Tôi đã sử dụng tham số defaultValue, dưới đây là mã cách tôi đạt được giá trị mặc định cũng như cập nhật giá trị mặc định khi một tùy chọn được chọn từ trình đơn thả xuống.

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

8
Cảm ơn, bây giờ tôi biết rằng defaultValue lấy đối tượng thay vì chỉ giá trị.
Dennis Liu

1
Theo tài liệu React hoặc intelisense thì không: reactjs.org/docs/uncontrolled-components.html#default-values
Alex

38

Nếu bạn đã đến đây để tham gia react-select v2 và vẫn gặp sự cố - phiên bản 2 hiện chỉ chấp nhận một đối tượng là value,defaultValue vv

Đó là, hãy thử sử dụng value={{value: 'one', label: 'One'}}, thay vì chỉ value={'one'}.


Cảm ơn bạn rất nhiều
Johnny Bigoode

chưa hoàn thiện. nếu bạn đặt giá trị đó, bạn không thể thay đổi valuie nữa
Toskan

@Toskan - vâng, đây là một trong những nguyên tắc của ReactJS và liên kết dữ liệu một chiều, và ảnh hưởng đến tất cả các phần tử biểu mẫu không chỉ thư viện này. Bạn cần tự mình xử lý thay đổi bên ngoài phản ứng nếu bạn chọn có Thành phần được kiểm soát. Câu trả lời này nói về nó và liên kết đến Tài liệu phản ứng: stackoverflow.com/questions/42522515/…
eedrah

ok, đủ công bằng, vậy giải pháp của bạn giải quyết vấn đề gì? đó là, khó mã hóa một giá trị?
Toskan

Trường hợp {value: 'one', label: 'One'}được đưa ra ở đây chỉ là một ví dụ. Trong ứng dụng của bạn, đây sẽ là một biến / prop có cấu trúc giống hệt nhau.
eedrah

13

Tôi đã gặp một lỗi tương tự. Đảm bảo rằng các tùy chọn của bạn có thuộc tính giá trị.

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

Sau đó, so khớp giá trị phần tử được chọn ban đầu với giá trị tùy chọn.

<select 
    value={this.value} />

Tôi nghĩ đây là giải pháp tốt nhất / thanh lịch nhất. Tôi có đúng khi nghĩ như vậy không?
user2026178 14/08/17

giá trị sẽ không thay đổi nếu làm như vậy, bạn đã viết hàm onChange quá thiết lập thay đổi
raghul

1
Đây là phần tử <select> HTML vani, không phải phần tử react-select <Select>, đây là câu hỏi được đặt ra. Vỏ bọc có thể tạo ra tất cả sự khác biệt :)
Mike Goaries

5

Mở rộng câu trả lời của @ isaac-pak, nếu bạn muốn chuyển giá trị mặc định cho thành phần của mình trong một phần mềm hỗ trợ, bạn có thể lưu nó ở trạng thái trong phương thức vòng đời componentDidMount () để đảm bảo giá trị mặc định được chọn lần đầu tiên.

Lưu ý, tôi đã cập nhật mã sau để làm cho nó hoàn thiện hơn và sử dụng một chuỗi trống làm giá trị ban đầu cho mỗi nhận xét.

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

Tôi nhận được điều này: Cảnh báo: valueprop on selectkhông được rỗng. Cân nhắc sử dụng một chuỗi trống để xóa thành phần hoặc undefinedcho các thành phần không được kiểm soát.
Jason Rice

Tôi đang làm cùng và tôi nhận được cảnh báo này: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 Tôi đã làm cho mã của mình hoàn thiện hơn một chút và đã thử nghiệm nó trên hệ thống của mình. Tôi không nhận được cảnh báo về đầu vào được kiểm soát. Hãy thử cập nhật mã của bạn dựa trên phản hồi đã chỉnh sửa của tôi và đăng lại những gì bạn tìm thấy.
Dan Meigs

2

Tôi chỉ tự mình trải qua điều này và chọn đặt giá trị mặc định tại hàm INIT của bộ giảm tốc.

Nếu bạn ràng buộc lựa chọn của mình với redux thì tốt nhất không nên 'hủy ràng buộc' nó bằng một giá trị mặc định được chọn không đại diện cho giá trị thực, thay vào đó hãy đặt giá trị khi bạn khởi tạo đối tượng.


1

Nếu bạn không sử dụng redux-form và bạn đang sử dụng trạng thái cục bộ cho các thay đổi thì thành phần react-select của bạn có thể trông giống như sau:

class MySelect extends Component {

constructor() {
    super()
}

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

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

1

Sử dụng các đạo cụ defaultInputValue như sau:

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

          

để tham khảo thêm https://www.npmjs.com/package/react-select


1

Bạn cần thực hiện tìm kiếm sâu nếu sử dụng các nhóm trong các tùy chọn:

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

Nếu tùy chọn của bạn như thế này

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

Của bạn {props.input.value}phải khớp với một 'value'trong những{props.options}

Có nghĩa là, props.input.valuephải là 'one'hoặc'two'


0

Để tự động chọn giá trị trong phần chọn.

nhập mô tả hình ảnh ở đây

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

Sử dụng thuộc tính giá trị trong thẻ chọn

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

giải pháp đang làm việc cho tôi.


0
  1. Tạo thuộc tính trạng thái cho văn bản tùy chọn mặc định trong hàm tạo
    • Đừng lo lắng về giá trị tùy chọn mặc định
  2. Thêm thẻ tùy chọn vào chức năng kết xuất. Chỉ hiển thị bằng cách sử dụng biểu thức trạng thái và bậc ba
  3. Tạo một hàm để xử lý khi một tùy chọn được chọn
  4. Thay đổi trạng thái của giá trị tùy chọn mặc định trong hàm xử lý sự kiện này thành 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

Tôi thường xuyên sử dụng một cái gì đó như thế này.

Giá trị mặc định từ các đạo cụ trong ví dụ này

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> 
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.