使用 react usestate hook 防止为每个 setstate 重新渲染

Div*_*vya 5 reactjs react-hooks

我有一些多个状态和函数来使用 useState 钩子设置状态。

在每个 setstate 组件上重新渲染。我只想重新渲染完全完成的 setstate 功能。

例如:

在 app.js 中

const [a, setA] = useState(() => false);
const [b, setB] = useState(() => {});
const [c, setC] = useState(() => props.c);
const [d, setD] = useState(null);
const [e, setE] = useState(null);
const [f, setF] = useState(null);
const [g, setG] = useState('');

const func1 = useCallback(data => {
  setA(true);
  setB(true);
  setC(data && data.c);
  setD();
  setE(isChecked ? 'a' : 'b');
}, []);

const func2 = useCallback(data => {
  setA(false);
  setB(false);
}, []);

const func3 = useCallback(data => {
  setC(false);
  setD(false);
}, []);

const events = {
  func1,
  func2,
  func3
};

const handleMessage = e => {
  const { eventName, data } = e.data;
  const handleEvents = eventName ? events[toCamel(eventName)] : null;
  if (handleEvents && typeof handleEvents === 'function') {
    handleEvents(data);
  }
};

useLayoutEffect(() => {
  iframe.addEventListener('message', handleMessage, true);
  return () => {
    iframe.removeEventListener('message', handleMessage, true);
  };
}, []);

return (
 <Fragment>
  {a && (
    Component1
  )}
  {b && c && (
    Component2
  )}
</Fragment>
Run Code Online (Sandbox Code Playgroud)

);

在每个 func1 和 func2 setA 和 setB return 语句上重新渲染元素。我不想在每个 setA、setB、setC 等上重新渲染。一旦 func1 或 func2 完全完成,只想重新渲染组件。作为钩子的新手,有人可以帮忙吗?

Apo*_*olo 4

如果您的状态值联系如此紧密,并且您希望确保所有内容立即更新:

const [state, setState] = useState({
  a: () => false,
  b: () => {},
  c: () => props.c,
  d: null,
  e: null,
  f: null,
  g: ''
});

const updateState = newState => setState(Object.assign({}, state, newState));
Run Code Online (Sandbox Code Playgroud)

现在当你想更新你的状态时只需使用updateState这样的:

const func1 = useCallback(
  (data) =>
    updateState({
      a: true,
      b: true,
      c: data && data.c,
      d: undefined,
      e: isChecked ? 'a' : 'b',
    }),
  [],
);
Run Code Online (Sandbox Code Playgroud)