From 504ed0435e76248eec28f3322d10c8db6731b645 Mon Sep 17 00:00:00 2001 From: Ian Obermiller Date: Sun, 27 Dec 2015 22:58:47 -0800 Subject: [PATCH] Don't add extra media query listeners 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 #465 --- src/plugins/resolve-media-queries-plugin.js | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/src/plugins/resolve-media-queries-plugin.js b/src/plugins/resolve-media-queries-plugin.js index 07170833..766b86c5 100644 --- a/src/plugins/resolve-media-queries-plugin.js +++ b/src/plugins/resolve-media-queries-plugin.js @@ -42,7 +42,12 @@ export default function resolveMediaQueries({ return newStyle; } - const newComponentFields = {}; + const listenersByQuery = { + ...getComponentField('_radiumMediaQueryListenersByQuery') + }; + const newComponentFields = { + _radiumMediaQueryListenersByQuery: listenersByQuery + }; const mediaQueryListByQueryString = getGlobalState('mediaQueryListByQueryString') || {}; @@ -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); + } }; }