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

bindcache

v2.0.0

Published

Cache/memoize result of bind function with its context or/and args (with shims)

Downloads

6

Readme

BindCache

It caches/memoizes result of binding function with its context and args. For the same set it returns identical result every time.

This version uses es6-map and es6-weak-map shims from your peerDependencies. If you don't need them or you use other shims for Map and WeakMap you should use cachebind instead of this.

Motivation

It solves the problem of unnecessary renders cased by use of Function.prototype.bind function in render method. It also keep up with jsx-no-bind rule which is used to detect such issues.

class MyComponent extends Component {
    onChange() {
        // ...    
    }

    render () {
        const { param } = this.props
        return (
            <div>
                <SomeComponent someParam={"value"}>
                <OtherComponent callback={this.onChange.bind(this, param, "MyComponent")}/>
            </div>    
        )
    }
}

This code will make OtherComponent to render every time this render function will be fired.

Api

If you need to bind context:

bind(context: any, fn: () => void, args?: any | Array<any>)

If you don't need context:

bindArgs(fn: () => void, args?: any | Array<any>)
  • context — context,
  • fn — function to bind,
  • args — any number of arguments of any type devided by commas.

Usage

npm install bindcache
import { bind } from "bindcache"

class MyComponent extends Component {
    onChange(param, component) {
        // ...
    }

    render () {
        const { param } = this.props
        return (
            <div>
                <SomeComponent someParam={"value"}>
                <OtherComponent callback={bind(this, this.onChange, param, "MyComponent")}/>
            </div>    
        )
    }
}

If you don't need the context of the function or it is already present/binded you can use bindArgs util instead. The previous code can be written like this.

import { bindArgs } from "bindcache"

class MyComponent extends Component {
    onChange = (param, component) => { /* ... */ }

    render () {
        const { param } = this.props
        return (
            <div>
                <SomeComponent someParam={"value"}>
                <OtherComponent callback={bindArgs(this.onChange, param, "MyComponent")}/>
            </div>
        )
    }
}

bindArgs(fn, ...args) is equal to bind(undefined, fn, ...args)

How it works

The util caches results of binding in native WeakMap so the items with no references can be garbage collected.

Tips

bind util lets you feed it with context for the function. You can use arrow function (as it was shown above), or bind context once with decorator:

class MyComponent extends Component {
    @autoBind
    onChange(param, component) {
        // ...
    }
    // ...
}

or cache the result of binding in constructor:

class MyComponent extends Component {
   constructor(props) {
       super(props)
       this.onChange = this.onChange.bind(this)
   }

   onChange(param, component) {
       // ...
   }
   // ...
}

It is not suggested to use this utils instead of Function.prototype.bind in every case. The original bind function is still faster. For example if you need to bind context with no args or your params are static for the component you can bind it one time in constructor function. But it will help you great deal in case of unnecessary renders of react components.