rescript-preact-signals

0.1.0 • Public • Published

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>
}

Package Sidebar

Install

npm i rescript-preact-signals

Weekly Downloads

1

Version

0.1.0

License

GPL-3.0-or-later

Unpacked Size

39.8 kB

Total Files

5

Last publish

Collaborators

  • matheusashton