[英]localstorage values get reset after refreshing page and inserting new values
[英]localStorage values are set to undefined after refreshing the page
我正在尝试将localStorage
中的先前信息集成到DOM
中,以便用户在同一浏览器中重新访问页面后可以看到它。 出于某种原因,重新加载localStorage
中的major
属性和declared
属性设置为undefined
。
谁能告诉我为什么会发生这种情况以及我该如何解决? 这是我的代码:
import React, { useState, useReducer, useEffect, useRef } from "react";
import MajorStatus from "./MajorStatus";
import ClassType from "./ClassType";
import styles from "/styles/ClassSearch.module.css";
function UserInfo() {
const [currentMajor, setCurrentMajor] = useState();
const [currentlyDeclared, setIsCurrentlyDeclared] = useState();
useEffect(() => {
localStorage.setItem("declared", currentlyDeclared);
localStorage.setItem("major", currentMajor);
}, [currentMajor, currentlyDeclared]);
useEffect(() => {
let storedDeclarationStatus = localStorage.getItem("declared");
let storedMajor = localStorage.getItem("major");
let declarationLabel = storedDeclarationStatus ? "Declared" : "Undeclared";
declaredRef.current.setValue({
label: declarationLabel,
value: storedDeclarationStatus,
});
majorRef.current.setValue({
label: storedMajor,
value: storedMajor,
});
}, []);
let declaredRef = useRef();
let majorRef = useRef();
function onChangeMajorHandler(userInput) {
setCurrentMajor(userInput.value.major);
console.log("Current input major: " + userInput.value.major);
}
function onChangeDeclaredHandler(userInput) {
setIsCurrentlyDeclared(userInput.value.declared);
console.log("Current input declaration: " + userInput.value.declared);
}
function onSubmitHandler(event) {
event.preventDefault();
}
return (
<form className={styles.userInfo} method="post" onSubmit={onSubmitHandler}>
<MajorStatus
onChangeMajorHandler={onChangeMajorHandler}
onChangeDeclaredHandler={onChangeDeclaredHandler}
majorRef={majorRef}
declaredRef={declaredRef}
/>
<ClassType />
<button
type="submit"
name="submitUserInfo"
className={styles.submitUserInfoButton}
>
Search
</button>
</form>
);
}
export default UserInfo;
问题是由第一个useEffect
引起的,它在安装组件时在第二个之前运行,并且它将localStorage
中的值设置为您的状态的初始值, undefined
,因为您在调用useState
时没有设置任何值。 避免此问题的一种方法是:
useEffect(() => {
if (currentlyDeclared) {
localStorage.setItem("declared", currentlyDeclared);
}
if (currentMajor) {
localStorage.setItem("major", currentMajor);
}
}, [currentMajor, currentlyDeclared]);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.