Sto cercando di refactoring del codice seguente dal mio punto di vista di rendering:ReactJS: Attenzione: setstate (...): non può aggiornare nel corso di una transizione di stato esistente
<Button href="#" active={!this.state.singleJourney} onClick={this.handleButtonChange.bind(this,false)} >Retour</Button>
ad una versione in cui l'associazione è all'interno del costruttore. Il motivo è che il binding nella visualizzazione di rendering mi darà problemi di prestazioni, specialmente sui telefoni cellulari di fascia bassa.
Ho creato il seguente codice, ma ottengo costantemente i seguenti errori (molti). Sembra che l'applicazione ottiene in un ciclo:
Warning: setState(...): Cannot update during an existing state transition (such as within `render` or another component's constructor). Render methods should be a pure function of props and state; constructor side-effects are an anti-pattern, but can be moved to `componentWillMount`.
Di seguito è riportato il codice che uso:
var React = require('react');
var ButtonGroup = require('react-bootstrap/lib/ButtonGroup');
var Button = require('react-bootstrap/lib/Button');
var Form = require('react-bootstrap/lib/Form');
var FormGroup = require('react-bootstrap/lib/FormGroup');
var Well = require('react-bootstrap/lib/Well');
export default class Search extends React.Component {
constructor() {
super();
this.state = {
singleJourney: false
};
this.handleButtonChange = this.handleButtonChange.bind(this);
}
handleButtonChange(value) {
this.setState({
singleJourney: value
});
}
render() {
return (
<Form>
<Well style={wellStyle}>
<FormGroup className="text-center">
<ButtonGroup>
<Button href="#" active={!this.state.singleJourney} onClick={this.handleButtonChange(false)} >Retour</Button>
<Button href="#" active={this.state.singleJourney} onClick={this.handleButtonChange(true)} >Single Journey</Button>
</ButtonGroup>
</FormGroup>
</Well>
</Form>
);
}
}
module.exports = Search;
ho provato questa soluzione, e funziona. Ma non vedo questa soluzione online come una soluzione preferita. Quello che voglio realizzare è che il mio binding è al di fuori della visualizzazione render. In questa soluzione, this.handleButtonChange = this.handleButtonChange.legare (questo); nel costruttore non è più necessario, vuol dire che il mio binding è di nuovo nella mia visualizzazione render? – user3611459
Forse quello che succede è quando imposto lo stato attivo, attiverà onClick, risultando in un ciclo. c'è un modo per impostare lo stato attivo senza attivare onClick? – user3611459
sei un risparmiatore di vita amico mio. :) – dsaket