父组件状态更新后,子组件中的道具没有更新

时间:2021-05-29 11:41:17

标签: javascript reactjs react-native react-hooks client-server

我正在开发一个 ToDo 应用程序,我传递了一个其中包含对象的任务数组,但在将任务作为道具传递后,它永远不会在 ToDoList 中更新。 请帮助我,感谢您的帮助,并想知道其背后的逻辑。

App.js :- 这是所有代码都存在的入口文件

import { useState, useEffect } from 'react';
import './App.css';
import AddToDo from './components/addToDo';
import Filter from './components/Filter';
import ToDoList from './components/toDoList';

window.id = 0;

function App() {
    const [value, setvalue] = useState('');
    const [tasks, settasks] = useState([]);
    const handleChange = (e) => setvalue(e.target.value);
    const handleTasks = (val) => {
        tasks.push({ text: val, completed: false, id: window.id++ });
        settasks(tasks);
        localStorage.setItem('tasks', JSON.stringify(tasks));
    };

    return (
        <div className="row flex-center flex-middle flex">
            <div className="border border-primary padding-large margin-large no-responsive paper">
                <h3>Narries ToDo</h3>
                <AddToDo onChange={handleChange} value={value} onAdd={handleTasks} />
                <ToDoList tasks={tasks} />
                <Filter />
            </div>
        </div>
    );
}

export default App;

添加待办事项 这是我们通过更改 app.js 中的状态来添加任务的地方

import React from 'react';

const AddToDO = (props) => {
    return (
        <div className="row">
            <div className="col padding-right-small">
                <input type="text" placeholder="New Todo" value={props.value} onChange={props.onChange} />
            </div>
            <div className="col padding-left-small">
                <button value="Add" className="paper-btn btn-small" onClick={() => props.onAdd(props.value)}>
                    Add
                </button>
            </div>
        </div>
    );
};

export default AddToDO;

ToDoList.js:- 这是它应该更新任务道具的地方。

import React, { useState } from 'react';

const ToDoList = (props) => {
    return (
        <div className="child-borders">
            {props.tasks.map((task, id) => {
                return (
                    <div
                        className={
                            'padding-small margin-small ' +
                            (task.completed ? 'background-primary' : 'shadow shadow-hover')
                        }
                        key={id}
                    >
                        {task.text}
                    </div>
                );
            })}
        </div>
    );
};

export default ToDoList;

2 个答案:

答案 0 :(得分:1)

您改变了原始任务数组。每次更改该值时,tasks 数组都会被覆盖。所以你需要将任务数组更新为:

const handleTasks = (val) => {
  let customTask = { text: val, completed: false, id: window.id++ };
  settasks(tasks => [...tasks, customTask]);
  localStorage.setItem('tasks', JSON.stringify(tasks));
};

答案 1 :(得分:1)

<块引用>

你永远不应该直接改变/改变你的状态删除这行tasks.push({ text: val, completed: false, id: window.id++ }); 在你的 ToDoList.js 中它应该只是 task 而不是 task.text