根据状态显示和隐藏元素

时间:2015-09-03 22:23:33

标签: javascript reactjs

我正在为我的应用程序执行搜索栏功能,当搜索没有结果时,我需要显示Your search criteria is invalid或与之相关的内容。

我有这个来显示结果

        {!!this.state.value.length &&
          <div>
            {match}                
          </div>
        }

我想尝试做像

这样的事情
        {(!this.state.result.length && !!this.state.value.length) &&
            <Paper>Your search criteria is invalid</Paper>            
        }  

但是在第二种情况下,当有结果时仍会显示该消息。

我这样做是因为如果我做if else,我会收到错误

在这种情况下,this.state.value是您在搜索栏中输入的内容,this.state.result是搜索结果

那么,最好的技术是什么?

这是代码的完整部分

更新

class UniversalSearch extends Component {

  constructor() {
    super();
    this.state = {value : '', result: ''};
  } 

  render () {
    let searchVal = this._matchPeople(this.state.value),
        match = Object.keys(searchVal).map(function(key) {
          return <div className="threeColumn"><Paper><div className="maxHeight"><h3>{key}</h3><p>{searchVal[key]}</p></div></Paper></div>;
        }),
        searchResult = this.state.result ? match : (<Paper>Your search criteria is invalid</Paper>);
    return (
      <Grid>
        <Row>
          <Column>
            <TextField onChange={this._onChange.bind(this)} 
                    fullWidth={true} floatingLabelText="Universal Search" 
                    onKeyUp={this._changeInput.bind(this)} value={this.state.value} />
            {searchResult}
          </Column>
        </Row>
      </Grid>
    );
  }

  _matchPeople = (input) => {
    let reg = new RegExp(input.split('').join('\\w*').replace(/\W/, ""), 'i');
    let filteredObj = { };
    Object.keys(falsyData).forEach(function(key) {
        if(key.match(reg)){
           filteredObj[key] = falsyData[key];
        }
    });
    return filteredObj;
  }

  _changeInput = (val) => {
    let autoCompleteResult = this._matchPeople(this.state.value);    
    if (autoCompleteResult.length) {
      this.setState({result: autoCompleteResult.join(' ')});
    };
  }

  _onChange = (event) => {
    this.setState({value: event.target.value});
  }  

}

1 个答案:

答案 0 :(得分:0)

这样的事情:

render() {

  let searchResult = this.state.result ? match : (<Paper>Your search criteria is invalid</Paper>)

  return (
    <Column>
      <TextField onChange={this._onChange.bind(this)}
                 onKeyUp={this._changeInput.bind(this)} value={this.state.value} />

      { searchResult }
    </Column>
  );
}

修改:

Here is a working JSFiddle我建议的解决方案 尝试更改状态,看看{ searchResult }

会发生什么