npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2025 – Pkg Stats / Ryan Hefner

react-render-prop

v0.0.1

Published

Helper React hook to consume and flatten render-props

Downloads

23

Readme

react-render-prop

Helper React hook to consume and flatten render-props.

At a Glance

Sample usage:

import { useRenderProp } from 'react-render-prop';

function MyComponent() {
  // valueA and valueB are filled in on next render
  const [libraryWidgetSink, valueA, valueB] = useRenderProp();

  // ... do something with the returned values

  return (
    <LibraryWidget>
      {libraryWidgetSink}
    </LibraryWidget>
  );
}

Rationale

In React code, the render-props pattern is a popular way to have a sub-component return some data to the calling code. For example:

function MyComponent() {
  return (
    <LibraryWidget>
      {(valueA, valueB) => {
        // ... do something with the returned values

        return <MyContent />;
      }}
    </LibraryWidget>
  );
}

However, we often need to "hoist" those returned values back up to the top-level logic of MyComponent. I.e. after the first render is completed, we want to collect those values exposed to the render-prop body and then re-render MyComponent - this time with awareness of that returned data.

Essentially, we want to be able to place a useEffect inside render-prop content (to detect new arg values) plus a useState at the top-level to receive and store those values.

This library is a convenient helper hook to accomplish that. The hook is invoked with no parameters and returns an array with the following:

  • render-prop "sink" callback - insert this where render-prop body would normally go
  • values collected from the "sink" - whatever the component passes to render-prop body will be exposed here

So, if the render-prop component is designed to pass valueA and valueB to the prop content function, do this:

const [libraryWidgetSink, valueA, valueB] = useRenderProp();

And then when rendering the render-prop component, pass the "sink" callback to it:

<LibraryWidget>
  {libraryWidgetSink}
</LibraryWidget>

This works for components that use other kinds of render-props, not just function-as-a-child:

<LibraryWidget someRenderProp={libraryWidgetSink} />

The "sink" callback produced by this helper hook will always return a React element. As long as the component render-prop expects a function that returns React content, you can put that "sink" in there. Just make sure to not use the same callback in two different spots or inside a loop.

Infinite render loop warning: be aware that this hook triggers a re-render any time the values passed to the "sink" change. If the render-prop component passes a new instance of an object into the "sink" on every render, then the "sink" will keep scheduling more and more re-renders of the top-level component, causing an infinite render loop. This can be fixed via memoization for now, but there is a plan to add a "toDeps" parameter to the hook for explicit control.