【发布时间】:2015-07-11 08:00:35
【问题描述】:
在尝试 ReactJs 时,我面临以下设计问题:
下面是一个简单的 html,我试图在其中模拟一个聊天应用程序,我目前正在构建一个在线成员列表并尝试编写代码以将新成员添加到列表中。
下面的 React 应用程序在其 DOM 层次结构中包含以下类。
ChatApp > 会员列表 > 会员
在 react 类 ChatApp 中,我可以使用 setInterval 更新成员集合并为新成员生成新 DOM,但现在我想从 ChatApp 类之外尝试相同的操作。
所以我添加了一个“添加成员”按钮,并希望在单击时调用一个函数,该函数又会向列表中添加一个新成员。
但是,我应该如何从 react 应用程序外部获取 react ChatApp 及其 setState 方法的实例?
<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>
【问题讨论】:
-
如果您使用 React,您可能还应该使用 Flux 应用程序架构,它旨在与 React 的反应式渲染一起使用。查看facebook.github.io/flux/docs/overview.html。基本上,您将根据来自商店的数据来呈现您的组件。当 Add Member 被点击时,你发送一个 action 来更新 store,然后更新 react 组件。
-
@Hans,哦,好的,我去看看。
标签: javascript jquery reactjs