javascript - 根据状态显示和隐藏元素

标签 javascript reactjs

我正在为我的应用程序提供搜索栏功能,当搜索没有结果时,我需要显示您的搜索条件无效或与之相关的内容。

我用它来显示结果

        {!!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});
  }  

}

最佳答案

像这样的事情怎么样:

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 }

会发生什么情况

关于javascript - 根据状态显示和隐藏元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32386366/

相关文章:

javascript - 需要构建一个日历组件,其中包含从 JSON 响应映射的每个日期的时隙选择

javascript - 提交表单后保留文本框可见

javascript - Firebase 响应太慢

javascript - 用于在 json 中获取 token 的正则表达式

javascript - 为什么 JSON.parse() 不能解析 date.toJSON() 创建的内容?

reactjs - 为什么我应该在这个例子中使用 Redux?

javascript - 在 React 项目中保护 .env 参数

javascript - 使用 Context API 在非嵌套组件之间传递变量

javascript - 等到满足条件或在 javascript 中传递超时

javascript - 连接两个字段并使用该值来更改/设置隐藏字段的值