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
comments
supplied 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.