All Projects â†’ theKashey â†’ React Memoize

theKashey / React Memoize

Licence: mit
🧠 React memoization library we all deserve

Programming Languages

javascript
184084 projects - #8 most used programming language

Projects that are alternatives of or similar to React Memoize

Qmlt
The Quantum Machine Learning Toolbox (QMLT) is a Strawberry Fields application that simplifies the optimization of variational quantum circuits (also known as parametrized quantum circuits).
Stars: ✭ 106 (-15.2%)
Mutual labels:  optimization
Chocolate
A fully decentralized hyperparameter optimization framework
Stars: ✭ 112 (-10.4%)
Mutual labels:  optimization
Riskparity.py
Fast and scalable design of risk parity portfolios
Stars: ✭ 122 (-2.4%)
Mutual labels:  optimization
Pg stat kcache
Gather statistics about physical disk access and CPU consumption done by backends.
Stars: ✭ 106 (-15.2%)
Mutual labels:  optimization
Raytracer.jl
Differentiable RayTracing in Julia
Stars: ✭ 110 (-12%)
Mutual labels:  optimization
Particle Swarm Optimization
Learn about particle swarm optimization (PSO) through Python!
Stars: ✭ 117 (-6.4%)
Mutual labels:  optimization
Grl
Robotics tools in C++11. Implements soft real time arm drivers for Kuka LBR iiwa plus V-REP, ROS, Constrained Optimization based planning, Hand Eye Calibration and Inverse Kinematics integration.
Stars: ✭ 105 (-16%)
Mutual labels:  optimization
Iqa Optimization
Comparison of IQA models in Perceptual Optimization
Stars: ✭ 123 (-1.6%)
Mutual labels:  optimization
Optimus
Image conversion and optimization desktop app.
Stars: ✭ 111 (-11.2%)
Mutual labels:  optimization
Bayesiantracker
Bayesian multi-object tracking
Stars: ✭ 121 (-3.2%)
Mutual labels:  optimization
Miniboxing Plugin
Miniboxing is a program transformation that improves the performance of Scala generics when used with primitive types. It can speed up generic collections by factors between 1.5x and 22x, while maintaining bytecode duplication to a minimum. You can easily add miniboxing to your sbt project:
Stars: ✭ 106 (-15.2%)
Mutual labels:  optimization
Adcme.jl
Automatic Differentiation Library for Computational and Mathematical Engineering
Stars: ✭ 106 (-15.2%)
Mutual labels:  optimization
Serverless Layers
Serverless.js plugin that implements AWS Lambda Layers which reduces drastically lambda size, warm-up and deployment time.
Stars: ✭ 119 (-4.8%)
Mutual labels:  optimization
Strategems.jl
Quantitative systematic trading strategy development and backtesting in Julia
Stars: ✭ 106 (-15.2%)
Mutual labels:  optimization
Mlogger
a lightweight and simple logger for Machine Learning
Stars: ✭ 122 (-2.4%)
Mutual labels:  optimization
Fast zlib
Heavily optimized zlib compression algorithm
Stars: ✭ 105 (-16%)
Mutual labels:  optimization
Node Or Tools
Node.js bindings for or-tools vehicle routing problems
Stars: ✭ 115 (-8%)
Mutual labels:  optimization
Gosl
Linear algebra, eigenvalues, FFT, Bessel, elliptic, orthogonal polys, geometry, NURBS, numerical quadrature, 3D transfinite interpolation, random numbers, Mersenne twister, probability distributions, optimisation, differential equations.
Stars: ✭ 1,629 (+1203.2%)
Mutual labels:  optimization
Next Optimized Images
🌅 next-optimized-images automatically optimizes images used in next.js projects (jpeg, png, svg, webp and gif).
Stars: ✭ 1,870 (+1396%)
Mutual labels:  optimization
Optimus
Optimus is a mathematical programming library for Scala.
Stars: ✭ 119 (-4.8%)
Mutual labels:  optimization

react-memoize 🤯 🧠


memoize

Build status


7kb MobX-level memoization library, which tracks all the arguments you are really depends on.

  • It is not so fast, as reselect, but could handle more cases, and works out of the box.
  • It is not so fast, but much faster, than VDOM tree comparison you will face in case of render trashing.
  • It contain 3 types of memoziation to handle all possible cases.

Uses memoize-state underneath, providing the same magic for get as immer provided to set.

Works fine in all browsers including IE11.

Just write code as you want. It it will be properly memoized.

This is declarative component memoization for React! Based on Dan Abramov's tweet Could change the way you did componentWillReceiveProps, could replace getDerivedStateFromProps, could make things better.

IE11+, React 15 and React 16.3 compatible.

  • Memoize - to create declarative memoized selection.
  • MemoizedFlow - to create declarative memoized flow.
  • MemoizeContext - to create memoized selector from context(or any Consumer).
  • MemoizedRender - to create a render, memoized by a value provided.

Memoize, MemoizedFlow, MemoizeContext accepts one or more functions to select or transform incoming data, and provide result to a function-as-child.

MemoizedRender is memoizing the function-as-child itself.

What is the difference between React-memoize and React.memo? Memo is a "PureComponent", Memoize is more about accurate memoization based on the real props consumption. React-memoize is about "calculation" memoization

Memoize

 import Memoize from 'react-memoize';
 
 <Memoize
   prop1 = "theKey"
   state = {this.state}
   // values from above will be provided to compute function
   compute={({prop1, state}) => heavyComputation(state[prop1])} // Memoize tracks WHAT you are doing 
   pure // Memoize will be a pure component itself
  >
  { result => <Display>{result}</Display>}
  </Memoize>

