我正在开发一个todo应用程序,预期流程是让用户输入他们的"Todo"并单击创建,将todo添加到Todo列表中,然后每个todo都会获得一个编辑按钮.该模式旨在在单击编辑按钮时出现,这将允许用户详细描述他们的待办事项.然而,目前当用户创建Todo时,Modal会弹出.

THE TODOLIST COMPONENT

import TodoItem from "./TodoItem"
import { useState } from "react"

export default function TodoList( {todos, setTodos} ) {
    const [editingItemId, setEditingItemId] = useState(null)

    function editTask(id) {
        setTodos(todos.map(todo => todo.id === id ? (
            {...todo, isEditing: !todo.isEditing}
        ) : todo
        ));
        setEditingItemId(id)
    }

    

    return (
        <div className="grid grid-cols-4 gap-4">
            {todos.map((todo, index) => (
                <TodoItem 
                key={index} 
                task={todo}
                editTask={editTask}
                editingItemId={editingItemId}
                />
            ))}
        </div>
    )
}

THE TODOITEM COMPONENT

import { useEffect } from "react";

export default function TodoItem({ task, editTask, editingItemId }) {
    useEffect(() => {
        if (task.isEditing && task.id === editingItemId) {
            displayDialog();
        }
    }, [task.isEditing, task.id, editingItemId]);

    function displayDialog() {
        document.querySelector('dialog').showModal();
    }

    return (
        <>
            <div className="col-span-4">
                <h2>{task.task}</h2>
                {task.description ? <p>{task.description}</p> : (
                    <button
                        onClick={() => editTask(task.id)}
                        className="bg-slate-600 hover:bg-slate-900 text-white font-bold px-2 py-1 m-1 rounded-2xl">
                        Describe your task
                    </button>
                )}
            </div>
            <dialog className="flex flex-col p-12 rounded-lg bg-slate-900 text-white">
                <h2 className="uppercase">{task.task}</h2>
                <textarea cols="60" rows="14" className="bg-slate-900 border border-white" />
            </dialog>
        </>
    );
}

推荐答案

您正在try 将vanilla JavaScript操作与React混合起来.您可能想 Select 其中一个,否则React的内部React组件树将与多姆不同步,并且您将遇到一百万个错误.要用React方式做到这一点,您通常会有条件地呈现对话框,而不是try 使用CSS显示/隐藏它.就像.

return (
    <>
        <div className="col-span-4">
            <h2>{task.task}</h2>
            {task.description ? <p>{task.description}</p> : (
                <button
                    onClick={() => editTask(task.id)}
                    className="bg-slate-600 hover:bg-slate-900 text-white font-bold px-2 py-1 m-1 rounded-2xl">
                    Describe your task
                </button>
            )}
        </div>
        { editingItemId === task.id &&
          <dialog className="flex flex-col p-12 rounded-lg bg-slate-900 text-white">
              <h2 className="uppercase">{task.task}</h2>
              <textarea cols="60" rows="14" className="bg-slate-900 border border-white" />
          </dialog>
        }
    </>
);

Javascript相关问答推荐

React redux状态未在React-Router库中呈现

我的YouTube视频没有以html形式显示,以获取免费加密信号

Mongodb拥有5亿个文档,我想根据JavaScript驱动程序中的两个字段使用regEx进行搜索,而不是模式

使用CDO时如何将Vue组件存储在html之外?

布局样式在刷新时不持续

获取表格的左滚动位置

如何解决这个未能在响应上执行json:body stream已读问题?

如何在mongoose中链接两个模型?

使用Java脚本根据按下的按钮更改S文本

当Redux提供程序访问Reduxstore 时,可以安全地从Redux提供程序外部调用钩子?

JS—删除对象数组中对象的子对象

优化Google Sheet脚本以将下拉菜单和公式添加到多行

可更改语言的搜索栏

我可以使用使用node.js创建的本地主机来存储我网站上提交的所有数据吗?没有SQL或任何数据库.只有HTML语言

类构造函数不能在没有用With Router包装的情况下调用

Nextjs 13.4 Next-Auth 4.2登录(&Quot;凭据&,{});不工作

TypeError:无法读取未定义的属性(正在读取';宽度';)

如何使本地html页面在重新加载时保持当前可隐藏部分的打开状态?

如何使用画布在另一个内部绘制一个较小但相同的形状,同时保持恒定的边界厚度?

在Java脚本中录制视频后看不到曲目