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 🙏

© 2024 – Pkg Stats / Ryan Hefner

react-with-throttle

v1.0.7

Published

Component for throttling value, preserving the declarative nature of React

Downloads

25

Readme

See working example here.

Installation

$ yarn add react-with-throttle # or using npm

Overview

react-with-throttle wraps throttle function in a react component, keeping all your components to be declarative. It accepts value prop that changes over time, and forwards it through render prop. One of the use cases is for throttling scroll event.

Usage

import React, { Component } from 'react';
import WithThrottle from 'react-with-throttle';

class FloatingTextOnScroll extends Component {
  // ... listen scrollTop of body

  render() {
    const { top } = this.state;

    return (
      <WithThrottle value={top} wait={120}>
        {this.renderText}
      </WithThrottle>
    )
  }

  renderText(throttledTop) {
    return <FloatingText top={throttledTop} />;
  }
}

⚠️ Important Note ⚠️

Make sure your render function is not recreated every time the parent rerenders. The same with the other props when passing an object or other non-primitive types. For example:

Incorrect ❌

import React, { Component } from 'react';
import WithThrottle from 'react-with-throttle';

class Foo extends Component {
  render() {
    const { foo } = this.state;
  
    return (
      <WithThrottle
        wait={100}
        value={{ bar: foo }} // object will be recreated every rerender
        options={{ leading: true, trailing: true }} // Also in this one
      >
        {(value) => `${value.bar}-baz`} {/* function will be recreated */}
      </WithThrottle>
    )
  }
}

react-with-throttle is responsible for limiting rerendering of value changes. Conversely, the other props are shallowly compared. So, if these props keep changing, there is no way it can throttle the rerendering.

Hence, you need to keep the non-primitive props' references to avoid unexpected behaviour or performance issue. You can also use memoization to achieve this, one good library is memoize-one.

Correction ✅

import React, { Component } from 'react';
import WithThrottle from 'react-with-throttle';
import memo from 'memoize-one';

const options = { leading: true, trailing: true };

class Foo extends Component {
  makeValue = memo(foo => ({ bar: foo }));

  renderContent(value) {
    return `${value.bar}-baz`;
  }

  render() {
    const { foo } = this.state;

    return (
      <WithThrottle
        wait={100}
        value={this.makeValue(foo)}
        options={options}
      >
        {this.renderContent}
      </WithThrottle>
    )
  }
}

Using Hook ✅

import React, { useMemo } from 'react';
import useSomeState from './utils';

const options = { leading: true, trailing: true };

function Foo() {
  const [state] = useSomeState();
  const value = useMemo(() => ({ bar: state.foo }), [state.foo]);
  const renderContent = useCallback(({ bar }) => `${bar}-baz`);

  return (
    <WithThrottle
      wait={100}
      value={value}
      options={options}
    >
      {renderContent}
    </WithThrottle>
  );
}

API

<WithThrottle> component accepts these following props:

Name | Description | Type | Default -------------|-----------|-----------|--------- value | Value to be throttled and forwarded to the children render function by argument. | any | wait | Throttle interval in ms. In other words, the component will not rerender until the wait time after value changes. | number | children | Render prop with the forwarded throttled value. | (value: any) => Node | options | Throttling options. Please refer to lodash throttle documentation. | [{[leading]: boolean, [trailing]: boolean }] | undefined

Changelog

Changes are tracked in the changelog.

License

react-with-throttle is available under the MIT License.