React JS过滤器无法正常工作,删除字符时不会返回项目

时间:2018-09-09 19:09:56

标签: javascript reactjs

我正在尝试根据用户输入创建过滤器功能。过滤器工作正常,但删除字符时不会返回任何内容。我知道这与更新状态有关。我希望有人能帮助我。

import React, {Component} from 'react';
import { BrowserRouter as Router, Route, Link } from "react-router-dom";

class Fetch extends Component {
  constructor(){
    super();
    this.state = {
      data: []
    }

    this.handleChange = this.handleChange.bind(this)
  }

  handleChange = (event) => {
    console.log(event.target.value);
    return this.setState({data: this.state.data.filter(data => data.title.toLowerCase().includes(event.target.value.toLowerCase()))})
  }

  async componentDidMount() {
    try {
    const response = await fetch(`https://jsonplaceholder.typicode.com/todos`);
    const json = await response.json();
    this.setState({ data: json }); 
    }
    catch (error) {
      console.error(error)
    }
  }

  render() {
    return(
        <div>
          <p><Link to={`/`}>Link to homepage</Link></p>
          <form>
            <input type="text" onChange={this.handleChange}></input>
          </form>
          <ul>
            {
              this.state.data.map(data => (
                <li key={data.id}>{data.id} => {data.title}</li>
              ))
            }
          </ul>
        </div>
    )
  }
}
export default Fetch;

3 个答案:

答案 0 :(得分:0)

这是因为您没有保留从HTTP请求获得的初始数据。这是问题所在:

  1. 初始状态:data = []
  2. ComponentDidMount:data = ['abc', 'bcd', 'cdf']
  3. 过滤关键字bdata = ['abc', 'bcd'](因为cdf不包含字母b
  4. 擦除过滤器(filter = ''),但是您的数据变量的值为data = ['abc', 'bcd'],因此它最多可以返回2个值。

答案 1 :(得分:0)

您可以使用以下解决方案来解决您的问题:

this.setState({ data:  this.state.data.filter(data => data.title.toLowerCase().indexOf(event.target.value.toLowerCase().trim() !== -1) ) })

答案 2 :(得分:0)

您的代码看起来不错,但是您的过滤器功能正在覆盖状态的data属性。我建议将完整的数组存储在data中(就像现在一样),并将过滤后的结果存储在状态的另一个属性中,如下所示:

import React, {Component} from 'react';
import { BrowserRouter as Router, Route, Link } from "react-router-dom";

class Fetch extends Component {
  constructor(){
    super();
    this.state = {
      data: [], 
      filtered: [] // This will store your filtered elements from data
    }

    this.handleChange = this.handleChange.bind(this)
  }

  handleChange = (event) => {
    console.log(event.target.value);
    // Filter the array stored in data, but never update it. 
    // Update filtered instead.
    return this.setState({filtered: this.state.data.filter(data => data.title.toLowerCase().includes(event.target.value.toLowerCase()))})
  }

  async componentDidMount() {
    try {
    const response = await fetch(`https://jsonplaceholder.typicode.com/todos`);
    const json = await response.json();
    // Keep the original data here.
    this.setState({ data: json }); 
    }
    catch (error) {
      console.error(error)
    }
  }

  render() {
    return(
        <div>
          <p><Link to={`/`}>Link to homepage</Link></p>
          <form>
            <input type="text" onChange={this.handleChange}></input>
          </form>
          <ul>
            {
              this.state.filtered.map(data => (
                <li key={data.id}>{data.id} => {data.title}</li>
              ))
            }
          </ul>
        </div>
    )
  }
}
export default Fetch;

请记住,filter不会修改原始数组,它总是会返回一个新数组。