نظارت بر تغییرات

در بخش های قبل در مورد متد subscribe توضیح دادیم. اما در این بخش کمی بیشتر به آن خواهیم پرداخت.

در اکثر حالت ها ما نیاز داریم تا با تغییر کردن مقادیر استیت، یک ریرندر در کامپوننت ری اکت ما ایجاد شود. ولی در برخی مواقع نیاز میشود که بدون ایجاد کردن ری رندر اضافه، بخواهیم تغییرات یک مقدار را رصد کنیم. در این حالت میتوان از متد subscribe موجود در observer استفاده کرد.

متد subscribe را میتوان در دو بخش مختلف از اپ استفاده کرد .

  1. خارج از کامپوننت ری اکت
  2. داخل هوک useEffect در کامپوننت ری اکت .

توجه داشته باشد که نباید از متد subscribe در داخل بدنه کامپوننت خود استفاده کنید. چون با این کار، به ازای هر rerender، یک بار به صورت جداگانه برای تغییرات مقادیر مورد نظر subscribe میکنید که خود باعث ایجاد سربار اضافه میشود.

رصد تغییرات خارج از کامپوننت ری اکت

import { observer, useObserver } from 'rosma'; observer.subscribe('time', listener); function listener(time) { alert('The time is ' + time); } export function Component() { const { time, setTime } = useObserver(); return ( <div> <p>{time}</p> <button onClick={() => setTime(new Date().toLocaleTimeString())}> Click to update </button> </div> ); }
import { observer, useObserver } from 'rosma'; type State = { time: string; }; observer.subscribe<State>('time', listener); function listener(time: State['time']) { alert('The time is ' + time); } export function Component() { const { time, setTime } = useObserver<State>(); return ( <div> <p>{time}</p> <button onClick={() => setTime(new Date().toLocaleTimeString())}> Click to update </button> </div> ); }

در این مثال، ما با استفاده از متد observer.subscribe تغییرات مقدار زمان را با یک تابع listener رصد می‌کنیم. عملکرد listener به سادگی یک alert را با زمان فعلی نمایش می دهد.

تابع Component یک کامپوننت React است که از هوک useObserver برای دسترسی به مقدار time و setTime که به ترتیب برای دریافت و به روز رسانی مقدار زمان کاربرد دارد استفاده می کند.

توجه داشته باشید که تابع listener قبل از رندر مجدد کامپوننت فراخوانی می شود.

رصد تغییرات داخل کامپوننت ری اکت

توجه داشته باشید که برای نظارت در تغییرات استیت در داخل کامپوننت React، باید عملیات subscribe را در داخل هوک useEffect قرار دهیم.

همچنین نکته مهم دیگر این است که متد subscribe تابعی را برای اتمام عملیات نظارت (unsubscribe) برمی گرداند که باید هنگام unmount شدن کامپوننت ما فراخوانی شود.

در اینجا ما همان مثال قبلی را برای استفاده در این بخش بازنویسی کرده ایم:

import { useEffect } from 'react'; import { observer, useObserver } from 'rosma'; export function Component2() { const { time, setTime } = useObserver(); useEffect(() => { const unsubscribe = observer.subscribe('time', listener); function listener(time) { alert('The time is ' + time); } return () => unsubscribe(); }, []); return ( <div> <p>{time}</p> <button onClick={() => setTime(new Date().toLocaleTimeString())}> Click to update </button> </div> ); }
import { useEffect } from 'react'; import { observer, useObserver } from 'rosma'; type State = { time: string; }; export function Component2() { const { time, setTime } = useObserver<State>(); useEffect(() => { const unsubscribe = observer.subscribe<State>('time', listener); function listener(time: State['time']) { alert('The time is ' + time); } return () => unsubscribe(); }, []); return ( <div> <p>{time}</p> <button onClick={() => setTime(new Date().toLocaleTimeString())}> Click to update </button> </div> ); }

رصد تغییرات چند مقدار

با استفاده از یک تابع listener می توانید تغییرات چندین مقدار را به صورت همزمان کنترل کنید. برای انجام این کار، به جای ارسال یک رشته به عنوان اولین پارامتر به متد subscribe، باید یک آرایه از رشته ها را ارسال کنید.

