2015-08-26 10 views
10

Sto utilizzando react-bootstrap-validation che decora il tag di input reacst-bootstrap.Convalida Bootstrap La convalida utilizza l'input convalidato nel componente secondario

ValidatedInput richiede che si trovi all'interno di un componente Form. Quando aggiungo il mio ValidatedInput a un componente secondario personalizzato, ricevo un errore che dice che deve essere all'interno di un modulo che è, ma suppongo che ora sia più in basso nell'albero quindi non può vedere il modulo.

C'è un modo per fare riferimento al Form padre in modo che ValidatedInput possa vedere il genitore.

Guardando all'origine della libreria di validazione, posso vedere che ValidationInput deve registrarsi al modulo ma non sono sicuro di come farlo dal componente secondario.

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

sguardo al commissario per ottenere un indizio a come reagisci sta analizzando i tuoi componenti. Questo dovrebbe darti un inizio. –

risposta

2

Sa @ Ваня Решетников detto sopra è impossibile farlo ora a causa delle limitazioni del design attuale. Una soluzione per cui sono andato è questa.

  1. Converti sottocomponente di pianura oggetto JS

    TitleSelect = { 
        // move prop types to parent 
        renderTitleSelect(){ 
        ... 
        } 
    } 
    
  2. Aggiungi nuovo oggetto come mixin per genitore e rendere una funzione

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

Grazie, ho sentito che i mixins saranno rimossi in qualche punto quindi non voglio andare giù per quella via. Penso che semplicemente trasferirò i miei input dai componenti secondari finché non avremo il contesto introdotto. – Will

+0

Non riesco a vedere una menzione dei mixin rimossi ovunque (sarebbe strano essere onesti perché tale meccanismo è necessario) e passare ai contesti potrebbe richiedere un tempo mooolto –

+0

Leggi questo articolo a riguardo https://medium.com/ @ dan_abramov/mixins-are-dead-long-live-higher-order-components-94a0d2f9e750 l'autore lo ha anche menzionato nel suo discorso a Reagire in Europa. Penso che potrei non usare i componenti secondari fino a quando non riusciamo a ottenere il contesto ordinato. – Will

3

Al momento questo è impossibile da fare. Sarà possibile in una versione futura una volta che avremo adeguati contesti basati sui genitori in risposta e migrerò il componente in contesti. Ma per ora consiglierei di dividere il tuo metodo render() in un paio di quelli più piccoli e riutilizzarli.

+0

Qualche progresso su "migrare componenti in contesti"? Nel frattempo, potresti illustrare la tua raccomandazione con un esempio di codice? Non riesco davvero a capire come risolvere il problema "splitting' render() '" – GreenAsJade

+0

Attualmente non c'è ETA su quella funzione, mi dispiace. Per quanto riguarda la divisione del metodo 'render()', considera il seguente esempio: https://github.com/react-bootstrap/react-bootstrap/blob/master/src/InputBase.js#L184-L207 –

Problemi correlati