【发布时间】:2015-04-16 02:48:26
【问题描述】:
我把时间花在了一些可能很简单的事情上: 我想实现一个搜索栏,理想情况下在你输入时更新项目列表。我的小应用使用 React 和 Backbone(用于模型和集合)。
显示列表并不太难,这一切都很完美(我使用的 mixin 基本上可以轻松检索集合):
var List = React.createClass ({
mixins: [Backbone.React.Component.mixin],
searchFilter: function () {
//some filtering code here, not sure how (filter method is only for arrays...)
}
}
getInitialState: function () {
initialState = this.getCollection().map(function(model) {
return {
id: model.cid,
name: model.get('name'),
description: model.get('description')
}
});
return {
init: initialState,
items : []
}
},
componentWillMount: function () {
this.setState({items: this.state.init})
},
render: function(){
var list = this.state.items.map(function(obj){
return (
<div key={obj.id}>
<h2>{obj.name}</h2>
<p>{obj.description}</p>
</div>
)
});
return (
<div className='list'>
{list}
</div>
)
}
});
现在我尝试使用 getInitialState 方法首先将骨干集合转换为“状态”,但没有成功,我的想法是通过集合的副本进行代理,然后可以保存搜索结果。为了清楚起见,我没有在这里展示我的尝试(编辑:是的,我是),有人可以指导我采用正确的方法吗?提前致谢。
【问题讨论】:
-
您能否展示您在
getInitialState?中实现搜索的尝试?我的第一个想法是将search存储在状态(或者如果它是由父母传入的道具)并过滤基于您的渲染方法中的集合。 -
我同意@NickTomlin 的观点——如果你展示一些代码可能会有所帮助。例如,每当
searchText属性(如props.searchText)发生变化时,render函数就可以执行实时过滤器。 -
感谢@NickTomlin 和@WiredPrairie 的见解,这是我对
getInitialState方法的看法,项目数组应该使用搜索文本getInitialState: function () { initialState = this.getCollection().map(function(model) { return { id: model.cid, name: model.get('name'), description: model.get('description'), } }); return { init: initialState, items : [] } }进行过滤,但这不是真的感觉不错,我觉得我应该能够在不通过 react 的状态概念的情况下进行搜索,而只使用集合 -
@senseye 为了可读性和清晰度,我会将您评论中的代码移到问题中。同样,我建议不要创建单独的集合。该视图只是集合的“显示”,您可以将
map替换为filter,并且只包含与您的搜索条件匹配的项目。 -
@NickTomlin,我更新了代码以包含整个反应元素,
searchFilter方法没有实现,因为我花了一些时间让其余部分合理地工作......据我所知,您是说将集合复制到状态以存储搜索是正确的方法?
标签: javascript search backbone.js reactjs