编辑:用更好的方法更新我的答案。
目标是setState,然后调用一个以previousState为参数的函数。为此,让我们编写一个自定义挂钩来封装该目标。
我们的自定义钩子将初始化一个 useState 钩子,并返回状态,以及一个自定义包装的 setState 方法。
当使用回调参数调用自定义 setState 方法时,我们会将回调推送到数组中并将其保存到 ref。
接下来我们编写一个 useEffect 钩子,它将在 React 完成提交任何状态更改后调用。
在我们的 useEffect 挂钩中,我们将调用 ref 列表中的每个回调,并传递 previousState 和 nextState 作为参数。
回调完成后,我们清空回调列表并将currentState保存到previousState ref。
useStateWithCallback.js
import React, { useState, useRef, useEffect } from 'react';
export const useStateWithCallback = (initialState) => {
const [state, setState] = useState(initialState);
const previousState = useRef(initialState);
const myCallbacksList = useRef([]);
const setStateWithCallback = (state, callback) => {
setState(state);
if (callback) {
myCallbackList.current.push(callback);
}
};
useEffect(() => {
myCallbacksList.current.forEach((callback) => callback(previousState.current, state));
myCallbacksList.current = [];
previousState.current = state;
}, [state]);
return [state, setStateWithCallback];
};
import React from 'react';
import { useStateWithCallback } from './useStateWithCallback';
const Example = (props) => {
const [state, setState] = useStateWithCallback();
const handlePress = () => {
setState(
(prevState) => prevState + 1,
(prevState, currentState) => dispatch(myaction(prevState))
);
};
return <Buton onPress={handlePress} />;
};