Socket
Socket
Sign inDemoInstall

@solid-primitives/refs

Package Overview
Dependencies
5
Maintainers
3
Versions
24
Alerts
File Explorer

Advanced tools

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.


Version published
Weekly downloads
16K
decreased by-10.75%
Maintainers
3
Install size
93.6 kB
Created
Weekly downloads
 

Readme

Source

Solid Primitives Refs

@solid-primitives/refs

turborepo size version stage

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

Primitives:

Installation

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

mergeRefs

Utility for chaining multiple ref assignments with props.ref forwarding.

How to use it

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

interface ButtonProps {
  ref?: Ref<HTMLButtonElement>;
}

function Button(props: ButtonProps) {
  let ref: HTMLButtonElement | undefined;
  onMount(() => {
    // use the local ref
  });

  return <button ref={mergeRefs(props.ref, el => (ref = el))} />;
}

// in consumer's component:
let ref: HTMLButtonElement | undefined;
<Button ref={ref} />;

resolveElements

Utility for resolving recursively nested JSX children to a single element or an array of elements using a predicate.

How to use it

resolveElements's API is similar to Solid's children helper. It accepts a function that returns JSX children and a predicate function that filters the elements.

function Button(props: ParentProps) {
  const children = resolveElements(() => props.children);
  //      ^?: Accessor<Element | Element[] | null>

  return (
    // Similarly to `children` helper, a `toArray` method is available
    <For each={children.toArray()}>
      {child => (
        <div>
          {child.localName}: {child}
        </div>
      )}
    </For>
  );
}

Using a custom predicate

The default predicate is el => el instanceof Element. You can provide a custom predicate to resolveElements to filter the elements.

const els = resolveElements(
  () => props.children,
  (el): el is HTMLDivElement => el instanceof HTMLDivElement,
);

els(); // => HTMLDivElement | HTMLDivElement[] | null

On the server side the custom predicate will be ignored, but can be overridden by passing it as a third argument.

The default predicate can be imported from @solid-primitives/refs:

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

On the client it uses instanceof Element check, on the server it checks for the object with t property. (generated by compiling JSX)

resolveFirst

Utility for resolving recursively nested JSX children in search of the first element that matches a predicate.

How to use it

resolveFirst matches the API of resolveElements but returns only the first element that matches the predicate.

function Button(props: ParentProps) {
  const child = resolveFirst(() => props.children);
  //     ^?: Accessor<Element | null>

  return (
    <div>
      {child()?.localName}: {child()}
    </div>
  );
}

resolveFirst also accepts a custom predicate as a second argument. See Using a custom predicate section for more details.

<Ref>

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

How to use it

<Ref> accepts only a ref property for getting the current element or undefined, and requires children to be passed in.

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

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

<Ref ref={setRef}>{props.children}</Ref>;

<Refs>

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

How to use it

<Refs> accepts only a ref property for getting the current array of elements, and requires children to be passed in.

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

const [refs, setRefs] = createSignal<Element[]>([]);

<Refs ref={setRefs}>
  <For each={my_list()}>{item => <div>{item}</div>}</For>
  <Show when={show()}>
    <div>Hello</div>
  </Show>
</Refs>;
Demo

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

(run npm start in the terminal)

Types

Ref

Type for the ref prop

export type Ref<T> = T | ((el: T) => void) | undefined;

RefProps

Component properties with types for ref prop

interface RefProps<T> {
  ref?: Ref<T>;
}

Changelog

See CHANGELOG.md

Keywords

FAQs

Last updated on 05 Mar 2024

Did you know?

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

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc