在过去的几周里,我一直在使用facebook框架React.js和Backbone,但我仍然不完全确定,当作为属性传入的Backbone集合发生变化时,重新呈现React组件的最合适的方式是什么。
目前我所做的是在componenentWillMount
中,我在集合上设置change/add/remove
侦听器,并在它触发时设置状态:
componentWillMount: function(){
var myCollection = this.props.myCollection;
var updateState = function(){
this.setState({myCollection: myCollection.models});
}
myCollections.on("add remove", updateState, this);
updateState();
}
render: function(){
var listItems = this.state.myCollection.map(function(item){
return <li>{item.get("someAttr")}</li>;
});
return <ul>{listItems}</ul>;
}
我看到过将模型克隆到状态的示例:
var updateState = function () {
this.setState({ myCollection: _.clone(this.myCollection.models) });
};
我还看到了一些变体,其中props中的model/collection直接用于呈现而不是使用state,然后当collection/model发生变化时调用forceUpdate,从而导致组件重新呈现
componentWillMount: function(){
var myCollection = this.props.myCollection;
myCollections.on("add remove", this.forceUpdate, this);
}
render: function(){
var listItems = this.props.myCollection.map(function(item){
return <li>{item.get("someAttr")}</li>;
});
return <ul>{listItems}</ul>;
}
不同的方法有什么优点和缺点?2有没有一种方法是“React方式”?
5条答案
按热度按时间eoigrqb61#
您可以使用基于此BackboneMixin的mixin来帮助自动绑定和取消绑定侦听器,而不是手动绑定事件侦听器:
https://github.com/facebook/react/blob/1be9a9e/examples/todomvc-backbone/js/app.js#L148-L171
那你就写
并且当集合中的任何内容发生变化时,组件将被重新呈现。您只需要将BackboneMixin放在顶级组件上--任何后代都将同时自动重新呈现。
wh6knrhe2#
IMO,React仍然是非常新的,关于如何处理数据和像Backbone这样的React式模型的既定规则非常少。这也是一个优势,如果你有一个现有的应用程序- react可以集成在它的一些更小的部分上,而不需要重新定义整个数据流。
我相信,由于React可以随时调用render“smart”(即只重新呈现已更改的部分),因此您实际上不需要将数据作为状态进行传递。只需传递数据,在顶层组件上添加侦听器,并在模型更改时调用
forceUpdate
,它将很好地向下传播。它只是似乎更“正确”通过 Backbone 模型作为道具,而不是国家。
我很难学到的一件重要的事情是在呈现 Backbone.js 模型列表时使用
model.cid
作为键(而不是Math.random()
):因为否则React将无法识别要重新渲染的模型,因为所有模型在每次渲染时都将有新的关键点。
dnph8jn43#
我一直在使用这里提到的BackboneMixin和其他一些React资源(关于目前有限的信息)。我发现当我在监听一个正在从服务器更新的集合时,同样多的n个“add”事件将在集合上触发并由BackboneMixin监听,从而调用force update n次,它调用render以及render调用的任何内容n次。
相反,我使用了下划线/lo-dash的throttle方法来限制forceUpdate被调用的次数。至少这限制了render方法被调用的次数。我知道react实际上并没有做任何DOM操作,它只是一个虚拟的DOM,但仍然没有理由为100次向Collection的直接添加而调用它100次。
因此,我的解决方案看起来像https://gist.github.com/ssorallen/7883081,但使用了如下所示的componentDidMount方法:
e0uiprwp4#
还有另一个BackboneMixin courtesy of Eldar Djafarov,它在模型更改时重新呈现组件,并且还提供了一种非常方便的方法来实现双向数据绑定:
下面是他的jsFiddle,它演示了用法:http://jsfiddle.net/djkojb/qZf48/13/
hzbexzde5#
react.backbone似乎是最新的React-Backbone集成解决方案,但尚未测试。