2015-08-26 18 views
10

Tôi đang sử dụng react-bootstrap-validation để trang trí thẻ đầu vào phản ứng-bootstrap.React Bootstrap Validation sử dụng đầu vào được xác thực trong thành phần phụ

ValidatedInput yêu cầu rằng nó nằm bên trong thành phần Biểu mẫu. Khi tôi thêm ValidatedInput vào một thành phần phụ tùy chỉnh, tôi nhận được một lỗi nói rằng nó cần phải ở bên trong một Form mà nó đang có, nhưng tôi đoán nó là tiếp tục xuống cây ngay bây giờ để không thể nhìn thấy Form.

Có cách nào tham chiếu Biểu mẫu gốc để ValidatedInput có thể nhìn thấy cha mẹ hay không.

Nhìn vào nguồn của lib Xác thực, tôi có thể thấy rằng ValidationInput cần đăng ký Biểu mẫu nhưng không chắc chắn cách thực hiện điều này từ thành phần phụ.

// Parent render 
 
render(){ 
 
    <Form 
 
    className="fl-form fl-form-inline fl-form-large" 
 
    name="customer-details" 
 
    onValidSubmit={this._handleValidSubmit} 
 
    onInvalidSubmit={this._handleInvalidSubmit} 
 
    validationEvent='onChange'> 
 
    
 
    <TitleSelect handleChange={this.updateDropDown} value={this.state.form.title} /> 
 
     
 
    </form> 
 
} 
 

 

 
// Sub class containing the ValidatedInput 
 
export class TitleSelect extends React.Component { 
 

 
    static propTypes = { 
 
     handleChange: React.PropTypes.func.isRequired, 
 
     value: React.PropTypes.string.isRequired 
 
    } 
 

 
    render(){ 
 

 
     return (
 
      <ValidatedInput 
 
      name="title" 
 
      label='title' 
 
      type='select' 
 
      value={this.props.value} 
 
      onChange={this.props.handleChange} 
 
      groupClassName='form-group input-title' 
 
      wrapperClassName='fl-input-wrapper' 
 
      validate='required' 
 
      errorHelp={{ 
 
       required: 'Please select a title.' 
 
      }}> 
 

 
      <option value="" ></option> 
 
      <option value="Mr">Mr</option> 
 
      <option value="Mrs">Mrs</option> 
 
      <option value="Master">Mstr.</option> 
 
      <option value="Ms">Ms</option> 
 
      <option value="Miss">Miss</option> 
 
      <option value="Reverend">Rev.</option> 
 
      <option value="Doctor">Dr.</option> 
 
      <option value="Professor">Prof.</option> 
 
      <option value="Lord">Lord</option> 
 
      <option value="Lady">Lady</option> 
 
      <option value="Sir">Sir</option> 
 
      <option value="Master">Mstr.</option> 
 
      <option value="Miss">Miss</option> 
 
      </ValidatedInput> 
 
     ) 
 
    } 
 
};

+0

Nhìn vào thanh tra để có được một đầu mối như cách phản ứng phân tích các thành phần của bạn. Điều đó sẽ cho bạn một sự khởi đầu. –

Trả lời

2

Sa @ Ваня Решетников đã nói ở trên không thể làm điều đó ngay bây giờ do giới hạn của thiết kế hiện tại. Một giải pháp tôi đã đi là điều này.

  1. Chuyển đổi tiểu hợp phần cho đối tượng JS đồng bằng

    TitleSelect = { 
        // move prop types to parent 
        renderTitleSelect(){ 
        ... 
        } 
    } 
    
  2. Thêm đối tượng mới như một mixin để cha mẹ và đưa ra một hàm

    mixins: [TitleSelect], 
    ... 
    render() { 
        <Form ...> 
        // parentheses are important! 
        {this.renderTitleSelect()} 
        </Form> 
    } 
    
+0

Cảm ơn, tôi đã nghe điều đó mixins sẽ được loại bỏ tại một số điểm vì vậy không muốn đi xuống con đường đó. Hãy suy nghĩ tôi sẽ chỉ di chuyển đầu vào của tôi ra khỏi các thành phần phụ cho đến khi chúng ta có thể nhận được bối cảnh giới thiệu. – Will

+0

Tôi không thể nhìn thấy một đề cập đến mixins được loại bỏ bất cứ nơi nào (đó sẽ là lạ để trung thực vì cơ chế đó là cần thiết) và chuyển sang bối cảnh có thể mất một thời gian loooong –

+0

Đọc bài viết này về nó https://medium.com/ @ dan_abramov/mixins-là-chết-dài-sống-cao-trật tự-linh kiện-94a0d2f9e750 tác giả cũng đã đề cập đến nó trong cuộc nói chuyện của mình tại phản ứng châu Âu. Hãy nghĩ rằng tôi có thể không sử dụng các thành phần phụ cho đến khi chúng ta có thể sắp xếp ngữ cảnh. – Will

3

Tại thời điểm này là không thể làm. Nó sẽ có thể trong một bản phát hành trong tương lai khi chúng ta nhận được bối cảnh thích hợp dựa trên cha mẹ trong phản ứng và tôi sẽ di chuyển thành phần này đến các ngữ cảnh. Nhưng bây giờ tôi khuyên bạn nên tách phương thức render() của bạn thành một vài phương thức nhỏ hơn và tái sử dụng chúng.

+0

Bất kỳ tiến trình nào về "chuyển đổi thành phần thành ngữ cảnh"? Trong thời gian đó, bạn có thể minh họa đề xuất của mình bằng ví dụ mã không? Tôi không thể hiểu được cách giải quyết vấn đề bằng cách "tách' render() '" – GreenAsJade

+0

Hiện tại không có ETA trên tính năng đó, xin lỗi. Để tách phương thức 'render()', hãy xem xét ví dụ sau: https://github.com/react-bootstrap/react-bootstrap/blob/master/src/InputBase.js#L184-L207 –

Các vấn đề liên quan