为什么状态更改后,React不重新渲染页面?

时间:2020-06-09 15:03:14

标签: javascript reactjs

所以我正在使用React.js开发一个基本的Todo应用,我想知道为什么状态更改后todo组件不会自动重新渲染(状态包含待办事项列表,因此添加新的待办事项会更新这个数组)?应该重新渲染页面的Header和Todo组件,并使用作为道具传递的更新的todo数组。这是我的代码:

import React from 'react';
import './App.css';

class Header extends React.Component {
  render() {
    let numTodos = this.props.todos.length;
    return <h1>{`You have ${numTodos} todos`}</h1>
  }
}

class Todos extends React.Component {
  render() {
    return (
    <ul>
      {
    this.props.todos.map((todo, index) => {
      return (<Todo index={index} todo={todo} />)
    })
    }
    </ul>
    )
  }
}

class Todo extends React.Component {
  render() {
    return <li key={this.props.index}>{this.props.todo}</li>
  }
}

class Form extends React.Component {
  constructor(props) {
    super(props);
    this.addnewTodo = this.addnewTodo.bind(this);
  }

  addnewTodo = () => {
    let inputBox = document.getElementById("input-box");
    if (inputBox.value === '') {
      return;
    }
    this.props.handleAdd(inputBox.value);
  }

  render() {
    return (
      <div>
        <input id="input-box" type="text"></input>
        <button type="submit" onClick={this.addnewTodo}>Add</button>
      </div>
    )
  }
}

class App extends React.Component {
  constructor(props) {
    super(props);
    this.state = { todos: ['task 1', 'task 2', 'task 3']}
    this.handleNewTodo = this.handleNewTodo.bind(this);
  }

  handleNewTodo(todo) {
    let tempList = this.state.todos;
    tempList.push(todo);
    this.setState = { todos: tempList };
  }

  render() {
    return (
      <div>
      <Header todos={this.state.todos} />
      <Todos todos={this.state.todos} /> 
      <Form todos={this.state.todos} handleAdd={this.handleNewTodo} />
      </div>
      )
  }
}

2 个答案:

答案 0 :(得分:1)

您没有正确更新状态。

您需要复制/dist/js/main.js /dist/css/main.min.css ,在复制的数组中添加新的待办事项,然后调用this.state.todos函数

this.setState

注意handleNewTodo(todo) { let tempList = [...this.state.todos]; tempList.push(todo); this.setState({ todos: tempList }); } 是一个函数

答案 1 :(得分:0)

您错误地更新了状态,

handleNewTodo(todo) {
    let tempList = [...this.state.todos];
    tempList.push(todo);
    this.setState({ todos: tempList });
  }

这是正确的语法。