Comments (15)
The propsMapper
parameter of mapPropsOnChange()
receives the entire props object, not just the dependent props. So you can achieve what you're looking for like so:
mapPropsOnChange(
['foo', 'bar'],
({ foo, bar, ...rest }) => ({
foobar: computationallyIntensiveFunction(foo, bar) // computed prop
...rest // rest of props
}),
BaseComponent
)
from recompose.
This will not work!
propsMapper will be called only if foo
or bar
has changed,
but if changed something in the rest you will got the old childProps
from recompose.
As I wrote the only way to make it work is to combine props with childProps at render
return createElement(BaseComponent, {...this.props, ...this.childProps})
from recompose.
Oh... I see what you mean now. Need to write a failing test case.
from recompose.
But looks like mapPropsOnChange is the good name for current behavior,
it looks like for new behavior it will be better to create something like withPropsOnChange
?
from recompose.
Actually, probably need to rethink mapPropsOnChange()
entirely. I don't like mapping the entire props object, but then mixing it back into the original props object.
from recompose.
Sounds good, thank you!
from recompose.
I dunno about withPropsOnChange()
either... could work.
from recompose.
Maybe we can avoid this confusion by having the propsMapper
not receive the entire props object, only the dependent props. Then combine with the rest of the props at the end.
from recompose.
This will work. There is no need in computation to use nondependent props.
Like this?
import { Component } from 'react'
import pick from 'lodash/object/pick'
import omit from 'lodash/object/omit'
import shallowEqual from 'recompose/shallowEqual'
import createHelper from 'recompose/createHelper'
import createElement from 'recompose/createElement'
const mapPropsOnChange = (depdendentPropKeys, propsMapper, BaseComponent) => {
const pickDependentProps = props => pick(props, depdendentPropKeys)
const omitDependentProps = props => omit(props, depdendentPropKeys)
return class extends Component {
childProps = propsMapper(pickDependentProps(this.props))
componentWillReceiveProps(nextProps) {
if (!shallowEqual(
pickDependentProps(this.props),
pickDependentProps(nextProps)
)) {
this.childProps = propsMapper(pickDependentProps(nextProps))
}
}
render() {
return createElement(BaseComponent, {...omitDependentProps(this.props), ...this.childProps})
}
}
}
export default createHelper(mapPropsOnChange, 'mapPropsOnChange')
from recompose.
Yes except I'd change the implementation a bit so that
this.childProps = {
...propsMapper(pickDependentProps(nextProps)),
...omitDependentProps(nextProps)
}
from recompose.
You means props order, not moving omitted props into childProps?
(moving props into childProps we got something like old behavior)
from recompose.
Oh duh, yes
from recompose.
Forget my previous comment
from recompose.
👍 Thank you!!!
from recompose.
Related Issues (20)
- renderNothing should export Nothing HOT 4
- Does TypeScript 3.4 enable typing of compose HOT 1
- Remove flow types in repo and support only in flow-typed repo HOT 1
- Key advantages in Docs HOT 2
- The best way to test a component that use getContext recompose HOT 1
- Get a lifecycle componentDidMount unmounted error HOT 1
- Rewriting mapPropsStream with Hooks or new Lifecycle Methods HOT 4
- compose hoc causes to lose typings
- Remove usage of `createFactory` HOT 4
- Why does `mapProps` remove `children`? HOT 2
- node-fetch vulnerability issue (denial of service) HOT 8
- Forked, Updated, and Published HOT 1
- fbjs dependency still present in lock file HOT 3
- Support React 17 HOT 2
- Suggest alternative to branch(), renderComponent(), renderNothing(), compose(), etc
- TypeError: Cannot read properties of undefined (reading 'apply')
- Error: Element type is invalid: expected a string (for built-in components) or a class/function (for composite components) but got: undefined. You likely forgot to export your component from the file it's defined in, or you might have mixed up default and named imports.
- New patch required to mitigate high risk vulnerability
- Maintainers HOT 1
- This is GITHUB and not the European Parliament or NATO.
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from recompose.