Функция фильтра возвращает пустой массив? - PullRequest
0 голосов
/ 21 ноября 2018

Поэтому, когда я вызываю здесь функцию handleRemove, если я возвращаю и console.log el, я получаю каждый из моих задач.Однако, если я вернусь и console.log el [index], OR el [index] .id, я получу только пустой массив.Я изучил документы по методу Array.prototype.filter, но я не понимаю, что я делаю здесь неправильно.

import React, { Component } from 'react';
import TodoInput from './todo-input';
import TodoList from './TodoList';

class App extends Component {
  constructor(props){
    super(props);
    this.state = {
      todos: [],
      inputValue: ''
    }
    this.handleChange = this.handleChange.bind(this);
    this.handleSubmit = this.handleSubmit.bind(this);
    this.handleRemove = this.handleRemove.bind(this);
  };

  handleChange = (e) => {
    e.preventDefault();
    this.setState({
      inputValue: e.target.value
    });
  }

  handleSubmit = (e) => {
    e.preventDefault();
    const newTodo = {
      title: this.state.inputValue,
      id: Date.now(),
      done: false
    };
    this.setState((prevState) => ({
      todos: [...prevState.todos, newTodo],
      inputValue: ''
    }));
  }

  handleRemove = (e) => {
    e.preventDefault();
    const newTodos = this.state.todos.filter((el, index) => el[index]);
    // this.setState((prevState) => ({
    //   todos: newTodos
    // }));
    console.log(newTodos);
  }

  render() {
    return (
        <div>
          <TodoInput
          value={this.state.inputValue}
          onChange={this.handleChange}
          onSubmit={this.handleSubmit}
          />
          <TodoList 
          todosArr={this.state.todos}
          onRemove={this.handleRemove}
          />
        </div>
    );
  }
}

export default App;

TodoList.js

import React, { Component } from 'react';
import TodoItem from './TodoItem';

class TodoList extends Component {
  render() {
    const mappedTodos = this.props.todosArr.map((todo, index) => 
      <TodoItem
      key={index}
      todoTitle={todo.title}
      handleRemove={this.props.onRemove}
      todoId={todo.id}
      />
    );

    return (
      mappedTodos
    );
  }
}

export default TodoList;

1 Ответ

0 голосов
/ 21 ноября 2018

Фильтр ожидает ответ истина / ложь, поэтому вам нужно сравнить el с каким-либо условием, например, с идентификатором.

Демо

https://repl.it/@AnonymousSB/SO53402083

import React, { Component } from 'react';

class App extends Component {
  constructor(props) {
    super(props);
    this.state = {
      todos: [
        { id: 123, value: 'Water the dog' },
        { id: 456, value: 'Rake the floor' }
      ]
    }
  }
  handleRemove(e, id) {
    const todos = this.state.todos.filter(todo => todo.id !== id)
    this.setState({ todos })
  }
  render() {
    return (
      <section style={{width: 500}}>
        <ul>
          {this.state.todos.map(todo => {
            return <li onClick={(e) => this.handleRemove(e, todo.id)}>{todo.value}</li>
          })}
        </ul>
      </section>
    );
  }
}

export default App;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...