While trying out ReactJs, I am facing the below design issue:
Below is a simple html where I am trying to simulate a chat app, I am currently building a list of online members and trying to work out the code to add new members to the list.
The below React app consists of the following class in their DOM hierarchy.
ChatApp > MemberList > Member
In the react class ChatApp, I am able to use setInterval to update the members collection and generate new DOM for a new member, but now I want to try the same from outside the ChatApp class.
So I have added a button 'Add Member' and would like to call a function on its click which would in turn add a new member to the list.
But, How should I get instance of the react ChatApp and its setState method from outside of the react app?
<html>
<head>
<style>
.onlineList{
width:300px;
height:500px;
display:inline-block;
overflow:auto;
border:1px solid lightgray;
}
.onlineList a{
display:inline-block;
width:100%;
padding:10px;
box-sizing:border-box;
text-decoration:none;
color:gray;
font-weight:bold;
border-top:1px solid lightgray;
border-bottom:1px solid lightgray;
}
.onlineList a:hover{
color:black;
background-color:lightgray;
}
</style>
<script src="js/jquery-1.11.3.min.js"></script>
<script src="js/react-with-addons.js"></script>
<script src="js/JSXTransformer.js"></script>
<script>
function addNewMember(){
// How can the setState in chatApp react class be called from here?
}
</script>
</head>
<body>
<button onClick="addNewMember()">Add New Member</button>
<div id="chatApp"></div>
<script type="text/jsx">
var Member = React.createClass({
render: function() {
return <a href='#'>{this.props.memberInfo}</a>;
}
});
var MemberList = React.createClass({
render: function(){
var membersDOM = [];
for(var m=0; m < this.props.members.length;m++){
membersDOM.push(<Member memberInfo={this.props.members[m].name}/>);
}
return (
<div id='onlineList' className={'onlineList'}>{membersDOM}</div>
)
}
});
var ChatApp = React.createClass({
getInitialState: function(){
var members = {
members: []
};
for(var m=0;m<1;m++){
members.members.push({name: m + 1});
};
/* setInterval(function(){
members.members.push({name: members.members.length + 1 });
this.setState(members);
}.bind(this),2000);
*/
return members;
},
render: function(){
return (
<div id='container'>
<MemberList members={this.state.members}/>
</div>
)
}
})
React.render(
<ChatApp/>,
document.getElementById('chatApp')
);
</script>
</body>
</html>