Comments (5)
@blesswinsamuel In regards to your example using static propTypes...
Does that work for you? Using static propTypes as you have done there still gives me the same warning messages...
EDIT:
I got it to work correctly with no warnings using the connect
decorator and static propTypes
.
My problem was babel related... I had the transform-class-properties
plugin listed before the transform-decorators-legacy
plugin.
transform-decorators-legacy
must come before transform-class-properties
to be able to use the connect
decorator and static propTypes
together (note that there are other issues that occur, entirely unrelated to redux, if you specify the order of the plugins incorrectly).
from react-redux.
Don't use inheritance please :-). I have never seen a justifiable case for it in React.
I think the easiest way out is just not to use decorators in this case.
class Info extends React.Component {
render() {
return (
<InfoComponent data={this.props.data}/>
);
}
}
Info.displayName = 'Info';
Info.propTypes = {
data: React.PropTypes.object.isRequired
};
export default connect(state => ({
data: state.info
}))(Info)
from react-redux.
When you use the @connect()
decorator, your Info
class is decorated as a ConnectorDecorator
component.
When you then set Info.propTypes
, you’re actually setting those prop types on the Connector, not on your Info component. So React is enforcing the props in the wrong place!
Instead, use an InfoContainer
. I’d say this is a best practice in general, as it keeps your Info
component as a “dumb component”, keeping the connected component separate. I do this even though I use static properties.
class Info extends React.Component {
render() {
return (
<InfoComponent data={this.props.data}/>
);
}
}
Info.displayName = 'Info';
Info.propTypes = {
data: React.PropTypes.object.isRequired
};
@connect(state => ({
data: state.info
}))
export default InfoContainer extends React.Component {
render() {
return (
<Info {...this.props} />
)
}
}
Or, you could probably do this (which is less extensible)
@connect(state => ({
data: state.info
}))
export default InfoContainer extends Info {}
from react-redux.
@badtant A fix I just discovered, which allows you to use the decorator:
@connect(state => ({
data: state.info
}))
class Info extends React.Component {
render() {
return (
<InfoComponent data={this.props.data}/>
);
}
}
Info.WrappedComponent.displayName = 'Info';
Info.WrappedComponent.propTypes = {
data: React.PropTypes.object.isRequired
};
export default Info;
Note the use of the static property WrappedComponent
, which is "The original component class passed to connect()", and can be found in the documentation here: https://github.com/reactjs/react-redux/blob/master/docs/api.md#connectmapstatetoprops-mapdispatchtoprops-mergeprops-options
from react-redux.
How about using static propTypes inside the connected component?
@connect(state => ({
data: state.info
}))
export default class Info extends React.Component {
static propTypes = {
data: React.PropTypes.object.isRequired
}
render() {
return (
<InfoComponent data={this.props.data}/>
);
}
}
from react-redux.
Related Issues (20)
- Single global store and two Provider occurs an error for microfrontend app HOT 1
- Test fail with provider in react-native HOT 5
- useSelector hook seems to break hook parsing in React Developer Tools HOT 2
- TypeScript: not possible to use a component's `store` and `context` props when wrapped with `connect` HOC HOT 2
- docs: v9.0.0 release missing information HOT 1
- Connected children components might have mapStateToProps not called HOT 18
- Website search is broken HOT 2
- Hooks API Reference uses misnamed type in the useSelector() example HOT 1
- Include UMD build artifacts for latest release HOT 2
- Unstable selectors causes infinite loop in React
- Can't NPM Install Redux with Vite React + Typescript HOT 2
- Compatibility with React 19 types HOT 3
- Getting erro while installing react-redux example project of Nextjs HOT 1
- Unable to install @reduxjs/toolkit on Next.js project HOT 7
- Is there any plan to resolve the CVE-2023-45133 vulnerability that depends on the software Babel? HOT 1
- useSelector doesn't infer selector types properly with shallowEqual
- Your Docusaurus site did not load properly. HOT 4
- React & redux state mismatch, when using dispatch from useEffect HOT 2
- Maximum update depth exceeded HOT 1
- useSelector giving TypeError: Cannot read properties of undefined (reading 'hasValue') after running jest test cases HOT 1
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 react-redux.