I am using immutable-js and react-immutable-proptypes in React.
// CommentBox.jsx
getInitialState() {
return {
comments: Immutable.List.of(
{author: 'Pete Hunt', text: 'Hey there!'},
{author: 'Justin Gordon', text: 'Aloha from @railsonmaui'}
)
};
},
render(){
console.log(this.state.comments.constructor);
return (
<div className='commentBox container'>
<h1>Comments</h1>
<CommentForm url={this.props.url} />
<CommentList comments={this.state.comments} />
</div>
);
}
// CommentList.jsx
propTypes: {
comments: React.PropTypes.instanceOf(Immutable.List),
},
// CommentStore.js
handleAddComment(comment) {
this.comments.push(comment);
}
When the page initialization, it's no problem,all is ok,no warning.
The console log shows the comments is function List(value).
When I add a new comment, it looks work well,but there is a warning
Warning: Failed propType: Invalid prop
commentssupplied toCommentList, expected instance ofList. Check the render method ofCommentBox.
and the console log shows that the comments is function Array().
So, why does the comments constructor change from List to Array?
And and I have read http://facebook.github.io/react/docs/advanced-performance.html#immutable-js-and-flux.
The messages store could keep track of the users and messages using two lists:
this.users = Immutable.List(); this.messages = Immutable.List();It should be pretty straightforward to implement functions to process each payload type. For instance, when the store sees a payload representing a new message, we can just create a new record and append it to the messages list:
this.messages = this.messages.push(new Message({ timestamp: payload.timestamp, sender: payload.sender, text: payload.text });Note that since the data structures are immutable, we need to assign the result of the push function to this.messages.
this.comments.push(comment)expression returns a new list but does not modify the list in place (by definition, since it's immutable)