Expected state to match memoized state before componentDidMount
See original GitHub issueUpgrading meteor
(from 1.4 to 1.7) and react
(from 15.3.2 to 16.8.6) and got this warning at browser console:
Warning: Expected Container(Container(withRouter(List))) state to match memoized state before componentDidMount. This might either be because of a bug in React, or because a component reassigns its own `this.props`. Please file an issue.
in Container(Container(withRouter(List))) (created by UseDeps(Container(Container(withRouter(List)))))
in UseDeps(Container(Container(withRouter(List)))) (created by RouterContext)
in div (created by Layout)
in div (created by Content)
in Content (created by Layout)
in div (created by Layout)
in div (created by Layout)
in MDLComponent (created by Layout)
in Layout (created by Layout)
in Layout (created by WithDeps(Layout))
in WithDeps(Layout) (created by RouterContext)
in RouterContext (created by Router)
in Router
in Provider
in Unknown
Note: My codes ain’t using react-css-modules
or having this.props = ...
syntax as suggested in https://github.com/facebook/react/issues/14224
React version: 16.8.6
Steps To Reproduce
Here is my code (which I have narrowed down to, likely at onPropsChange part)
list.js
import {useDeps, composeAll, compose} from 'mantra-core-extra';
import composeWithTracker from '../../core/libs/utils/compose-with-tracker';
import List from '../components/list.jsx';
import Tickets from '../../../../lib/collections';
const composer = ({context}, onData) => {
const {Meteor, Store} = context();
if (Meteor.subscribe('tickets').ready()) {
let filters = Object.assign({}, Store.getState().tickets.list.filters);
if (filters.date) {
filters['createdAt'] = {$gt: filters.date.range.start, $lt: filters.date.range.end};
delete filters['date'];
}
let total = Tickets.find(filters).count();
const tickets = Tickets.find(filters, {
sort: {[Store.getState().tickets.list.sort.field]: Store.getState().tickets.list.sort.order ? 1 : -1},
skip: Store.getState().tickets.list.page * Store.getState().tickets.list.range,
limit: Store.getState().tickets.list.range,
}).fetch();
onData(null, {tickets, total});
}
};
const onPropsChange = ({context}, onData) => {
const {Store} = context();
onData(null, Store.getState().tickets);
return Store.subscribe(() => {
onData(null, Store.getState().tickets);
});
};
const depsMapper = (context, actions) => ({
select: actions.ticket.select,
unselect: actions.ticket.unselect,
remove: actions.ticket.remove,
changePage: actions.ticket.changePage,
sortField: actions.ticket.sort,
changeCategory: actions.ticket.changeCategory,
changeStatus: actions.ticket.changeStatus,
changeDate: actions.ticket.changeDate,
find: actions.ticket.find,
context: () => context
});
export default composeAll(
composeWithTracker(composer),
compose(onPropsChange),
useDeps(depsMapper)
)(List);
The current behavior
Causing table listing not appearing in my case.
The expected behavior
Table with rows of data to be listed
Issue Analytics
- State:
- Created 4 years ago
- Reactions:3
- Comments:9 (2 by maintainers)
Top Results From Across the Web
reactjs - Expected state to match memoized state before ...
It usually happens when you try to change the state in react in certain way the react doesn't understand. For instance
Read more >Concerning Warning? : r/reactjs - Reddit
Warning: Expected instance props to match memoized props before componentDidUpdate. This is likely due to a bug in React.
Read more >You Probably Don't Need Derived State – React Blog
If you're using derived state to memoize some computation based only on the current props, you don't need derived state. See What about ......
Read more >Connect: Extracting Data with mapStateToProps - React Redux
The first argument to a mapStateToProps function is the entire Redux store state (the same value returned by a call to store.getState() )....
Read more >Unexpected Token when importing react-native-fetch-blob ...
Related Issue #448 · Unexpected token, expected; When calling a function in react native ... Expected state to match memoized state before componentDidMount...
Read more >
Top Related Medium Post
No results found
Top Related StackOverflow Question
No results found
Troubleshoot Live Code
Lightrun enables developers to add logs, metrics and snapshots to live code - no restarts or redeploys required.
Start Free
Top Related Reddit Thread
No results found
Top Related Hackernoon Post
No results found
Top Related Tweet
No results found
Top Related Dev.to Post
No results found
Top Related Hashnode Post
No results found
The warning is a little misleading. What actually happens here is something is reassigning
this.state
notthis.props
. The only case I can now think of is as this example shows.Why not prepare the object first and then
this.state = yourObj
? Assuming as you said this happens in constructor?