Rumah > hujung hadapan web > tutorial js > Berkongsi keadaan antara komponen React yang tidak berkaitan

Berkongsi keadaan antara komponen React yang tidak berkaitan

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
Lepaskan: 2024-07-17 06:51:30
asal
1205 orang telah melayarinya

Ingin menunjukkan cara anda boleh berkongsi sebarang data boleh bersiri antara komponen React, mis. komponen pelanggan dalam NextJS.

Kami mempunyai beberapa komponen yang tidak berkaitan:

Example app UI

Mari kita cipta objek yang akan mengandungi keadaan awal

export const state: { count: number } = { count: 0 };
Salin selepas log masuk

Kami boleh menyimpan data dalam Peta atau WeakMap, keadaan akan menjadi kunci untuk mengaksesnya. Juga, akan memerlukan susunan pelanggan.

const stateMap = new WeakMap<object, object>();
const subscribers: (() => void)[] = [];
Salin selepas log masuk

Sekarang mari kita tulis cangkuk untuk melanggan perubahan data.

export function useCommonState<T extends object>(stateObj: T) {
  // more efficient than `useEffect` since we don't have any deps
  React.useInsertionEffect(() => {
    const cb = () => {
      const val = stateMap.get(stateObj);
      _setState(val!);
    };
    // subscribe to events
    subscribers.push(cb);

    return () => {
      subscribers.slice(subscribers.indexOf(cb), 1);
    };
  }, []);
}
Salin selepas log masuk

Sekarang mari tambah logik yang berkaitan untuk mendapatkan dan menetapkan keadaan

  // all instances of hook will point to same object reference
  const [state, _setState] = React.useState<typeof stateObj>(() => {
    const val = stateMap.get(stateObj) as T;
    if (!val) {
      stateMap.set(stateObj, stateObj)
      return stateObj
    }
    return val
  });

  const setState = React.useCallback((newVal: object) => {
    // update value
    stateMap.set(stateObj, newVal);
    // notify all other hook instances
    subscribers.forEach((sub) => sub());
  }, []);

  return { state, setState };

Salin selepas log masuk

Dan kini boleh menggunakannya dalam 3 komponen seperti

import { state as myState } from './state';
//...

const { state, setState } = useCommonState(myState);

<button
  onClick={() => setState({ count: state.count + 1 })}
  className="p-2 border"
>
  +
</button>
// ...
Component A<div>Count: {state.count}</div>
Salin selepas log masuk

Final app

Anda boleh melihat cara ia berfungsi di sini https://stackblitz.com/~/github.com/asmyshlyaev177/react-common-state-example
Atau di sini https://codesandbox.io/p/github/asmyshlyaev177/react-common-state-example/main
Atau dalam github https://github.com/asmyshlyaev177/react-common-state-example

Lihat perpustakaan saya untuk NextJS berdasarkan prinsip ini https://github.com/asmyshlyaev177/state-in-url

Tnx kerana membaca.

Atas ialah kandungan terperinci Berkongsi keadaan antara komponen React yang tidak berkaitan. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan