我有两个sibling 组件,即<AddTask/><TaskList/>,它们是<Home/>组件的子组件.目前,当我在ToDo应用程序中添加新任务时,它将被添加,但我需要刷新页面才能显示新任务.单击<AddTask/>组件中的Add按钮后,如何立即刷新<TaskList/>组件?

Here is my 100 Component


const AddTask = () => {
    const [task, setTask] = useState("");
    const [isPending, setIsPending] = useState(false);

    const handleClick = (e)=> {
        e.preventDefault();
        setIsPending(true);
        const todo = {task};

        fetch('http://localhost:8000/tasks', {
            method: 'POST',
            headers: { "Content-Type": "application/json" },
            body: JSON.stringify(todo)
        })
        .then(()=>{
            setIsPending(false);
        })

    };

    return ( 
    
        <form className="new-task" onSubmit={handleClick}>
            <input className="input" 
                type="text" 
                required
                value={task}
                onChange= { (e)=> setTask(e.target.value) } 
            />
            <button className="add-task">Add</button>
        </form>
        
    );
}
 
export default AddTask;

This is the 100 Component

import TaskList from "./TaskList";
import useFetch from "./useFetch";

const Home = () => {
    const { data: task, isPending, error} = useFetch('http://localhost:8000/tasks');

    return (
        <div className="home">
            <AddTask />
            { error && <div>Failed to fetch data.</div> }
            { isPending && <div>Loading...</div> }
            { task && <TaskList task={task} /> }
        </div>
    );
}
 
export default Home;

推荐答案

Home组件中,需要tasks状态,以便可以在AddTask组件中更新该状态

Home

import TaskList from "./TaskList";
import useFetch from "./useFetch";
import { useState, useEffect } from 'react'

const Home = () => {
    const [tasks, setTasks] = useState(null);
    const { data: task, isPending, error} = useFetch('http://localhost:8000/tasks');
    useEffect(() => {
        if (task) setTasks(task)
    }, [task])

    return (
        <div className="home">
            <AddTask setTasks={setTasks} />
            { error && <div>Failed to fetch data.</div> }
            { isPending && <div>Loading...</div> }
            { tasks && <TaskList task={tasks} /> }
        </div>
    );
}
 
export default Home;

AddTask

const AddTask = ({ setTasks }) => {
    const [task, setTask] = useState("");
    const [isPending, setIsPending] = useState(false);

    const handleClick = (e)=> {
        e.preventDefault();
        setIsPending(true);
        const todo = {task};

        fetch('http://localhost:8000/tasks', {
            method: 'POST',
            headers: { "Content-Type": "application/json" },
            body: JSON.stringify(todo)
        })
        .then(()=>{
            setIsPending(false);
            setTasks(prev => ([...prev, task]))
        })

    };

    return ( 
    
        <form className="new-task" onSubmit={handleClick}>
            <input className="input" 
                type="text" 
                required
                value={task}
                onChange= { (e)=> setTask(e.target.value) } 
            />
            <button className="add-task">Add</button>
        </form>
        
    );
}
 
export default AddTask;

Reactjs相关问答推荐

如何实现黑暗模式 map ?

呈现组件元素(MAP)中的问题

从app.js导航,这是在BrowserRouter包装之外

react 下拉菜单任务

如何在取数后添加新数据,并在页面上保存旧数据?

我如何在不被 destruct 的情况下将导航栏固定在顶部?

如何使ionic 面包屑在州政府条件下可点击?

在继承值更改时重置react 挂钩窗体字段值

为什么我的react 简单计时器项目不起作用?

如何在我的 React 应用程序中仅显示我的 Register 组件

tRPC/react-query,在所有查询完成之前,组件不会收到任何 useQuery 的结果

警告:遇到两个子元素拥有同一把 keys .键应该是唯一的,以便组件在更新时保持其身份

我发送的 prop 的值不会改变.如果成功登录,导航栏中的 prop 必须为 true.我从后端得到 200 ok

当`useSelector`回调中的属性值更新时,将会使用更新后的值吗?

未捕获的运行时错误:对象作为 React 子项无效

页面不显示

AWS 全栈应用程序部署教程构建失败

React Native PermissionsAndroid 不包括 READ_MEDIA_IMAGES.如何解决这个问题?

如何使用 cypress 获取 MUI TextField 的输入值?

material uireact ,如何从表格中删除阴影?试图找到 api 但找不到正确的属性