当useState()变化时如何渲染React函数组件?
当useState()变化时如何渲染React函数组件?
我有一个非常简单的功能组件,从localStorage获取日期并显示它。我有两个按钮,用于添加或删除日期的周数,并且我期望显示新的日期。然而,组件没有被渲染。
代码如下:
import React, { useState } from "react";
import { monthList } from "../common/lists";
const Navbar = () => {
const [focusDate, setFocusDate] = useState(
Number(localStorage.getItem("focusDate"))
);
const [month] = useState(new Date(focusDate).getMonth());
const [year] = useState(new Date(focusDate).getFullYear());
const onLeftClick = () => {
setFocusDate(focusDate - 504000000); //一个星期
localStorage.setItem("focusDate", focusDate);
};
const onRightClick = () => {
setFocusDate(focusDate + 504000000);
localStorage.setItem("focusDate", focusDate);
};
return (
{`${monthList[month]} ${year}`}
);
};
这个组件的预期行为是获取时间戳,然后显示该时间戳的月份和年份。当加载时,它正确显示为2021年1月,但是当我多次点击onLeftClick时,它不会渲染组件,虽然我期望它显示为2021年12月。计算是正确的,我认为我在这里缺少功能组件渲染的概念。这对于类组件来说会更容易,但我也想学习功能组件。我在这里错过了什么?
问题的出现原因:在React函数组件中,当使用useState()来管理状态时,如何在状态发生改变时重新渲染组件。
解决方法:
可以通过在函数组件中使用useState()来管理状态,并根据状态的变化来重新渲染组件。下面是一个示例代码:
import React, { useState } from 'react'; const MyComponent = () => { const [count, setCount] = useState(0); const handleClick = () => { setCount(count + 1); }; return (); }; export default MyComponent;Count: {count}
在上面的示例中,我们使用useState()来定义一个名为count的状态变量,并使用setCount()来更新count的值。当点击按钮时,调用handleClick函数来增加count的值,并重新渲染组件。
通过使用useState(),我们可以在函数组件中轻松地管理状态,并在状态发生改变时重新渲染组件。这使得React函数组件更加灵活和易于使用。
问题出现的原因是,setFocusDate方法是异步的,所以在调用setFocusDate之后立即更新本地存储时,不能期望本地存储包含新的focusDate值。这是因为setFocusDate方法被React调度但尚未执行。
解决方法是使用useEffect钩子来更新本地存储。在useEffect的第二个参数中传入focusDate,这样当focusDate发生变化时,useEffect会被触发,从而更新本地存储。
代码示例:
useEffect(() => { // 在focusDate发生变化后,更新本地存储的代码 }, [focusDate]);
此外,你还可以使用一个专门的hook来将本地存储与组件状态同步,比如这个例子:[https://usehooks.com/useLocalStorage/](https://usehooks.com/useLocalStorage/)。