0.1.0 • Published 1 year ago

rescript-preact-signals v0.1.0

Weekly downloads
-
License
GPL-3.0-or-later
Repository
github
Last release
1 year ago

rescript-preact-signals

Rescript bindings for @preact/signals

Installation

npm install @preact/signals-core rescript-preact-signals

Or if you want the react integration:

npm install @preact/signals-react rescript-preact-signals

Usage

Create a signal

let signal = PreactSignals.Core.make("initial value")

Basic Usage

open PreactSignals.Core
let signal = PreactSignals.Core.make("initial value")

// Get signal current value
signal->val->Js.console.log

// Update a signal's value
signal->set("new value")

Computed (derived) values

open PreactSignals.Core
let signal = PreactSignals.Core.make("initial value")

let uppercaseSignal = computed(() => signal->val->Js.String2.toUpperCase)
uppercaseSignal->val->Js.Console.log // Would print "INITIAL VALUE"

Effects

open PreactSignals.Core
let signal = PreactSignals.Core.make("initial value")

effect(() => Js.Console.log(signal->val))
signal->set("new value") // Will trigger the console.log

You can delete an effect and all things that listen to it:

open PreactSignals.Core
let signal = PreactSignals.Core.make("initial value")

let dispose = effectWithCleanup(() => Js.Console.log(signal->val))
dispose()
signal->set("new value") // Nothing will happen

Batch updates

open PreactSignals.Core
let signal = PreactSignals.Core.make("initial value")
let otherSignal = PreactSignals.Core.make("other initial value")

// All updates happens after the callback executes
batch(() => {
  signal->set("new value")
  otherSignal->set("other new value")
})

RescriptReact integration

Re-rendering

let counterSignal = PreactSignals.React.make(0)

@react.component
let make = () => 
  //Everytime signal's value updates, component will re-render
  <span>counter value is: {counterSignal->val}</span>

Hooks

If you need to instantiate new signals inside your components, you can use the useSignal or useComputed hook.

open PreactSignals.ReactHooks

@react.component
let make = () => {
  let counter = useSignal(0)
  let double = useComputed(() => counter->val * 2)
  
  <div>
    <span>Counter value is: {counter->val} and it's double is: {double->val}</span>
    <button onClick={() => counter->set(counter->val + 1)}>Increment counter</button>
  </div>
}