मैं react & redux
का उपयोग कर आवेदन पर काम कर रहा हूं और मुझे सेटप्रॉप की आवश्यकता है लेकिन यह बहिष्कृत है।प्रतिक्रिया में setProps का उपयोग करने से कैसे बचें?
चेतावनी::
नीचे एक नज़र त्रुटि लो setProps (...) और replaceProps (...) पदावनत कर रहे हैं। इसके बजाय, कॉल शीर्ष स्तर पर फिर से प्रस्तुत करें।
अनचाहे Invariant उल्लंघन: setProps (...):
setProps
पर पर एक माता-पिता के साथ एक घटक कहा जाता है। यह एक विरोधी पैटर्न है क्योंकि प्रोप प्रदान किए जाने पर प्रतिक्रियात्मक रूप से अपडेट हो जाएंगे। इसके बजाए, घटकrender
विधि को सही मान पास करने के लिए घटक पर प्रोप के रूप में बदलें जहां इसे बनाया गया है।
तो मैं प्रोप कैसे सेट कर सकता हूं? मूल रूप से, कुछ टैब का प्रबंधन मेरे कोड के नीचे एक नज़र रखना है:
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>
);
}
});
कंटेनर
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)
प्रसारण
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;
}
}
ऐसा लगता है कि आपको खुद को स्थापित करने के लिए आवश्यक प्रोप की तरह आंतरिक स्थिति होना चाहिए और आपको इसके बजाय सेटस्टेट को कॉल करना चाहिए। या प्रोप को रखें, लेकिन इसे बदलते समय राज्य को सेट करें (सिंक प्रोप और स्टेट) –
@JuanMendes की तरह, आप राज्य का उपयोग करना चाहेंगे। आप क्या कर सकते हैं अपने प्रोप का उपयोग करके अपना प्रारंभिक राज्य सेट करें और फिर अपडेट किए गए मान को –
@realseanp पर सेट करें, आपको यह सुनिश्चित करना होगा कि आप 'घटकWillReceiveProps' को लागू करते हैं, इसलिए यह स्थिति अद्यतन करता है जब मूल घटक प्रारंभिक के बाद प्रोप सेट करता है प्रस्तुत करना –