نظارت بر تغییرات
در بخش های قبل در مورد متد subscribe
توضیح دادیم. اما در این بخش کمی بیشتر به آن خواهیم پرداخت.
در اکثر حالت ها ما نیاز داریم تا با تغییر کردن مقادیر استیت، یک ریرندر در کامپوننت ری اکت ما ایجاد شود. ولی در برخی مواقع نیاز میشود که بدون ایجاد کردن ری رندر اضافه، بخواهیم تغییرات یک مقدار را رصد کنیم. در این حالت میتوان از متد subscribe
موجود در observer
استفاده کرد.
متد subscribe
را میتوان در دو بخش مختلف از اپ استفاده کرد .
- خارج از کامپوننت ری اکت
- داخل هوک 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>
);
}
در این مثال، ما با استفاده از متد 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>
);
}
رصد تغییرات چند مقدار
با استفاده از یک تابع 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 />
</>
);
}
در این مثال، ما با ارسال یک آرایه حاوی نام مقادیر 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 />
</>
);
}
در این مثال، ما از کلید *
به عنوان اولین پارامتر متد subscribe برای گوش دادن به تغییرات در تمام مقادیر حالت استفاده می کنیم. تابع listener کل آبجکت استیت را به عنوان آرگومان دریافت می کند و ما می توانیم آن به مقادیری که به آنها علاقه داریم دسترسی داشته باشیم.
کلید واژه ها: رُزما, observer, useObserver, استیت, مدیریت استیت, نظارت بر تغییرات استیت, نظارت بر چند مقدار, ری اکت, کامپوننت, ری رندر
قبلی: استفاده از چند مشاهده گر
بعدی: withState