"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > مشاركة الحالة بين مكونات React غير ذات الصلة

مشاركة الحالة بين مكونات React غير ذات الصلة

تم النشر بتاريخ 2024-08-07
تصفح:821

هل تريد إظهار كيف يمكنك مشاركة أي بيانات قابلة للتسلسل بين مكونات React، على سبيل المثال. مكونات العميل في NextJS.

لدينا عدد قليل من المكونات غير ذات الصلة:

Example app UI

لنقم بإنشاء كائن يحتوي على الحالة الأولية

export const state: { count: number } = { count: 0 };

يمكننا تخزين البيانات في خريطة أو WeakMap، وستكون الحالة هي المفتاح للوصول إليها. أيضا، سوف تحتاج إلى مجموعة المشتركين.

const stateMap = new WeakMap();
const subscribers: (() => void)[] = [];

الآن دعنا نكتب رابطًا للاشتراك في تغييرات البيانات.

export function useCommonState(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);
    };
  }, []);
}

الآن دعونا نضيف المنطق المتعلق بالحصول على الحالة وتعيينها

  // all instances of hook will point to same object reference
  const [state, _setState] = React.useState(() => {
    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 };

والآن يمكن استخدامه في 3 مكونات مثل

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

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


// ...
Component A
Count: {state.count}

Final app

يمكنك معرفة كيفية عمله هنا https://stackblitz.com/~/github.com/asmyshlyaev177/react-common-state-example
أو هنا https://codesandbox.io/p/github/asmyshlyaev177/react-common-state-example/main
أو في جيثب https://github.com/asmyshlyaev177/react-common-state-example

راجع مكتبتي الخاصة بـ NextJS بناءً على هذا المبدأ https://github.com/asmyshlyaev177/state-in-url

تنكس للقراءة.

بيان الافراج تم إعادة إنتاج هذه المقالة على: https://dev.to/asmyshlyaev177/sharing-state-between-undependent-react-components-4aia?1 إذا كان هناك أي انتهاك، يرجى الاتصال بـ [email protected] لحذفه
أحدث البرنامج التعليمي أكثر>

تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.

Copyright© 2022 湘ICP备2022001581号-3