
Research
Security News
Malicious PyPI Package Exploits Deezer API for Coordinated Music Piracy
Socket researchers uncovered a malicious PyPI package exploiting Deezer’s API to enable coordinated music piracy through API abuse and C2 server control.
Cache/memoize result of bind function with its context or/and args (no-shims version)
It caches/memoizes result of binding function with its context and args. For the same set it returns identical result every time.
This version doesn't use any shims or polyfills. If you don't have their substitutes in your projects you may need to use use version with the shims bindcache instead of this.
It solves the problem of unnecessary renders for React in cases of usage arrow function or Function.prototype.bind
in render method. It also keep up with jsx-no-bind
rule which is used to detact 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.
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>)
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)
The util caches results of binding in native WeakMap so the items with no references can be garbage collected.
bind
util lets you feed it with context for the function. But it is better not to use that option since it will take more memory and be slower. Use bindArg
or bind
with undefined context. 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.
FAQs
Cache/memoize result of bind function with its context or/and args (no-shims version)
The npm package cachebind receives a total of 1 weekly downloads. As such, cachebind popularity was classified as not popular.
We found that cachebind demonstrated a not healthy version release cadence and project activity because the last version was released a year ago. It has 1 open source maintainer collaborating on the project.
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.
Research
Security News
Socket researchers uncovered a malicious PyPI package exploiting Deezer’s API to enable coordinated music piracy through API abuse and C2 server control.
Research
The Socket Research Team discovered a malicious npm package, '@ton-wallet/create', stealing cryptocurrency wallet keys from developers and users in the TON ecosystem.
Security News
Newly introduced telemetry in devenv 1.4 sparked a backlash over privacy concerns, leading to the removal of its AI-powered feature after strong community pushback.