React搜索过滤功能
React Search filter function
基本上,我的代码所做的是显示一个名称表列表,顶部有一个搜索栏,当您输入值时过滤列表。目前我的代码所遇到的问题是向DisplayTable组件添加if语句。我不希望它显示所有存储的数据而只显示用户在搜索栏{queryText}
中输入的数据请忽略tableData变量
var InstantBox = React.createClass({
doSearch:function(queryText){
console.log(queryText)
//get query result
var queryResult=[];
this.props.data.forEach(function(person){
if(person.name.toLowerCase().indexOf(queryText)!=-1)
queryResult.push(person);
});
this.setState({
query:queryText,
filteredData: queryResult
})
},
getInitialState:function(){
return{
query:'',
filteredData: this.props.data
}
},
render:function(){
return (
<div className="InstantBox">
<h2>Who is Richer?</h2>
<SearchBox query={this.state.query} doSearch={this.doSearch}/>
<DisplayTable data={this.state.filteredData}/>
</div>
);
}
});
var SearchBox = React.createClass({
doSearch:function(){
var query=this.refs.searchInput.getDOMNode().value; // this is the search text
this.props.doSearch(query);
},
render:function(){
return <input className="searchbar-edit" type="text" ref="searchInput" placeholder="Search Name" value={this.props.query} onChange={this.doSearch}/>
}
});
var DisplayTable = React.createClass({
doSearch:function(queryText){
console.log(queryText)
//get query result
var queryResult=[];
this.props.data.forEach(function(person){
if(person.name.toLowerCase().indexOf(queryText)!=-1)
queryResult.push(person);
});
this.setState({
query:queryText,
filteredData: queryResult
})
},
render:function(){
//making the rows to display
var rows=[];
this.props.data.forEach(function(person) {
rows.push(<tr><td>{person.image}</td></tr>)
rows.push(<tr><td>{person.name}</td></tr>)
});
//returning the table
return(
<table>
<tbody>{rows}</tbody>
</table>
);
}
});
var tableData=[
{
name:'Paul mak',
image: <img width="50" src="./images/profile_img.png"/>,
},
];
var dataSource=[
{
name:'Paul mak',
image: <img width="50" src="./images/profile_img.png"/>,
},
{
name:'John Doe',
image : '002'
},
{
name:'Sachin Tendulkar',
image : '003'
}];
React.render(
<InstantBox data={dataSource}/>,
document.getElementById('content1')
);
试试这样:
var InstantBox = React.createClass({
doSearch:function(queryText){
console.log(queryText)
//get query result
var queryResult=[];
this.props.data.forEach(function(person){
if(person.name.toLowerCase().indexOf(queryText)!=-1)
queryResult.push(person);
});
this.setState({
query:queryText,
filteredData: queryResult
})
},
getInitialState:function(){
return{
query: '',
filteredData: undefined
}
},
renderResults: function() {
if (this.state.filteredData) {
return (
<DisplayTable data={this.state.filteredData}/>
);
}
},
render:function(){
return (
<div className="InstantBox">
<h2>Who is Richer?</h2>
<SearchBox query={this.state.query} doSearch={this.doSearch}/>
{this.renderResults()}
</div>
);
}
});
我从你的代码中改变的是,我将this.state.filteredData
更改为未定义(实际上你可以完全删除它,但我认为这对你来说现在更清楚)在你的初始状态。这样,当你第一次渲染盒子,没有filteredData
和你的<DisplayTable />
不渲染。只要你从<SearchBox />
运行doSearch
回调,它就会填充filteredData
并显示它。
要扩展这一点,您还可以检查this.state.query
是否再次未定义或空白(例如:this.state.query.length
),如果没有查询/没有结果,则再次从dom中删除<DisplayTable />
。
记住render
函数仍然只是javascript。在JSX中用{}
封装的任何内容都将被计算。我们可以在render
函数中使用这个逻辑,并做一些类似var displayTable = <DisplayTable />;
的事情,然后在返回的JSX中包括{displayTable}
,这将是相同的。我个人更喜欢将渲染逻辑拆分为不同的函数:)
相关文章:
- Telerik过滤功能
- 按功能过滤 ng 重复
- 通过单向绑定的过滤功能提高自定义角度下拉菜单中的角度性能
- 如何在Leaflet.js中按属性过滤TopoJSON功能
- 在可过滤的剑道移动搜索框中键入时执行功能
- jquery 使用过滤功能过滤选择
- 在现代浏览器中,有这样的自制地图和过滤功能的快捷方式吗
- 具有多选列的剑道网格自定义过滤功能
- 为什么不'我的过滤功能不起作用吗?(Javascript)
- Jquery-计数具有过滤功能的元素并显示它
- 过滤Ember中的功能
- 为什么我的动态表没有过滤功能?
- 在javascript/jquery中是否有任何内置功能来过滤邮件,如php's函数(!使用filter_var
- 过滤数据与点击功能
- 如何使用jQuery过滤功能只捕获前几个字母
- 如何在不移动过滤功能的情况下将一组过滤后的数据移动到另一个工作表
- React搜索过滤功能
- 如何重画图表:d3.js链接功能和交叉过滤过滤
- 在交叉过滤和组功能中使用Uint8Array
- 使用过滤功能清除队列