亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

為什麼每個 React 元件都需要使用 useDispatch?
P粉291886842
P粉291886842 2024-03-28 19:29:19
0
1
576

是的,這個問題似乎與這個問題重複:

每個元件應(yīng)該有一個 useDispatch 嗎?

但它並不重複。我提供不同的方法:

假設(shè)我有 3 個子元件,它們都使用 Redux Toolkit 的調(diào)度函數(shù)。

通常的方式是這樣的:

const ChildA = () => {
  const dispatch = useAppDispatch();

  const incr = useCallback(() => {
    dispatch(increment());
  }, [dispatch]);

  return <button onClick={incr}>ChildA</button>;
};

const ChildB = () => {
  const dispatch = useAppDispatch();

  const incr = useCallback(() => {
    dispatch(increment());
  }, [dispatch]);

  return <button onClick={incr}>ChildB</button>;
};

const ChildC = () => {
  const dispatch = useAppDispatch();

  const incr = useCallback(() => {
    dispatch(increment());
  }, [dispatch]);

  return <button onClick={incr}>ChildC</button>;
};

export const MyApp = () => {
  const dispatch = useAppDispatch();

  const count = useAppSelector((state) => state.counter.value);

  const incr = useCallback(() => {
    dispatch(increment());
  }, [dispatch]);

  return (
    <div>
      <button onClick={incr}>MyApp</button>

      <ChildA />
      <ChildB />
      <ChildC />

      <div>{count}</div>
    </div>
  );
};

但是如果我這樣做呢?請參閱:

export const glo: {
  dispatch: ReturnType<typeof useAppDispatch>;
} = {
  // @ts-ignore
  dispatch: null
};

const ChildA = () => {
  const incr = useCallback(() => {
    glo.dispatch(increment());
  }, []);

  return <button onClick={incr}>ChildA</button>;
};

const ChildB = () => {
  const incr = useCallback(() => {
    glo.dispatch(increment());
  }, []);

  return <button onClick={incr}>ChildB</button>;
};

const ChildC = () => {
  const incr = useCallback(() => {
    glo.dispatch(increment());
  }, []);

  return <button onClick={incr}>ChildC</button>;
};

export const MyApp = () => {
  const dispatch = useAppDispatch();
  glo.dispatch = dispatch;
  if (!glo.dispatch) {
    throw new Error("dispatch is falsy");
  }

  const count = useAppSelector((state) => state.counter.value);

  const incr = useCallback(() => {
    glo.dispatch(increment());
  }, []);

  return (
    <div>
      <button onClick={incr}>MyApp</button>

      <ChildA />
      <ChildB />
      <ChildC />

      <div>{count}</div>
    </div>
  );
};

經(jīng)我測試,它也運(yùn)作良好。請告訴我,為什麼我應(yīng)該按照通常的方式做?現(xiàn)在新程式碼(基於 glo 的程式碼)更大,但那是因為我們只有 3 個子元件。當(dāng)我們有 30 多個子元件時,基於 glo 的程式碼將會小得多,也更容易理解。

這裡是差異:

https://i.ibb.co/tKWv2Qc/image.png

這是 CodeSandbox 連結(jié):

https://codesandbox.io/s/clever-monad-c99q3k?file=/src/features/index.tsx

##
P粉291886842
P粉291886842

全部回覆(1)
P粉845862826

例如,該調(diào)度函數(shù)將在您的測試中發(fā)生變化。

如果沒有測試,在某些環(huán)境中這樣做本身並不是“錯誤”,但也不是一個大勝利。
如果你的應(yīng)用程式中有一行const dispatch = useAppDispatch(); ,那麼很有可能,當(dāng)js 套件被gzip 傳輸時(現(xiàn)在這很正常),它會gzip 到3 或4無論如何位元組.

如果您確實想刪除此處的程式碼,請刪除 useCallback ,因為將回呼直接傳遞到 html 時完全沒有必要。

最新下載
更多>
網(wǎng)站特效
網(wǎng)站源碼
網(wǎng)站素材
前端模板