Javascript 是否有一个React hooks特性,其功能与将回调作为第二个参数传递给setState相同?

Javascript 是否有一个React hooks特性,其功能与将回调作为第二个参数传递给setState相同?,javascript,reactjs,react-hooks,Javascript,Reactjs,React Hooks,使用钩子,我希望只在特定的更新状态调用之后执行函数。例如,我希望实现与此相同的功能(假设我已经实例化了这段状态) 我不希望每次名称更改时都记录“hi”,我只想在执行了这个特定的setState调用后记录“hi” 这个 不适用于我的目的,因为我不希望每次名称更改时都记录“hi”。setName调用中的值并不重要。只有在执行此特定的setName调用后,才能执行console.log 更新:我想得太多了。我问这个问题是因为我有一个叫做“mode”的状态,它通过switch语句确定了一些条件呈现: s

使用钩子,我希望只在特定的更新状态调用之后执行函数。例如,我希望实现与此相同的功能(假设我已经实例化了这段状态)

我不希望每次名称更改时都记录“hi”,我只想在执行了这个特定的setState调用后记录“hi”

这个

不适用于我的目的,因为我不希望每次名称更改时都记录“hi”。setName调用中的值并不重要。只有在执行此特定的setName调用后,才能执行console.log

更新:我想得太多了。我问这个问题是因为我有一个叫做“mode”的状态,它通过switch语句确定了一些条件呈现:

switch(mode) {
    case foo: return <Foo />
    case bar: return <Bar />
}

为了只在组件渲染时触发此逻辑。

来自useState()和useReducer()挂钩的状态更新不支持第二个回调参数。要在渲染后执行副作用,请使用useffect()在组件体中声明它。

只需在此处进行Spitball


const useStateWithCallback = val => {
   const callback = useRef();
   const [state,setState] = useState(val);

   useEffect(() => {
      callback.current && callback.current(state);
      callback.current = null;
   },[callback,state]);

   return [
      state,
      useCallback((arg,cb) => {
        callback.current = cb;
        return setState(arg);
      },[callback,setState])) // these are safe to omit, right?
   ]

}

编辑:不要太冗长,但用法:

import { useStateWithCallback } from './useStateWithCallback';

const MyCmp = () => {
    const [name,setName] = useStateWithCallback('');

    ...
    setName('joe',state => console.log(`Hi ${state}`));
    ...

}

React.useEffect(() => {
    someLogic();
}, []);

const useStateWithCallback = val => {
   const callback = useRef();
   const [state,setState] = useState(val);

   useEffect(() => {
      callback.current && callback.current(state);
      callback.current = null;
   },[callback,state]);

   return [
      state,
      useCallback((arg,cb) => {
        callback.current = cb;
        return setState(arg);
      },[callback,setState])) // these are safe to omit, right?
   ]

}

import { useStateWithCallback } from './useStateWithCallback';

const MyCmp = () => {
    const [name,setName] = useStateWithCallback('');

    ...
    setName('joe',state => console.log(`Hi ${state}`));
    ...

}