P粉1569834462023-09-02 00:17:20
這個中間函數似乎是問題所在:
function usePage() { return React.useState(1); }
由 useState
傳回的狀態設定函數本身不會在每次渲染時重新創建,但透過此外部函數呼叫它似乎會破壞這一點。這導致依賴項發生變化,如 useEffect
依賴項數組所觀察到的。
如果您不需要這個usePage
函數(在範例中您不需要,但在更大的上下文中可能存在有意義的情況),那麼只需將其完全刪除並使用直接useState
:
const [page, setPage] = useState("");
通常,人們無論如何都不想在函數內調用鉤子,因為它可以快速且輕鬆地導致違反必須在每次渲染上一致且以相同順序調用鉤子的規則。因此,最好將鉤子呼叫保留在元件本身的主體中(以及元件邏輯的早期)。
有時,在某些情況下,您確實希望自訂函數充當 useEffect
中的依賴項。由於聲明的函數在每次渲染時都會重新聲明,因此您會遇到上面遇到的問題。為了解決這個問題,您可以將函數包裝在 useCallback
掛鉤中,該掛鉤本身也有一個相依性數組,與 useEffect
非常相似。這個鉤子的目的是創建自訂函數,React 可以將這些函數跨渲染緩存為單一函數實例(除非依賴項發生變化)。例如:
const myCustomFunction = useCallback(args => { // use function args, etc. }, [someDependencies]);