使用 React hooks 在 React 中添加 div

Appending a div in React using React hooks

我目前正在学习 React,正在制作一个待办事项应用程序,以便我可以更轻松地理解 React。 所以这就是我正在尝试做的事情:

代码:

const [check, setCheck] = useState(false);
const [todo, setTodo] = useState([]);

function handleClick() {
    let toAdd = prompt('Title: ')
    setTodo([...todo, {
        title: toAdd
    }]);
}

useEffect(()=> {
    if(todo.length !== 0) {
        setCheck(true);
    }
})

return (
    <div className="wholeContainer">
        <div className="tododiv">
            <span className="todos">Todos: </span>
            <hr/>
            {
                check ? 
                todo.forEach((eachTodo)=> {
                    <TodoItems title={eachTodo}/>
                })
                : <span>Nothing</span>
                    
            }
        </div>
        <button className="add" onClick={handleClick}>
        <i className="fas fa-plus"></i>
            Add a Todo
        </button>
    </div>
);

const [check, setCheck] = useState(false);是为了让我可以访问数组if todo.length !== 0;

问题出在渲染部分。我想不出一种方法来在它们自己的 <TodoItems/> 组件中显示每个待办事项,而且在使用 forEach() 时也没有任何反应,因为我认为有人告诉我 setState() 有效异步地。 我真的需要一些建议!

谢谢...

您正在使用

todo.forEach((eachTodo)=> {
  <TodoItems title={eachTodo}/>
})

什么时候应该使用

todo.map((eachTodo)=> {
  return <TodoItems title={eachTodo}/>
})

todo.map((eachTodo)=> (
  <TodoItems title={eachTodo}/>
))

你的组件中还有一个无限循环:

useEffect(()=> {
    if(todo.length !== 0) {
        setCheck(true);
    }
})

每次组件更新时,当待办事项列表不为空时,您将 Check 设置为 true,这会触发新的渲染。 此外,您不需要为每个变量使用状态,只有那些是更改应该触发 re-render.

您的新 todo-list 状态也取决于之前的状态,因此您应该使用功能更新。

https://reactjs.org/docs/hooks-reference.html

const [todoList, setTodoList] = useState([]);

function handleClick() {
    let toAdd = prompt('Title: ');
    setTodoList((prevTodoList) => [...prevTodoList, toAdd]);
}

const isTodoListEmpty = todoList.length === 0
return (
    <div className="wholeContainer">
        <div className="tododiv">
            <span className="todos">Todos: </span>
            <hr />
            {!isTodoListEmpty ? (
                todoList.forEach((todoItem) => {
                    <TodoItems title={todoItem} />;
                })
            ) : (
                <span>Nothing</span>
            )}
        </div>
        <button className="add" onClick={handleClick}>
            <i className="fas fa-plus"></i>
            Add a Todo
        </button>
    </div>
);