Je souhaite sélectionner certaines barres dans 3 bars dans react.js comment le faire?
C'est mon code:
var Progressbar = React.createClass({ getInitialState: function() { return {completed:this.props.completed}; }, addPrecent: function(value){ this.props.completed+=value; this.setState({completed:this.props.completed}); }, render: function() { var completed = this.props.completed; if (completed < 0) {completed = 0}; return (...); }
Je veux utiliser ce compoment de réaction:
var App = React.createClass({ getInitialState: function() { return {baction: 'Progress1'}; }, handleChange: function(e){ var value = e.target.value; console.log(value); this.setState({baction:value}); }, handleClick10:function(e){ console.log('You clicked: ', this.state.baction ); document.getElementById(this.state.baction).addPrecent(10); }, render: function() { return ( <div class="center">Progress Bars Demo <Progressbar completed={25} id="Progress1"/> <h2 class="center"></h2> <Progressbar completed={50} id="Progress2"/> <h2 class="center"></h2> <Progressbar completed={75} id="Progress3"/> <h2 class="center"></h2> <span> <select name='selectbar' id='selectbar' value={this.state.baction} onChange={this.handleChange}> <option value="Progress1">#Progress1</option> <option value="Progress2">#Progress2</option> <option value="Progress3">#Progress3</option> </select> <input type="button" onClick={this.handleClick10} value="+10"/> <button>+25</button> <button>-10</button> <button>-25</button> </span> </div> ) } });
Je souhaite exécuter la fonction handleClick10 et effectuer une opération pour la barre de progression sélectionnée. Mais j'ai un résultat:
You clicked: Progress1 TypeError: document.getElementById(...) is null
Comment sélectionner le Certain Element dans react.js?
Vous pouvez le faire en spécifiant le ref
<Progressbar completed={25} id="Progress1" ref="Progress1"/> <h2 class="center"></h2> <Progressbar completed={50} id="Progress2" ref="Progress2"/> <h2 class="center"></h2> <Progressbar completed={75} id="Progress3" ref="Progress3"/>
Afin d'obtenir l'élément, il suffit de faire
var object = this.refs.Progress1;
etc…
MODIFIER
Cependant, Facebook conseille de le faire parce que les références de chaîne ont des problèmes, sont considérées comme héritées et sont susceptibles d'être supprimés dans l'une des versions futures.
Du docs:
Legacy API: String Refs
Si vous avez travaillé avec React avant, vous pourriez être familier avec une ancienne API où l'attribut ref est une chaîne, comme "textInput", et le nœud DOM est accessible comme this.refs.textInput. Nous vous en conseillons parce que les références de chaîne ont des problèmes, sont considérées comme un legs et sont susceptibles d'être supprimées dans l'une des versions futures. Si vous utilisez actuellement this.refs.textInput pour accéder aux références, nous recommandons le modèle de rappel à la place.
Une façon recommandée est d'utiliser le motif de rappel
J'espère que ça aide
<Progressbar completed={25} id="Progress1" ref={(input) => {this.Progress[0] = input }}/> <h2 class="center"></h2> <Progressbar completed={50} id="Progress2" ref={(input) => {this.Progress[1] = input }}/> <h2 class="center"></h2> <Progressbar completed={75} id="Progress3" ref={(input) => {this.Progress[2] = input }}/>
DOC pour l'utilisation du rappel
Pour que l'élément réagisse, vous devez utiliser ref
et à l'intérieur de la fonction, vous pouvez utiliser la méthode ReactDOM.findDOMNode
.
Mais ce que j'aime faire plus, c'est appeler le droit de ref directement dans l'événement
<input type="text" ref={ref => this.myTextInput = ref} />
C'est un bon lien pour vous aider à comprendre.
Vous pouvez remplacer
document.getElementById(this.state.baction).addPrecent(10);
par
this.refs[this.state.baction].addPrecent(10); <Progressbar completed={25} ref="Progress1" id="Progress1"/>