@@ -25,8 +25,23 @@ const ViewportContext = React.createContext({
25
25
26
26
export const Consumer = ViewportContext . Consumer ;
27
27
28
- export default class ViewportProvider extends React . PureComponent {
28
+ export default class ViewportProvider extends React . PureComponent <
29
+ { } ,
30
+ { hasListeners : boolean }
31
+ > {
29
32
private listeners : IListener [ ] = [ ] ;
33
+ private updateListenersTick : NodeJS . Timer ;
34
+
35
+ constructor ( props : { } ) {
36
+ super ( props ) ;
37
+ this . state = {
38
+ hasListeners : false ,
39
+ } ;
40
+ }
41
+
42
+ componentWillUnmount ( ) {
43
+ clearTimeout ( this . updateListenersTick ) ;
44
+ }
30
45
31
46
updateListeners = (
32
47
publicState : IViewport ,
@@ -57,12 +72,23 @@ export default class ViewportProvider extends React.PureComponent {
57
72
options : IViewportChangeOptions ,
58
73
) => {
59
74
this . listeners . push ( { handler, ...options } ) ;
75
+ this . updateListenersLazy ( ) ;
60
76
} ;
61
77
62
78
removeViewportChangeListener = ( h : TViewportChangeHandler ) => {
63
79
this . listeners = this . listeners . filter ( ( { handler } ) => handler !== h ) ;
80
+ this . updateListenersLazy ( ) ;
64
81
} ;
65
82
83
+ updateListenersLazy ( ) {
84
+ clearTimeout ( this . updateListenersTick ) ;
85
+ this . updateListenersTick = setTimeout ( ( ) => {
86
+ this . setState ( {
87
+ hasListeners : this . listeners . length !== 0 ,
88
+ } ) ;
89
+ } , 0 ) ;
90
+ }
91
+
66
92
renderChildren = ( props : { hasRootProviderAsParent : boolean } ) => {
67
93
if ( ! props . hasRootProviderAsParent ) {
68
94
const value = {
@@ -73,7 +99,9 @@ export default class ViewportProvider extends React.PureComponent {
73
99
} ;
74
100
return (
75
101
< React . Fragment >
76
- < ViewportCollector onUpdate = { this . updateListeners } />
102
+ { this . state . hasListeners && (
103
+ < ViewportCollector onUpdate = { this . updateListeners } />
104
+ ) }
77
105
< ViewportContext . Provider value = { value } >
78
106
{ this . props . children }
79
107
</ ViewportContext . Provider >
0 commit comments