Ошибка "default.filter is not a function"

Я пытаюсь использовать .filter для того, чтобы оставить в массиве только те строки, в которых есть искомая подстрока.

import logo from './logo.svg';
import './App.css';
import React from 'react';
import items from './Item'
import ReactDOM from 'react-dom';

let foundedItems = [];
var j = 0;

class MyForm extends React.Component {
  constructor(props) {
    super(props);
    this.state = { username: '' };
  }

  myChangeHandler = (event) => {
    this.setState({username: event.target.value});
    foundedItems = items.filter(function(item) {
      return item.toLowerCase().indexOf(this.state.username.toLowerCase()) !== -1;
    });
  }

  render() {
    return (
          <form>
            <input
              type='text'
              onChange={this.myChangeHandler}
            />
          </form>
    );
  }
}

ReactDOM.render(
  <React.StrictMode>
    <div>{foundedItems.map(item => <div class = "item">{item}</div>)}</div>
  </React.StrictMode>,
  document.getElementById('blog')
);

export default MyForm;

Что мне сделать, чтобы избежать ошибки default.filter is not a function? default нигде не использую, но ошибка именно такая


Ответы (1 шт):

Автор решения: Konstantin Modin

В стейт сохраняем строку по которой нужно фильровать список. Далее при отрисовке списка сначала фильтруем его. Получается примерно так:

// import React from "react";

const itemsToFilter = [
  { id: 1, name: "Mary" },
  { id: 2, name: "Mandy" },
  { id: 3, name: "Manson" },
  { id: 4, name: "John" },
];

const App = () => {
  const [filter, setFilter] = React.useState("");

  return (
    <div>
      <div>
        <label>Filter it:</label>
        <input
          type="text"
          value={filter}
          onChange={({ target: { value } }) => setFilter(value)}
        />
      </div>
      <div>
        Items:
        {itemsToFilter
          .filter((item) =>
            item.name.toLowerCase().includes(filter.toLowerCase())
          )
          .map(({ id, name }) => (
            <div key={id}>Name: {name}</div>
          ))}
      </div>
    </div>
  );
};

// export default App;

ReactDOM.render(<App />, document.getElementById('root'));
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/17.0.1/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/17.0.1/umd/react-dom.production.min.js"></script>
<div id="root"></div>

→ Ссылка