useObserver
useObserver یک هوک React است که تغییرات اخیر در مقادیری که از آن دریافت میکنید را رصد میکند و با تغییرات آن مقادیر، کامپوننت شما را مجدداً رندر میکند.
در هنگام استفاده از useObserver، شما میتوانید برای متغیری که دریافت میکنید، یک مقدار اولیه در نظر بگیرید. اگر این متغیر قبلاً در استیت تعریف نشده باشد، مقدار اولیه شما در استیت برای آن متغیر ثبت میشود. اما اگر قبلاً یک مقدار برای آن متغیر موجود باشد، متغیر دریافتی از useObserver با همان مقدار قبلی مقداردهی میشود.
علاوه بر مقدار متغیر، useObserver یک تابع setter (تنظیم کننده) نیز برای آن متغیر ارائه میدهد که میتوانید از آن برای بهروزرسانی مقدار متغیر استفاده کنید. با فراخوانی تابع setter، useObserver وضعیت استیت را با مقدار جدید بهروز میکند و باعث میشود که کامپوننت شما مجدداً رندر شود.
در اینجا یک مثال از نحوه استفاده از useObserver آورده شده است:
import { useObserver } from 'rosma';
export default function Example() {
const { foo, setFoo } = useObserver('bar');
return (
<div>
<p>Foo: {foo}</p>
<button onClick={() => setFoo(foo === 'bar' ? 'baz' : 'bar')}>
Toggle Foo
</button>
</div>
);
}
Foo: bar
در این مثال از useObserver برای ثبت یک متغیر در استیت، به نام foo با مقدار اولیه bar استفاده شده است. همانطور که مشاهده میشود در کنار مقدار foo یک تابع setter با نام setFoo از useObserver دریافت شده تا با استفاده از آن، بعد از کلیک شدن روی دکمه Toggle Foo مقدار foo در استیت را به روز رسانی کنیم.
دریافت مقدار قبلی از تابع تنظیم کننده
در زمان تنظیم یک مقدار جدید، ممکن است نیاز داشته باشیم به مقدار قبلی آن متغیر در استیت دسترسی داشته باشیم. برای رسیدن به این هدف، میتوانیم یک تابع را به عنوان پارامتر به تابع setter که از useObserver دریافت میکنیم، ارسال کنیم. این تابع مقدار قبلی متغیر را به عنوان ورودی دریافت کرده و مقدار جدید آن متغیر را برای ثبت شدن در استیت بر میگرداند.
در اینجا یک مثال از نحوه استفاده از یک تابع برای دریافت مقدار قبلی متغیر از استیت و تنظیم مقدار جدید آمده است.
import { useObserver } from 'rosma';
export default function Example() {
const { foo, setFoo } = useObserver('bar');
return (
<div>
<p>Foo: {foo}</p>
<button
onClick={() => setFoo((prevFoo) => (prevFoo === 'bar' ? 'baz' : 'bar'))}
>
Toggle Foo
</button>
</div>
);
}
Foo: bar
در این مثال از تابع setFoo برای تنظیم مقدار foo بر اساس مقدار قبلی آن استفاده میکنیم. تابع ارسال شده به setFoo مقدار قبلی foo را به عنوان آرگومان دریافت میکند و ما میتوانیم آن را به عنوان prevFoo نامگذاری کنیم. سپس از یک عملگر شرطی برای تغییر مقدار foo بین 'bar' و 'baz' استفاده میکنیم.
با استفاده از تابع برای تنظیم مقدار foo، مطمئن میشویم که مقدار جدید بر اساس مقدار قبلی تنظیم میشود و میتوانیم از مسائلی که ممکن است در تنظیم استیت به صورت async پیش بیاید، جلوگیری کنیم.
تنظیم چند مقدار به صورت همزمان
در برخی موارد، ممکن است لازم باشد که چندین متغیر را به صورت همزمان در استیت مقداردهی کنیم. در چنین حالتی، به جای فراخوانی تابع تنظیم کننده برای هر متغیر به صورت جداگانه، میتوانیم از تابع set که توسط useObserver برگردانده میشود، استفاده کنیم.
در مثال زیر، نحوه تنظیم همزمان چندین مقدار در استیت با استفاده از تابع set نمایش داده شده است:
import { useObserver } from 'rosma';
export function Example() {
const { firstName, lastName, set } = useObserver('');
return (
<div>
<p>
Full Name: {firstName} {lastName}
</p>
<button onClick={() => set({ firstName: 'John', lastName: 'Doe' })}>
Set full name
</button>
</div>
);
}
Full Name:
در این مثال، از تابع set
برای تنظیم مقادیر firstName
و lastName
به صورت همزمان استفاده میکنیم. با ارسال یک شی حاوی مقادیر جدید برای هر دو متغیر به تابع set
، میتوانیم آنها را به روز کنیم.
استفاده از تابع set
برای تنظیم چندین مقدار حالت به صورت همزمان، باعث جلوگیری از رندر اضافی شده و افزایش خوانایی کد میشود.
همانطور که می توانید یک تابع را به یک تنظیم کننده ارسال کنید تا وضعیت را بر اساس مقدار حالت قبلی به روز کند، همچنین می توانید یک تابع را به تابع set ارسال کنید تا چندین مقدار حالت را بر اساس وضعیت فعلی به روز کند.
ارسال یک تابع به set
به عنوان پارامتر
همانطور که میتوانید یک تابع را به یک تنظیمکننده ارسال کنید تا وضعیت را بر اساس مقدار قبلی آن متغیر بهروز کند، میتوانید یک تابع را به تابع set
ارسال کنید تا مقدار چندین متغیر را بر اساس وضعیت فعلی استیت بهروز کند.
هنگام ارسال یک تابع با set
، شما تمام شیء استیت فعلی را به عنوان آرگومان دریافت خواهید کرد. این میتواند وقتی مفید است که میخواهید چندین مقدار استیت را بر اساس وضعیت فعلی آن بهروز کنید.
در زیر مثالی از ارسال یک تابع به set
برای افزایش همزمان مقدار دو متغیر در استیت آورده شده است.
import { useObserver } from 'rosma';
export function Example4() {
const { num1, num2, set } = useObserver(0);
return (
<div>
<p>num1: {num1}</p>
<p>num2: {num2}</p>
<button
onClick={() =>
set(({ num1, num2 }) => ({ num1: num1 + 1, num2: num2 + 1 }))
}
>
increment
</button>
</div>
);
}
در این مثال، از تابع set
برای به روز رسانی مقادیر متغیرهای num1 و num2 بر اساس مقادیر فعلی آنها استفاده میکنیم. ما یک تابع را ارسال میکنیم که شیء استیت فعلی را به عنوان آرگومان دریافت کرده و یک شیء جدید با مقادیر به روز شده برای num1 و num2 را برمیگرداند.
استفاده از یک تابع با set
میتواند زمانی مفید باشد که شما نیاز دارید چندین مقدار استیت را به طور همزمان بر اساس مقادیر فعلی آنها به روز کنید.
num1:0
num2:0
کلید واژه ها: useObserver, هوک ری اکت, مقادیر استیت, رندر مجدد, تنظیم کننده, استیت قبلی, فانکشن تنظیم کننده, تنظیم استیت با فانکشن, بروزرسانی استیت, useState
قبلی: مقادیر اولیه متفاوت
بعدی: کلاس مشاهده گر