Huge News!Announcing our $40M Series B led by Abstract Ventures.Learn More
Socket
Sign inDemoInstall
Socket

@solid-primitives/refs

Package Overview
Dependencies
Maintainers
3
Versions
24
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@solid-primitives/refs

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

  • 0.0.102
  • Source
  • npm
  • Socket score

Version published
Weekly downloads
57K
increased by18.65%
Maintainers
3
Weekly downloads
 
Created
Source

@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:
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.

Keywords

FAQs

Package last updated on 13 Feb 2022

Did you know?

Socket

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Install

Related posts

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc