2015-09-10 6 views
6

ho notato che ho potuto utilizzare variabili private come questo:C'è un buon modo per utilizzare variabili e metodi privati ​​in React.js

var Hello = React.createClass(new (function(){ 

    var name; 

    this.getInitialState = function() { 
     name = "Sir " + this.props.name; 
     return null; 
    }; 

    this.render = function() { 
     return <div>Hello {name}</div>; 
    }; 
})()); 

React.render(<Hello name="World" />, document.getElementById('container')); 

Perché non dovremmo farlo?

Grazie per tutto l'aiuto

risposta

2

Io non credo che ci sia qualcosa di sbagliato con esso. La sintassi è un po 'funky, ma è un trucco intelligente.

Vorrei mettere in discussione la necessità di una variabile veramente privata. Posso solo pensare a due motivi per cui qualcuno potrebbe volerne uno, ma entrambi possono essere smentiti.

1) Si crea una libreria da consumare da altri ... Se qualcuno sta cercando all'interno del codice della biblioteca dove non dovrebbero essere, il loro o rompe la propria esperienza o aggira bug che ha trovato in il tuo codice. In ogni caso, nessun danno a te o agli altri. Caso peggiore, rompono la loro app. Le variabili private mi hanno lasciato davvero un brutto sapore in bocca. L'apertura di JavaScript è una boccata d'aria fresca IMO.

2) Si desidera nascondere i dati privati ​​all'interno della propria app ... Con i browser moderni, qualsiasi cosa in JavaScript può essere ispezionata e modificata in fase di esecuzione. È impossibile nascondere i dati dagli utenti in JavaScript. Puoi solo rendere le cose difficili da trovare.

So che questa alternativa non è veramente privata, ma l'utilizzo è lo stesso. Dal momento che non sono un grande fan di lottare duramente per rendere le cose private, lo includerò comunque. ; G)

var Hello = React.createClass({ 

    name: null, 

    getInitialState: function() { 
     this.name = "Sir " + this.props.name; 
     return null; 
    }, 

    render: function() { 
     return <div>Hello {this.name}</div>; 
    }; 
}); 

React.render(<Hello name="World" />, document.getElementById('container')); 
+2

Beh, io sono un grande fan delle variabili private, perché qualcuno della mia squadra può provare a utilizzare la variabile per errore e impiegare ore per scoprire che non è stato ipotizzato di essere utilizzato. A volte, se viene utilizzato, il software diventa più lento o un bug impercettibile. In altri linguaggi come Java o C# è molto comune usare variabili private, in realtà io uso più variabili private che variabili pubbliche. – melanke

+0

Capisco. Scrivo molto Java. Tuttavia, non è solo il modo in cui le cose vengono tipicamente fatte in JS. La maggior parte delle volte non mi interessa il funzionamento interno di una biblioteca. Comunque nel raro caso che mi interessi, sto cercando di deridere una libreria mal progettata e le variabili private/anon funzioni mi impediscono di scrivere un buon test unitario o semplicemente di aggirare un bug ... IMO, è come usare metodi "finali" in Java (che nella maggior parte dei framework non sono bloccabili) ... Se ritieni di aver bisogno di dati privati ​​per proteggerti dagli sviluppatori, guarderei i tuoi sviluppatori o la tua libreria, non i principi di codifica. –

2

Se si utilizza ES7, è possibile definire le proprietà di classe come variabili private come questo:

class Hello extends React.Component { 
    name = 'Jack'; 
    render() { 
    return (
     <div> 
     {this.name} 
     </div> 
    ); 
    } 
} 
export default Hello; 

Assicurarsi di utilizzare babel per compilare il codice con stage 0

+0

Sto usando Babel da ieri, ma non è "nome" pubblico? – melanke

+0

@melanke Babel lo compila a 'this.name', [compile online] (http://babeljs.io/repl/#?experimental=true&evaluate=true&loose=false&spec=false&code=class%20Hello%20extends%20React.Component% 20% 7B% 0A% 20% 20% 20name% 3D% 20'Jack '% 3B% 0A% 20% 20render()% 20% 7B% 0A% 20% 20% 20% 20return% 20 (% 0A% 20% 20% 20% 20% 20% 20% 3Cdiv% 3E% 0A% 20% 20% 20% 20% 20% 20% 20% 20% 7Bthis.name% 7D% 0A% 20% 20% 20% 20% 20% 20% 3C% 2Fdiv% 3E% 0A% 20% 20% 20% 20)% 3B% 0A% 20% 20% 7D% 0A% 7D% 0Aexport% 20default% 20Hello% 3B), quindi hai ragione, è un pubblico variabile – xcatliu

+0

Questo sarà ancora pubblico. TypeScript aggiunge accessor, quindi puoi fare 'private name: string =" Jack ";' ma AFAIK, che non è supportato da ES7 in alcun modo. –

1

Le private vars sono perfette quando hai bisogno di informazioni di stato locali (private) per un componente che NON cambia o si riferisce al rendering direttamente. Tenete a mente, molte cose cambiano il rendering, quindi ho scoperto che uso raramente i private vars.

Inoltre, tieni presente che quando aggiungi una variabile alla classe nel modo in cui hai fatto, è un singleton che verrà condiviso con tutte le istanze di quel componente. Questo può portare a problemi se vuole veramente qualcosa di privato per ogni istanza - se è ciò che si vuole, allora avete bisogno di dichiararlo in uno dei metodi del ciclo di vita per la componente forse come questo

componentDidMount() { 
    this.name = 'hello'; 
}, 
Problemi correlati