Sto lavorando all'applicazione utilizzando react & redux
e ho bisogno di setProps ma è deprecato.Come evitare di usare setProps in React?
Date un'occhiata l'errore di seguito:
Attenzione: SetProps (...) e (...) replaceProps sono deprecati. Invece, chiama nuovamente il rendering al livello superiore.
Violazione invariante non rilevata: setProps (...): Hai chiamato
setProps
su un componente con un genitore. Si tratta di un anti-pattern dal momento che gli oggetti di scena saranno aggiornati durante il rendering. Invece, cambiare il metodorender
del proprietario per passare il valore corretto come oggetti di scena al componente dove è stato creato.
Quindi, come posso impostare gli oggetti di scena? in fondo è quello di gestire alcune schede, date un'occhiata qui sotto il mio codice:
export default React.createClass({
render: function() {
return (
<div className="demo-tabs">
<Tabs activeTab={this.props.activeTab}
onChange={(tabId) => this.setProps({ activeTab: tabId })} ripple>
<Tab>Stack</Tab>
<Tab>GitHub</Tab>
<Tab>Twitter</Tab>
</Tabs>
<section>
<div className="content">Content for the tab: {this.props.activeTab}</div>
</section>
</div>
);
}
});
Container
import React from 'react';
import TimeLine from './timeline';
import { connect } from 'react-redux';
import { getStackoverflow } from 'api/timeline';
const TimeLineContainer = React.createClass({
componentWillMount: function() {
getStackoverflow();
},
render: function() {
return (
<TimeLine {...this.props} />
)
}
});
const stateToProps = function(state) {
return {
timeline: state.timelineReducer.timeline
}
}
const dispatchToProps = function(dispatch) {
return {
onClick:() => {console.log('timeline was clicked')}
}
}
export default connect(stateToProps, dispatchToProps)(TimeLineContainer)
Reducer
var timelineInitialState = {
github: [],
gist: [],
stackoverflow: [],
twitter: [],
activeTab: 2
}
export default function(state = timelineInitialState, action) {
switch (action.type) {
case 'GET_GITHUB':
//TODO: implement.
break;
case 'GET_GIST':
//TODO: implement.
break;
case 'GET_STACKOVERFLOW':
var stackoverflowState = Object.assign({}, state)
stackoverflowState.stackoverflow = action.stackoverflow;
return stackoverflowState;
break;
case 'GET_TWITTER':
//TODO: implement.
break;
default:
return state;
}
}
Sembra che gli oggetti di scena che è necessario impostare debbano essere nello stato interno e si dovrebbe invece chiamare setState. O tieni il puntello ma fallo impostare lo stato quando cambia (sync prop e state) –
Come ha detto @JuanMendes, vorrai usare lo stato. Quello che puoi fare è impostare il tuo stato iniziale usando i tuoi oggetti di scena e andando avanti imposta il valore aggiornato per dichiarare –
@realseanp devi assicurarti di implementare 'componentWillReceiveProps' in modo che aggiorni lo stato quando il componente genitore imposta un puntello dopo l'iniziale rendere –