首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >React过滤器禁用输入过滤器

React过滤器禁用输入过滤器
EN

Stack Overflow用户
提问于 2015-08-21 13:15:26
回答 1查看 329关注 0票数 0

我将以我是一个完整的新手,只玩了一个星期,我对Javascript,所以你可能会看到可怕的代码。

我对一些过滤功能有问题。我有一个输入,在那里我可以过滤掉标题,这是很好的工作。我也有按钮过滤,这也工作,除了当我选择所有。当我选择“全部”按钮时,按钮过滤仍然有效,但是输入筛选不再有效。

我做错了什么?我猜最大的问题是在我的_hasData函数中,我正在做一个if条件。

如果您不想检查API,event_type将返回performancepackageflex package

任何帮助都将不胜感激。谢谢

ButtonFilter.js

代码语言:javascript
复制
var ButtonFilter = React.createClass({
  handleFilterChange: function(index) {
    var value = $(this.getDOMNode()).children('div:nth-child(' + index + ')').children().attr('data-type');
    this.props.updateFilter(value);
  },
  render: function() {
    return (
      <div className="button-group button-group--horizontal">
        <div className="button-group__item">
          <button className="button list button--active" data-type="all" ref="filterButton" onClick={this.handleFilterChange.bind(this, 1)}>All</button>
        </div>
        <div className="button-group__item">
          <button className="button calendar-view" data-type="performance" ref="filterButton" onClick={this.handleFilterChange.bind(this, 2)}>Performances</button>
        </div>
        <div className="button-group__item">
          <button className="button calendar-view" data-type="package" ref="filterButton" onClick={this.handleFilterChange.bind(this, 3)}>Packages</button>
      </div>
    </div>
   )
  }
});

SearchFilter.js

代码语言:javascript
复制
var SearchFilter = React.createClass({
  handleFilterChange: function() {
    var value = React.findDOMNode(this).value;
    this.props.updateFilter(value);
  },
  render: function() {
    return <input type="text" ref="filterInput" onChange={this.handleFilterChange} placeholder="Start typing..." />;
  }
});

Events.js

代码语言:javascript
复制
var List = React.createClass({
  render: function() {
    var content;
    if (this.props.items.length > 0) {
      var items = this.props.items.map(function(item) {
        return (
          <div className="list-item" key={item.event_id}>
            <div className="list-info">
              <div className="list-info__venue">
                <h5 className="event-title">
                  <a href="#">{item.event_name}
                    <If condition={item.event_type != 'Performance'}>
                      <span className="event-type__badge">{item.event_type}</span>
                    </If>
                  </a>
                </h5>
                <span className="event-details">{item.event_date} | {item.event_venue}</span>
              </div>
             </div>
           </div>
         )
       });

       content = {items}
     } else {
       content = <p>No items matching this filter</p>;
     }

     return (
       <div>
          {content}
       </div>
    );
  }
});

var ListContainer = React.createClass({
  getInitialState: function() {
    return {
      data: [],
       nameFilter: '',
       typeFilter: ''
     };
  },

  componentWillMount: function () {
    this.loadEvents('http://private-4dfdc-ember26.apiary-mock.com/questions');
  },

  loadEvents: function(url) {
    $.ajax({
      url: url,
      dataType: 'json',
      success: function(data) {
        this.setState({
        data: data
      });
     }.bind(this),
     error: function(xhr, status, err, data) {
       console.error(this.props.url, status, err.toString());
     }.bind(this)
   });
  },

  inputFilterUpdate: function(filterValue) {
    this.setState({
      nameFilter: filterValue
    });
  },

  buttonFilterUpdate: function(typeValue) {
    this.setState({
      typeFilter: typeValue
    });
  },

  _hasData: function() {
    var displayedItems = this.state.data.filter(function(item) {
      var match = item.event_name.toLowerCase().indexOf(this.state.nameFilter.toLowerCase()) || item.event_type.toLowerCase().indexOf(this.state.typeFilter.toLowerCase());

      if ( this.state.typeFilter.toLowerCase() == 'all' ) {
        return true;
      }

      return (match !== -1);
    }.bind(this));

    return (
      <div>
        <div className="sub__nav">
          <div className="search">
            <i className="fa fa-times"></i>
            <SearchFilter updateFilter={this.inputFilterUpdate} />
          </div>
          <ButtonFilter updateFilter={this.buttonFilterUpdate} />
        </div>
        <div className="list-view">
          <h6 className="list-view__title">Upcoming</h6>
          <List items={displayedItems} />
        </div>
      </div>
    );
  },

  render: function() {
    if (this.state.data) {
      return (
        <div>
          {this._hasData()}
        </div>
      )          
    } else {
      return <div>Loading...</div>;
    }

    return false
  }
});
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-08-21 13:51:34

若要同时满足过滤器和旁路类型筛选器(如果设置为“all”),可以这样做:

代码语言:javascript
复制
var displayedItems = this.state.data.filter(function(item) {
  var eventName = item.event_name.toLowerCase(),
      eventNameFilter = this.state.nameFilter.toLowerCase(),
      eventType = item.event_type.toLowerCase(),
      eventTypeFilter = this.state.typeFilter.toLowerCase();

  return eventName.indexOf(eventNameFilter ) > -1 &&
         (eventTypeFilter === 'all' || eventType.indexOf(eventTypeFilter ) > -1;
}.bind(this));
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32141275

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档