JSPM

  • ESM via JSPM
  • ES Module Entrypoint
  • Export Map
  • Keywords
  • License
  • Repository URL
  • TypeScript Types
  • README
  • Created
  • Published
  • Downloads 109551
  • Score
    100M100P100Q173490F
  • License MIT

Library of primitives, components and directives for SolidJS that help managing references to JSX elements.

Package Exports

  • @solid-primitives/refs
  • @solid-primitives/refs/dist/index.cjs
  • @solid-primitives/refs/dist/index.js

This package does not declare an exports field, so the exports above have been automatically detected and optimized by JSPM instead. If any package subpath is missing, it is recommended to post an issue to the original package (@solid-primitives/refs) to support the "exports" field. If that is not possible, create a JSPM override to customize the exports field for this package.

Readme

@solid-primitives/refs

lerna size version stage

Collection of primitives, components and directives that help managing references to JSX elements, keeping track of mounted/unmounted elements.

Primitives:
  • elements - Reactive signal that filters out non-element items from a signal array. (Can be used with children primitive)
  • refs - Get signal references to Elements of the reactive input. Which were added, which were removed. (Can be used with children primitive)
  • mapRemoved - Similar to Solid's mapArray, but you map the elements that were removed from source array. Leting you keep them for longer.
Directive:
  • unmount - A directive that calls handler when the element get's unmounted from DOM.
Components:
  • <Children> - Solid's children helper in component form. Access it's children elements by get property.
  • <Refs> - Get up-to-date references of the multiple children elements.
  • <Ref> - Get up-to-date reference to a single child element.
Vanilla helpers:
  • getChangedItems - Tells you which elements got added to the array, and which got removed
  • getAddedItems - Tells you elements got added to the array
  • getRemovedItems - Tells you which elements got removed from the array

Installation

npm install @solid-primitives/refs
# or
yarn add @solid-primitives/refs

Primitives


elements

Reactive signal that filters out non-element items from a signal array. (Can be used with children primitive)

How to use it

import { elements } from "@solid-primitives/refs";

const resolved = children(() => props.children);
const els = elements(resolved);
els(); // T: Element[]

// or narrow down the element type
const divs = elements(resolved, HTMLDivElement);
divs(); // T: HTMLDivElement[]

refs

Get signal references to Elements of the reactive input. Which were added, which were removed. (Can be used with children primitive)

Used internally by <Refs> component.

How to use it

import { refs } from "@solid-primitives/refs";

const resolved = children(() => props.children);
const [els, added, removed] = refs(resolved);
els(); // T: Element[]
added(); // T: Element[]
removed(); // T: Element[]

// or narrow down the element type
const [els, added, removed] = refs(resolved, HTMLDivElement);
els(); // T: HTMLDivElement[]
added(); // T: HTMLDivElement[]
removed(); // T: HTMLDivElement[]

mapRemoved

Reactively map removed items from a reactive signal array. If the mapping function return an element signal, this element will be placed in the array returned from primitive.

How to use it

import { combined } from "@solid-primitives/refs";

const MyComp = props => {
  const resolved = children(() => props.children);

  const combined = mapRemoved(resolved, (ref, index) => {
    const [el, setEl] = createSignal(ref);

    // apply styles/animations to removed element
    ref.style.filter = "grayscale(100%)";

    // computations can be created inside the mapping fn
    createEffect(() => {
      // index is a signal
      index();
    });

    const remove = () => {
      // ...later
      // by setting returned signal to undefined
      // element get's removed from combined array permanently
      setEl(undefined);
    };

    // you can return a signal with element to keep it in the combined array
    return el;
  });

  return combined;
};

Directive


unmount

A directive that calls handler when the element get's unmounted from DOM.

Import

import { unmount } from "@solid-primitives/refs";
// place it somewhere in the code to prevent it from being tree-shaken
unmount;

How to use it

const [ref, setRef] = createSignal<Element | undefined>();

<div ref={el => setRef(el)} use:unmount={() => setRef(undefined)}>
  Hello
</div>;

Components


<Children>

Solid's children helper in component form. Access it's children elements by get property.

How to use it

import {Children, ResolvedJSXElement} from "@solid-primitives/refs"

// typing as JSX.Element also works
const [children, setChildren] = createSignal<ResolvedJSXElement>([])

<Children get={setChildren}>
   <div></div>
   ...
</Children>

<Ref>

Get up-to-date reference to a single child element.

Import

import { Ref } from "@solid-primitives/refs";

How to use it

<Ref> accepts these properties:

  • ref - Getter of current element (or undefined if not mounted)
  • onMount - handle the child element getting mounted to the dom
  • onUnmount - handle the child element getting unmounted from the dom
const [ref, setRef] = createSignal<Element | undefined>();

<Ref
  ref={setRef}
  onMount={el => console.log("Mounted", el)}
  onUnmount={el => console.log("Unmounted", el)}
>
  <Show when={show()}>
    <div>Hello</div>
  </Show>
</Ref>;
Providing generic Element type
<Ref<HTMLDivElement>
  ref={el => {...}} // HTMLDivElement | undefined
  onMount={el => {...}} // HTMLDivElement
  onUnmount={el => {...}} // HTMLDivElement
>
  <div>Hello</div>
</Ref>

<Refs>

Get up-to-date references of the multiple children elements.

Import

import { Refs } from "@solid-primitives/refs";

How to use it

<Refs> accepts these properties:

  • refs - Getter of current array of elements
  • added - Getter of added elements since the last change
  • removed - Getter of removed elements since the last change
  • onChange - handle children changes
const [refs, setRefs] = createSignal<Element[]>([]);

<Refs
  refs={setRefs}
  added={els => console.log("Added elements", els)}
  removed={els => console.log("Removed elements", els)}
  onChange={e => console.log(e)}
>
  <For each={my_list()}>{item => <div>{item}</div>}</For>
  <Show when={show()}>
    <div>Hello</div>
  </Show>
</Refs>;
Providing generic Element type
<Refs<HTMLDivElement>
  refs={els => {}} // HTMLDivElement[]
  added={els => {}} // HTMLDivElement[]
  removed={els => {}} // HTMLDivElement[]
  // { refs: HTMLDivElement[]; added: HTMLDivElement[]; removed: HTMLDivElement[] }
  onChange={e => {}}
>
  <div>Hello</div>
</Refs>

Demo

https://stackblitz.com/edit/solid-vite-unocss-bkbgap?file=index.tsx

(run npm start in the terminal)

Changelog

Expand Changelog

0.0.100

Initial release as a Stage-1 primitive.