Skip to content

Commit

Permalink
Don't add extra media query listeners
Browse files Browse the repository at this point in the history
The media query plugin would recreate the list of cached listeners for
every media query in a single style object, causing multiple listeners,
and far too many `render` calls. Instead, use a single instance for the
entire plugin run.

Fixes FormidableLabs#465
  • Loading branch information
ianobermiller committed Dec 28, 2015
1 parent 4a51935 commit 504ed04
Showing 1 changed file with 11 additions and 9 deletions.
20 changes: 11 additions & 9 deletions src/plugins/resolve-media-queries-plugin.js
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,12 @@ export default function resolveMediaQueries({
return newStyle;
}

const newComponentFields = {};
const listenersByQuery = {
...getComponentField('_radiumMediaQueryListenersByQuery')
};
const newComponentFields = {
_radiumMediaQueryListenersByQuery: listenersByQuery
};
const mediaQueryListByQueryString =
getGlobalState('mediaQueryListByQueryString') || {};

Expand All @@ -58,17 +63,14 @@ export default function resolveMediaQueries({
mediaQueryListByQueryString[query] = mql = matchMedia(query);
}

const listenersByQuery =
getComponentField('_radiumMediaQueryListenersByQuery');

if (!listenersByQuery || !listenersByQuery[query]) {
const listener = () => setState(query, mql.matches, '_all');
mql.addListener(listener);
newComponentFields._radiumMediaQueryListenersByQuery = {
...listenersByQuery
};
newComponentFields._radiumMediaQueryListenersByQuery[query] = {
remove() { mql.removeListener(listener); }

listenersByQuery[query] = {
remove() {
mql.removeListener(listener);
}
};
}

Expand Down

0 comments on commit 504ed04

Please sign in to comment.