import { observer, useObserver } from 'rosma'; observer.subscribe(['random1', 'random2'], listener); function listener({ random1, random2 }) { alert(`Random1: ${random1},\nRandom2: ${random2}`); } function Component1() { const { random1, setRandom1 } = useObserver(); return ( <button onClick={() => setRandom1(Math.random())}> {random1 || 'Random1'} </button> ); } function Component2() { const { random2, setRandom2 } = useObserver(); return ( <button onClick={() => setRandom2(Math.random())}> {random2 || 'Random2'} </button> ); } export function App() { return ( <> <Component1 /> <Component2 /> </> ); }
import { observer, useObserver } from 'rosma'; type State = { random1: number; random2: number; }; observer.subscribe<State>(['random1', 'random2'], listener); function listener({ random1, random2 }: State) { alert(`Random1: ${random1},\nRandom2: ${random2}`); } function Component1() { const { random1, setRandom1 } = useObserver<State>(); return ( <button onClick={() => setRandom1(Math.random())}> {random1 || 'Random1'} </button> ); } function Component2() { const { random2, setRandom2 } = useObserver<State>(); return ( <button onClick={() => setRandom2(Math.random())}> {random2 || 'Random2'} </button> ); } export function App() { return ( <> <Component1 /> <Component2 /> </> ); }

در این مثال، ما با ارسال یک آرایه حاوی نام مقادیر random1 و random2 به متد subscribe، تغییرات آن مقادیر را با استفاده از یک تابع به نام listener مشاهده میکنیم.

سپس دو کامپوننت به نام های ، Component1 و Component2 را تعریف می کنیم که از هوک useObserver برای دسترسی به مقادیر فعلی random1 و random2 استفاده می کنند. هر کامپوننت همچنین دکمه ای را ارائه می دهد که با کلیک کردن روی آن ، مقدار مربوطه را با استفاده از تابع setRandom1 یا setRandom2 به روز می کند.

در نهایت، ما هر دو Component1 و Component2 را در کامپوننت App رندر می‌کنیم، به طوری که تغییرات random1 و random2 توسط تابع listener قابل نظارت است.

نظارت بر تمامی مقادیر

برای نظرات بر تغییرات برای همه مقادیر موجود در استیت، می توانید هنگام subscribe از کلید * به جای آرایه ای از نام مقادیراستفاده کنید. این به شما امکان می دهد به تغییرات برای همه مقادیر موجود در استیت گوش دهید.

import { observer, useObserver } from 'rosma'; observer.subscribe('*', listener); function listener({ random1, random2 }) { if ((random1 || random2) === undefined) return; alert(`Random1: ${random1},\nRandom2: ${random2}`); } function Component1() { const { random1, setRandom1 } = useObserver(); return ( <button onClick={() => setRandom1(Math.random())}> {random1 || 'random1'} </button> ); } function Component2() { const { random2, setRandom2 } = useObserver(); return ( <button onClick={() => setRandom2(Math.random())}> {random2 || 'Random2'} </button> ); } export function App() { return ( <> <Component1 /> <Component2 /> </> ); }
import { observer, useObserver } from 'rosma'; type State = { random1: number; random2: number; }; observer.subscribe('*', listener); function listener({ random1, random2 }: State) { if ((random1 || random2) === undefined) return; alert(`Random1: ${random1},\nRandom2: ${random2}`); } function Component1() { const { random1, setRandom1 } = useObserver<State>(); return ( <button onClick={() => setRandom1(Math.random())}> {random1 || 'random1'} </button> ); } function Component2() { const { random2, setRandom2 } = useObserver<State>(); return ( <button onClick={() => setRandom2(Math.random())}> {random2 || 'Random2'} </button> ); } export function App() { return ( <> <Component1 /> <Component2 /> </> ); }

در این مثال، ما از کلید * به عنوان اولین پارامتر متد subscribe برای گوش دادن به تغییرات در تمام مقادیر حالت استفاده می کنیم. تابع listener کل آبجکت استیت را به عنوان آرگومان دریافت می کند و ما می توانیم آن به مقادیری که به آنها علاقه داریم دسترسی داشته باشیم.

کلید واژه ها: رُزما, observer, useObserver, استیت, مدیریت استیت, نظارت بر تغییرات استیت, نظارت بر چند مقدار, ری اکت, کامپوننت, ری رندر

قبلی: استفاده از چند مشاهده گر

بعدی: withState