2016-05-17 16 views
5

Se si dispone solo di un modulo di base, dovrei ancora this.refs o semplicemente andare con document.getElementById?reactjs this.refs vs document.getElementById

In base intendo qualcosa di simile:

export default class ForgetPasswordComponent extends React.Component { 
    constructor(props) { 
    super(props); 

    this.handleSendEmail = this.handleSendEmail.bind(this); 
    } 

    handleSendEmail(e) { 
    e.preventDefault(); 

    // this.refs.email.value 
    // document.getElementById('email').value 
    } 

    render() { 
    <form onSubmit={this.handleSendEmail}> 
     <input id="email" ref="email" type="text" /> 
     <input type="submit" /> 
    </form> 
    } 
} 

C'è un rovescio della medaglia in utilizzando uno sopra l'altro?

+0

Se si dispone di più istanze di ForgetPasswordComponent in una singola pagina o se si dispone di altri elementi con l''e-mail' id, è possibile che venga selezionato l'elemento errato. – Isuru

+0

Se considero gli ID il più unici possibile (dato che l'id dovrebbe essere univoco in html) dovrei comunque andare a fare riferimento a refs o id? C'è un lato negativo nell'usare i ref? – index

+0

correlati: http://stackoverflow.com/questions/38093760/in-react-js-is-there-any-function-similar-like-document-getelementbyid-in-ja –

risposta

7

In generale, refs è migliore di document.getElementById, perché è più in linea con il resto del codice di risposta.

In risposta, ogni classe di componente può avere più istanze di componenti.
E come @Isuru sottolinea nei commenti: l'utilizzo di id è pericoloso, perché reagire non impedisce di avere più moduli su 1 pagina, e quindi il DOM contiene più input con lo stesso ID. E questo non è permesso.

Un altro vantaggio dell'utilizzo di refs è che, in base alla progettazione, è possibile accedere agli refs solo nel contesto in cui viene definito. Questo ti costringe a usare oggetti di scena e stato (e possibilmente negozi) se hai bisogno di accedere a informazioni al di fuori di questo contesto.
E questo è un vantaggio, perché ci sono meno/nessuna possibilità di rompere il flusso di dati unidirezionale, il che renderebbe il tuo codice meno gestibile.

NB: in quasi tutti i casi, i ref possono essere evitati del tutto. È un principio di progettazione per Netflix utilizzare senza riferimenti, sempre, come spiegato da Steve McGuire (Senior User Interface Engineer presso Netflix) in this video from reactjs conf 2016 (9: 58m nel video).
Nel tuo caso, ciò significherebbe inserire il valore di input della posta elettronica nello stato del modulo, aggiungere onchange handler e utilizzare il valore di stato nell'evento di invio.

+0

+1 per aver menzionato che nella maggior parte dei casi non è necessario utilizzare uno di essi, ma utilizzare value + onChange (o LinkedStateMixin). –

+0

Ho letto sull'uso dello stato e sono solo un po 'titubante ad usarlo a causa di molte implementazioni come l'aggiunta di 'value',' onchangevalue', 'state' e quando ci sono molti campi nel modulo inizieresti ad avere molti di quelli. Hehe. Quindi è davvero preferibile usare value + state + onchange? – index

+0

Sì, è preferibile rispetto ai ref. I Refs sono una scorciatoia e probabilmente ti metteranno in un incubo di debugging con la crescita della tua app. – wintvelt

Problemi correlati