CRUD代表创建(Create)、读取(Read)、更新(Update)和删除(Delete),是数据库操作的四种基本功能。在React中,CRUD操作通常涉及组件的状态管理和与后端API的交互。
假设我们有一个简单的待办事项应用,涉及CRUD操作。
import React, { useState } from 'react';
function TodoForm({ addTodo }) {
const [input, setInput] = useState('');
const handleSubmit = (e) => {
e.preventDefault();
if (!input.trim()) return;
addTodo(input);
setInput('');
};
return (
<form onSubmit={handleSubmit}>
<input value={input} onChange={(e) => setInput(e.target.value)} />
<button type="submit">Add Todo</button>
</form>
);
}
function TodoList({ todos }) {
return (
<ul>
{todos.map((todo, index) => (
<li key={index}>{todo}</li>
))}
</ul>
);
}
function TodoItem({ todo, onUpdate }) {
const [isEditing, setIsEditing] = useState(false);
const [editedText, setEditedText] = useState(todo);
const handleEdit = () => {
setIsEditing(true);
};
const handleSave = () => {
onUpdate(editedText);
setIsEditing(false);
};
return (
<li>
{isEditing ? (
<>
<input value={editedText} onChange={(e) => setEditedText(e.target.value)} />
<button onClick={handleSave}>Save</button>
</>
) : (
<>
{todo}
<button onClick={handleEdit}>Edit</button>
</>
)}
</li>
);
}
function TodoItem({ todo, onDelete }) {
return (
<li>
{todo}
<button onClick={() => onDelete(todo)}>Delete</button>
</li>
);
}
原因:可能是由于React的状态更新是异步的,导致组件没有及时重新渲染。
解决方法:使用useEffect
钩子来监听状态变化,或者确保状态更新是通过setState
或useState
进行的。
import React, { useState, useEffect } from 'react';
function TodoApp() {
const [todos, setTodos] = useState([]);
useEffect(() => {
// 这里可以进行数据获取或其他副作用操作
}, [todos]);
const addTodo = (text) => {
setTodos([...todos, text]);
};
const updateTodo = (index, newText) => {
const newTodos = [...todos];
newTodos[index] = newText;
setTodos(newTodos);
};
const deleteTodo = (text) => {
setTodos(todos.filter(todo => todo !== text));
};
return (
<div>
<TodoForm addTodo={addTodo} />
<TodoList todos={todos} />
{todos.map((todo, index) => (
<TodoItem key={index} todo={todo} onUpdate={(newText) => updateTodo(index, newText)} onDelete={deleteTodo} />
))}
</div>
);
}
通过这种方式,可以确保组件在状态变化时及时更新。
领取专属 10元无门槛券
手把手带您无忧上云