هل تريد إظهار كيف يمكنك مشاركة أي بيانات قابلة للتسلسل بين مكونات React، على سبيل المثال. مكونات العميل في NextJS.
لدينا عدد قليل من المكونات غير ذات الصلة:
لنقم بإنشاء كائن يحتوي على الحالة الأولية
export const state: { count: number } = { count: 0 };
يمكننا تخزين البيانات في خريطة أو WeakMap، وستكون الحالة هي المفتاح للوصول إليها. أيضا، سوف تحتاج إلى مجموعة المشتركين.
const stateMap = new WeakMap
الآن دعنا نكتب رابطًا للاشتراك في تغييرات البيانات.
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 ACount: {state.count}
يمكنك معرفة كيفية عمله هنا 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
تنكس للقراءة.
تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.
Copyright© 2022 湘ICP备2022001581号-3