मैं प्रतिक्रिया में एक ब्लॉग बनाने की कोशिश कर रहा हूं। मेरे मुख्य ReactBlog घटक में, मैं पोस्ट की सरणी वापस करने के लिए एक नोड सर्वर पर एक AJAX कॉल कर रहा हूँ। मैं इस पोस्ट डेटा को प्रोप के रूप में विभिन्न घटकों में पास करना चाहता हूं।बाल घटक को प्रॉप्स के रूप में AJAX परिणाम पास करना
विशेष रूप से, मेरे पास PostViewer नामक एक घटक है जो पोस्ट जानकारी दिखाएगा। मैं डिफ़ॉल्ट रूप से इसे अपने माता-पिता से प्रोप के माध्यम से पोस्ट की गई पोस्ट दिखाता हूं, और अन्यथा राज्य कॉल के माध्यम से सेट डेटा दिखाता हूं।
वर्तमान में, मेरे कोड के प्रासंगिक भाग इस तरह दिखते हैं।
var ReactBlog = React.createClass({
getInitialState: function() {
return {
posts: []
};
},
componentDidMount: function() {
$.get(this.props.url, function(data) {
if (this.isMounted()) {
this.setState({
posts: data
});
}
}.bind(this));
},
render: function() {
var latestPost = this.state.posts[0];
return (
<div className="layout">
<div className="layout layout-sidebar">
<PostList posts={this.state.posts}/>
</div>
<div className="layout layout-content">
<PostViewer post={latestPost}/>
</div>
</div>
)
}
});
और बच्चे घटक:
var PostViewer = React.createClass({
getInitialState: function() {
return {
post: this.props.post
}
},
render: function() {
/* handle check for initial load which doesn't include prop data yet */
if (this.state.post) {
return (
<div>
{this.state.post.title}
</div>
)
}
return (
<div/>
)
}
});
ऊपर काम करता है अगर मैं बाहर स्वैप बयान और मेरे बच्चे की में सामग्री this.props को प्रस्तुत करना है, तो * हालांकि, इसका मतलब है कि मैं नहीं कर सके '। बाद में सामग्री के माध्यम से सामग्री को बदलना, सही?
TLDR: मैं एक डिफ़ॉल्ट के बाद एक बच्चे घटक में रंगमंच की सामग्री (एक AJAX कॉल के परिणाम) के माध्यम से देखा जाना चाहिए सेट करना चाहते हैं, और मैं क्या पोस्ट (किसी अन्य के onClick घटनाओं को जोड़कर देखा जा रहा है बदलने में सक्षम होना चाहता हूँ घटक) जो राज्य को अद्यतन करेगा।
क्या यह इसके बारे में जाने का सही तरीका है?
मेरे ऐप की घटकों के वर्तमान पदानुक्रम हैं:
React Blog
- Post List
- Post Snippet (click will callback on React Blog and update Post Viewer)
- Post Viewer (default post passed in via props)
धन्यवाद!
संपादित करें:
तो क्या मैं this.state के आधार पर एक मूल्य का उपयोग कर ReactBlog में रंगमंच की सामग्री संलग्न किया गया था कर समाप्त हो गया। यह सुनिश्चित करता है कि जब मैं राज्य बदलता हूं और बाल घटकों में सही ढंग से प्रस्तुत करता हूं तो यह अपडेट होता है। हालांकि, ऐसा करने के लिए मुझे सभी विभिन्न बाल घटकों के माध्यम से कॉलबैक पर क्लिक करना पड़ा। क्या ये सही है? ऐसा लगता है जैसे यह बहुत गन्दा हो सकता है। यहाँ मेरा पूरा उदाहरण कोड है:
var ReactBlog = React.createClass({
getInitialState: function() {
return {
posts: [],
};
},
componentDidMount: function() {
$.get(this.props.url, function(data) {
if (this.isMounted()) {
this.setState({
posts: data,
post: data[0]
});
}
}.bind(this));
},
focusPost: function(slug) {
$.get('/api/posts/' + slug, function(data) {
this.setState({
post: data
})
}.bind(this));
},
render: function() {
return (
<div className="layout">
<div className="layout layout-sidebar">
<PostList handleTitleClick={this.focusPost} posts={this.state.posts}/>
</div>
<div className="layout layout-content">
<PostViewer post={this.state.post}/>
</div>
</div>
)
}
});
var PostList = React.createClass({
handleTitleClick: function(slug) {
this.props.handleTitleClick(slug);
},
render: function() {
var posts = this.props.posts;
var postSnippets = posts.map(function(post, i) {
return <PostSnippet data={post} key={i} handleTitleClick={this.handleTitleClick}/>;
}, this);
return (
<div className="posts-list">
<ul>
{postSnippets}
</ul>
</div>
)
}
});
var PostSnippet = React.createClass({
handleTitleClick: function(slug) {
this.props.handleTitleClick(slug);
},
render: function() {
var post = this.props.data;
return (
<li>
<h1 onClick={this.handleTitleClick.bind(this, post.slug)}>{post.title}</h1>
</li>
)
}
});
var PostViewer = React.createClass({
getInitialState: function() {
return {
post: this.props.post
}
},
render: function() {
/* handle check for initial load which doesn't include prop data yet */
if (this.props.post) {
return (
<div>
{this.props.post.title}
</div>
)
}
return (
<div/>
)
}
});
फिर भी कुछ प्रतिक्रिया/आशा है कि यह मदद करता है पाने के लिए उम्मीद कर रहा!
आप संस्करण के ठीक बाद इसे ठीक कर रहे हैं। बच्चों को प्रोप प्रदान करने के लिए एक मूल घटक में एक राज्य का उपयोग करना रास्ता है। आपकी समस्या यह थी कि "getInitialState" केवल प्रत्येक घटक के लिए निष्पादित करता है (जब तक यह अनमाउंट नहीं किया जाता है) तो जब आप मूल स्थिति बदलते हैं, तब भी जब बच्चा प्रोप बदलता है, तब भी इसकी स्थिति नहीं होगी। – GonArrivi