createSignal

سیگنالی در ساده‌ترین شکل: [خواندن، نوشتن]، و در صورت خواست، پخش خبر روی گذرگاه مشترک subscribers تا پیمانه‌های بی‌ربط هم بتوانند به دگرگونی واکنش نشان دهند.

API

createSignal(value, options?)

پارامترها

پارامتر توضیح نوع پیش‌فرض
value مقدار آغازین T الزامی
options.subscriber نام رویداد؛ هنگام دگرگونی روی subscribers خبر می‌دهد string undefined
options.equals اینکه «آیا عوض شد» چگونه سنجیده شود boolean | ((prev: T, next: T) => boolean) true

معنای equals:

مقدار رفتار
نیامده یا true Object.is: برابری ارجاعی یا مقداری (رفتار استاندارد سیگنال‌ها)
false هر نوشتن دگرگونی به شمار می‌آید و خبر می‌دهد
یک تابع بازگرداندن true یعنی «برابرند، خبر نده»

بازگشت

[getter, setter].

نمونه

import { createSignal, isEqual, subscribers } from 'ranuts';

const [count, setCount] = createSignal(0, { subscriber: 'count-changed' });
subscribers.tap('count-changed', () => render(count()));

setCount(1); // خبر می‌دهد
setCount(1); // همان مقدار — خبری نمی‌دهد

// مقایسهٔ ژرف را تنها وقتی واقعاً لازم دارید برگزینید
const [tree, setTree] = createSignal(initial, { equals: isEqual });

یادداشت‌ها

  1. به‌طور پیش‌فرض برابری ارجاعی است. شیئی که تازه ساخته شده ولی درونش یکی است، دگرگونی هست. این همان رفتار استاندارد سیگنال‌هاست و نوشتن را در O(1) نگه می‌دارد.
  2. مقایسهٔ ژرف را باید خواست، با { equals: isEqual }، تا هزینه‌اش در محل فراخوانی پیدا باشد.
  3. subscriber اختیاری است. بی آن، سیگنال صرفاً حالتی محلی است.

::: warning در ۰٫۳ دگرگون شد دو اصلاح که رفتار را عوض می‌کنند:

  • { equals: true } پیش‌تر یعنی «همیشه برابر»، که سیگنال را می‌بست و هرگز به‌روز نمی‌شد. اکنون یعنی «از مقایسهٔ پیش‌فرض استفاده کن»، هم‌سنگ undefined.
  • پیش‌تر هر نوشتن، افزون بر equals، cloneDeep و isEqual را هم می‌دواند. این یعنی گذاشتن رونوشتی به اندازهٔ داده روی مسیر پرتردد نوشتن، و آن وارسی ژرفِ اضافه equals را از کار می‌انداخت، پس { equals: false } («همیشه خبر بده») برای مقدارهای درون‌یکسان خاموشانه هیچ نمی‌کرد. هر دو برداشته شدند. :::