There is only one prop - compute, all others will be passed inside. Memoize get compute function, add passes all the other props to it, streaming result to the render prop.

If pure prop is set ReactMemoize wil behave as PureComponent, and not update children when could not.

Flow

getDerivedStateFromProps gives you ability to derive a new state from props, while componentDidUpdate enables you to react to the state changes.

MemoizedFlow is getDerivedStateFromState. Following example react to the state changes, allowing to change ordering of rows and applies a pagination.

"The Flow" is safe and performant way to form something from something, and rebuilt then the time calls.

import {MemoizedFlow} from 'react-memoize';

class SortablePageableTable extends Component {
    state = {
    page:0,
    perPage:10,
    filter: I => I
    };
    
    onSortChange = (order) => this.setState(order)
    onPageChange = page => this.setState(page);
    
    render () {
    return (
          <MemoizedFlow 
          input={{...this.props, ...this.state}}
          flow={[
            // will react on rows or filter change
            ({rows, filter}) => ({rows: list.filter(filter)}),
            // will react on rows(from step1) change or order
            ({rows, order}) => ({rows: list.slice().sort(order)}), // !! clone array before sort
            // will react on rows and pagination changes
            ({rows, page, perPage}) => ({rows: list.slice(page*perPage, (page+1)*perPage)}),
            // will react on something else, not related
            ({rain, bows}) => ({rainbows: rain+bows, rain: null, bows: null })
            ]}
          >
            {output => <Table {...output} onSortChange={this.onSortChange} onPageChange={this.onPageChange}/>}
          </MemoizedFlow>
    }
}

<SortablePageableTable rows = {tableRows} />

First step is getting input, and each following is reading from a value provided before, spreading own result over it. Until the last step will be reached, and output will be provided to render prop.

Each step is memoized, as usual, and will always reuse value from the steps before.

MemoizeContext

React memoize also provides component to select and memoize data from React16 context, or any other component which will pass some values into renderProp.

import {MemoizeContext} from 'react-memoize';

<Context.Provider value={{prop1: 1, prop2: 2, prop3: 3}}>
    <MemoizeContext consumer={Context.Consumer} selector={select}>
      {values => <Render {...values} />}
    </MemoizeContext>
</Context.Provider>

consumer could be any "context"-compatible Component - React.context, create-react-context, unstated, react-copy-write. All the additional props will be passed down to consumer.

It is better to explain using example.

<MemoizeContext consumer={Consumer} prop1={1} anotherProp={3} selector={select}> />

// will result

<Consumer prop1={1} anotherProp={3}>
{ contextValues => <ReactMemoize {...contextValues} compute={selector}>...</ReactMemoize>}
</Consumer>

This is like Redux without dispatching. State in context, selector aka mapStateToProps, and magic memoization in between.

See it in action -> https://codesandbox.io/s/xjz5y3wzrz 🛠

MemoizedRender

MemoizedRender is mostly usable with Context API

import {MemoizedRender} from 'react-memoize';

<Context.Provider value={{prop1: 1, prop2: 2, prop3: 3}}>
    <MemoizedRender consumer={Context.Consumer}>
      {values => <Render {...select(values)} />}
    </MemoizedRender>
</Context.Provider>

Or, the better example (from react-copy-write)

const UserAvatar = ({ id }) => (
  <MemoizedRender consumer={State.Consumer}>
    {state => (
      <div className="avatar">
        <img src={state.users[id].avatar.src} />
      </div>
    )}
  </MemoizedRender>
);

While react-copy-write declares that _ The problem with this is that whenever any value in state changes, UserAvatar will be re-rendered, even though it's only using a single property from a single, nested object._ This example will work, as long MemoizedRender will track used keys, and perform update only when necessary.

It is also possible to provide value as a prop

<MemoizedRender value={originalValue}>
  {values => <Render {...select(values)} />}
</MemoizeContext>

MemoizedRender memoizes "render" as a whole. This is absolute pure component. Be carefull. Might be not 100% compatible with async rendering if you pass values you were provided down the tree, as long async accessed keys are not tracked. Thus - MemoizedRender may not react to changes in them.

About

React-memoize uses memoize-state underneath to perform MobX like memozation and achive the maximal minimal level of memoization cache misses. Sounds a bit strange, but this mean - react-memoize will try to preserve the current state at all costs. From 10% to 50% "more" in comparison.

In all the cases only ONE! result is memoized. The goal of the component is to cut off updates.

For example:

  • recomputation will be made only when stateSubKey is changed
 <Memoize
   state = {this.state}   
   compute={({state}) => soSomethingWith(state.stateSubKey)}
  >
  { result => ....}
  </Memoize>
  • recomputation will be made only when used prop is changed
 <Memoize
   usedProp = {1}   
   unusedProp = {2}
   compute={({usedProp}) => soSomethingWith(usedProp)}
  >
  { result => ....}
  </Memoize>
  • recomputation will be make only when item count changes, value of any item or text of items passed thought the filter.
 <Memoize
   list = {this.state.list}   
   compute={({list}) => list.filter(item => item.value).map(item => item.text)}
  >
  { result => ....}
  </Memoize>

The same magic as in beautiful-react-redux, kudos to memoize-state library.

PS: For systems without Proxy support memoize will use memoize-one

Licence

MIT

Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].