React 中的 LocalStorage 模态
LocalStorage modal in React
您好,我有一个模式,当我的应用程序检测到 Apple 设备时会弹出,加载是因为模式打开设置为 true。但是当它被加载时,localstorage 的值将是 1。如果它是 1,我将 open 设置为 false,这样当我返回那个组件时它就不会再次打开。
这是我在组件上的代码
const MasterIndexPage = () => {
const classes = useStyles()
const [userAgent, setUserAgent] = useState('')
const [isAndroid, setIsAndroid] = useState(false)
const [isApple, setIsApple] = useState(false)
const [isWindows, setIsWindows] = useState(false)
const [open, setOpen] = useState(true)
// setOpen(localStorage.getItem('formModal') == 1)
const handleClose = () => {
setOpen(false)
}
const visible = localStorage.getItem('formModal')
if (!visible) {
localStorage.setItem('formModal', 1)
setOpen(true)
console.log('first load')
}
if (visible) {
// setOpen(false) // when I uncomment this I'm getting an error
console.log('second load')
}
useEffect(() => {
if (navigator.userAgent.match(/Android/i)) {
setIsAndroid(true)
} else if (navigator.userAgent.match(/iPhone|iPod|iPad/i)) {
setIsApple(true)
} else {
return null
}
}, [])
return (
<h1>Hello</h1>
<div>
{isApple ? (
<Modal
aria-labelledby="transition-modal-title"
aria-describedby="transition-modal-description"
className={`${classes.modal}`}
open={open}
onClose={handleClose}
closeAfterTransition
BackdropComponent={Backdrop}
BackdropProps={{
timeout: 500,
}}
>
<div id="popup">
<h4 className="h4_addtohome">Add my App!</h4>
<p className="p__addtohome">
Tap below to add an icon to your home screen for quick access!
</p>
</div>
</Modal>
) : null}
</div>
)
}
export default MasterIndexPage
我正在实现,如果它检测到一个苹果设备,它将弹出,然后如果用户关闭它不会再次弹出,除非它清除缓存
当我启用 setOpen(false) 时出现此错误
您正在根据从本地存储读取的 visible
标志做出决定。所以你可以把它作为你的 useEffect 的依赖。
const visible = localStorage.getItem("formModal");
useEffect(() => {
if (!visible) {
localStorage.setItem("formModal", 1);
setOpen(true);
console.log("first load");
}
if (visible) {
// setOpen(false) // when I uncomment this I'm getting an error
console.log("second load");
}
}, [visible]);
您好,我有一个模式,当我的应用程序检测到 Apple 设备时会弹出,加载是因为模式打开设置为 true。但是当它被加载时,localstorage 的值将是 1。如果它是 1,我将 open 设置为 false,这样当我返回那个组件时它就不会再次打开。
这是我在组件上的代码
const MasterIndexPage = () => {
const classes = useStyles()
const [userAgent, setUserAgent] = useState('')
const [isAndroid, setIsAndroid] = useState(false)
const [isApple, setIsApple] = useState(false)
const [isWindows, setIsWindows] = useState(false)
const [open, setOpen] = useState(true)
// setOpen(localStorage.getItem('formModal') == 1)
const handleClose = () => {
setOpen(false)
}
const visible = localStorage.getItem('formModal')
if (!visible) {
localStorage.setItem('formModal', 1)
setOpen(true)
console.log('first load')
}
if (visible) {
// setOpen(false) // when I uncomment this I'm getting an error
console.log('second load')
}
useEffect(() => {
if (navigator.userAgent.match(/Android/i)) {
setIsAndroid(true)
} else if (navigator.userAgent.match(/iPhone|iPod|iPad/i)) {
setIsApple(true)
} else {
return null
}
}, [])
return (
<h1>Hello</h1>
<div>
{isApple ? (
<Modal
aria-labelledby="transition-modal-title"
aria-describedby="transition-modal-description"
className={`${classes.modal}`}
open={open}
onClose={handleClose}
closeAfterTransition
BackdropComponent={Backdrop}
BackdropProps={{
timeout: 500,
}}
>
<div id="popup">
<h4 className="h4_addtohome">Add my App!</h4>
<p className="p__addtohome">
Tap below to add an icon to your home screen for quick access!
</p>
</div>
</Modal>
) : null}
</div>
)
}
export default MasterIndexPage
我正在实现,如果它检测到一个苹果设备,它将弹出,然后如果用户关闭它不会再次弹出,除非它清除缓存
当我启用 setOpen(false) 时出现此错误
您正在根据从本地存储读取的 visible
标志做出决定。所以你可以把它作为你的 useEffect 的依赖。
const visible = localStorage.getItem("formModal");
useEffect(() => {
if (!visible) {
localStorage.setItem("formModal", 1);
setOpen(true);
console.log("first load");
}
if (visible) {
// setOpen(false) // when I uncomment this I'm getting an error
console.log("second load");
}
}, [visible]);