reactjs - 存储在本地存储中的渲染/更新列表
问题描述
我正在尝试基于名为 todos 的对象呈现列表。我希望在用户离开页面后保持这种状态。当用户添加一个待办事项对象时,它会保存在本地并使用状态更新待办事项对象。待办事项未正确呈现在列表中,所以我想知道我做错了什么。
待办事项对象:
const [todos, setTodos] = useState([
{
text: "Learn about React",
isCompleted: false,
id: uuid()
},
]);
添加功能(在此处更新 todos 应该重新呈现我的列表):
const addTodo = text => {
setTodos([{text, isCompleted: false, id: uuid()}, ...todos]); //updates todos object
localStorage.setItem("currList", JSON.stringify(todos)); //saves new todos object
storedCurrList = localStorage.getItem("currList"); //retrieves new object
parsedList = JSON.parse(storedCurrList); //parses object
setTodos(parsedList); //updates based on local save
}; //object so that the update persists
呈现待办事项的组件:
{todos.map((value, index) => {
return(
<ListItem key={todos.id}>
<ListItemIcon>
<Checkbox
edge="start"
checked={value.isCompleted}
onChange={() => removeTodo(index)}
tabIndex={-1}
disableRipple
/>
</ListItemIcon>
<ListItemText disableTypography style={{fontFamily: 'Work Sans', fontSize: 35, color: nightMode.listText}} primary={value.text}/>
</ListItem>
);
})}
解决方案
如果您不想渲染todos
fromlocalStorage
您必须先阅读它,然后将其设置为您的初始todos
状态。
const [todos, setTodos] = React.useState([]); // todos are empty by default
React.useEffect(() => {
// reads the todos saved from localStorage and set that as the new value
// of our todos state — if currList not found, will fallback to empty list
const savedTodos = JSON.parse(localStorage.getItem("currList")) || [];
setTodos(savedTodos);
}, []);
现在更新todos
on时localStorage
,将您的addTodo
处理程序更改为
const addTodo = text => {
// we'll use this to update our `todos` state and `localStorage`
const newTodos = [
{ text: input, isCompleted: false, id: uuid() },
...todos
];
setTodos(newTodos);
localStorage.setItem("currList", JSON.stringify(newTodos));
};
当您在您的addTodo
函数上执行此操作(下面的代码)时,即使您先调用,todos
您设置的localStorage
也是未更新的。todos
setTodos
setTodos([{text, isCompleted: false, id: uuid()}, ...todos]);
localStorage.setItem("currList", JSON.stringify(todos)); // todos here don't have the new todo
我创建了一个代码框供您结帐,希望您能理解。