@handsontable/react-wrapper 0.0.0-next-950f502-20260629 → 0.0.0-next-8f26cab-20260630
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/commonjs/react-handsontable.js +26 -4
- package/dist/react-handsontable.js +27 -5
- package/dist/react-handsontable.js.map +1 -1
- package/dist/react-handsontable.min.js +2 -2
- package/dist/react-handsontable.min.js.map +1 -1
- package/es/react-handsontable.mjs +26 -4
- package/hotTableContext.d.ts +8 -0
- package/package.json +3 -3
|
@@ -551,10 +551,18 @@ var HotTableContextProvider = function HotTableContextProvider(_ref) {
|
|
|
551
551
|
return renderedCellCache.current.clear();
|
|
552
552
|
}, []);
|
|
553
553
|
var portalCache = React.useRef(new Map());
|
|
554
|
+
var portalContainerCache = React.useRef(new Map());
|
|
555
|
+
// Keys of the portal containers rendered in the current view-render pass.
|
|
556
|
+
// Reset every `beforeViewRender` and used after the render to evict
|
|
557
|
+
// containers whose cells left the viewport (see pushCellPortalsIntoPortalManager).
|
|
558
|
+
var renderedPortalContainerKeys = React.useRef(new Set());
|
|
554
559
|
var clearPortalCache = React.useCallback(function () {
|
|
555
|
-
|
|
560
|
+
portalCache.current.clear();
|
|
561
|
+
renderedPortalContainerKeys.current.clear();
|
|
562
|
+
}, []);
|
|
563
|
+
var getPortalContainerCacheSize = React.useCallback(function () {
|
|
564
|
+
return portalContainerCache.current.size;
|
|
556
565
|
}, []);
|
|
557
|
-
var portalContainerCache = React.useRef(new Map());
|
|
558
566
|
var getRendererWrapper = React.useCallback(function (Renderer) {
|
|
559
567
|
return function __internalRenderer(instance, TD, row, col, prop, value, cellProperties) {
|
|
560
568
|
var key = "".concat(row, "-").concat(col);
|
|
@@ -590,6 +598,7 @@ var HotTableContextProvider = function HotTableContextProvider(_ref) {
|
|
|
590
598
|
TD.appendChild(portalContainer);
|
|
591
599
|
}
|
|
592
600
|
portalContainerCache.current.set(portalContainerKey, portalContainer);
|
|
601
|
+
renderedPortalContainerKeys.current.add(portalContainerKey);
|
|
593
602
|
portalCache.current.set(portalKey, portal);
|
|
594
603
|
}
|
|
595
604
|
renderedCellCache.current.set(key, TD);
|
|
@@ -603,6 +612,18 @@ var HotTableContextProvider = function HotTableContextProvider(_ref) {
|
|
|
603
612
|
renderersPortalManager.current = pmComponent;
|
|
604
613
|
}, []);
|
|
605
614
|
var pushCellPortalsIntoPortalManager = React.useCallback(function () {
|
|
615
|
+
// Evict portal containers whose cells were not rendered in this pass (e.g.
|
|
616
|
+
// scrolled out of the viewport). Their container DIVs are already detached
|
|
617
|
+
// from the DOM, so without this they would be retained forever, leaking
|
|
618
|
+
// O(rows × cols) detached nodes for component-based renderers. Containers
|
|
619
|
+
// still in the viewport stay cached, preserving the in-place reuse that
|
|
620
|
+
// avoids remounting renderer components on every grid render (#10800).
|
|
621
|
+
var liveKeys = renderedPortalContainerKeys.current;
|
|
622
|
+
portalContainerCache.current.forEach(function (_, cacheKey) {
|
|
623
|
+
if (!liveKeys.has(cacheKey)) {
|
|
624
|
+
portalContainerCache.current["delete"](cacheKey);
|
|
625
|
+
}
|
|
626
|
+
});
|
|
606
627
|
renderersPortalManager.current(_toConsumableArray(portalCache.current.values()));
|
|
607
628
|
}, []);
|
|
608
629
|
var contextImpl = React.useMemo(function () {
|
|
@@ -614,10 +635,11 @@ var HotTableContextProvider = function HotTableContextProvider(_ref) {
|
|
|
614
635
|
getRendererWrapper: getRendererWrapper,
|
|
615
636
|
clearPortalCache: clearPortalCache,
|
|
616
637
|
clearRenderedCellCache: clearRenderedCellCache,
|
|
638
|
+
getPortalContainerCacheSize: getPortalContainerCacheSize,
|
|
617
639
|
setRenderersPortalManagerRef: setRenderersPortalManagerRef,
|
|
618
640
|
pushCellPortalsIntoPortalManager: pushCellPortalsIntoPortalManager
|
|
619
641
|
};
|
|
620
|
-
}, [setHotColumnSettings, trimColumnSettings, getRendererWrapper, clearRenderedCellCache, setRenderersPortalManagerRef, pushCellPortalsIntoPortalManager]);
|
|
642
|
+
}, [setHotColumnSettings, trimColumnSettings, getRendererWrapper, clearRenderedCellCache, getPortalContainerCacheSize, setRenderersPortalManagerRef, pushCellPortalsIntoPortalManager]);
|
|
621
643
|
return /*#__PURE__*/React__default["default"].createElement(HotTableContext.Provider, {
|
|
622
644
|
value: contextImpl
|
|
623
645
|
}, children);
|
|
@@ -1086,7 +1108,7 @@ var HotColumn = function HotColumn(props) {
|
|
|
1086
1108
|
}, editorPortal);
|
|
1087
1109
|
};
|
|
1088
1110
|
|
|
1089
|
-
var version="0.0.0-next-
|
|
1111
|
+
var version="0.0.0-next-8f26cab-20260630";
|
|
1090
1112
|
|
|
1091
1113
|
/**
|
|
1092
1114
|
* Component used to manage the renderer component portals.
|
|
@@ -25,7 +25,7 @@
|
|
|
25
25
|
* INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY CHARACTER ARISING FROM
|
|
26
26
|
* USE OR INABILITY TO USE THIS SOFTWARE.
|
|
27
27
|
*
|
|
28
|
-
* Version: 0.0.0-next-
|
|
28
|
+
* Version: 0.0.0-next-8f26cab-20260630 (built at Tue Jun 30 2026 10:05:05 GMT+0000 (Coordinated Universal Time))
|
|
29
29
|
*/
|
|
30
30
|
(function (global, factory) {
|
|
31
31
|
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('react'), require('react-dom'), require('handsontable/base'), require('handsontable/renderers/registry'), require('handsontable/editors/registry')) :
|
|
@@ -576,10 +576,18 @@ var HotTableContextProvider = function HotTableContextProvider(_ref) {
|
|
|
576
576
|
return renderedCellCache.current.clear();
|
|
577
577
|
}, []);
|
|
578
578
|
var portalCache = React.useRef(new Map());
|
|
579
|
+
var portalContainerCache = React.useRef(new Map());
|
|
580
|
+
// Keys of the portal containers rendered in the current view-render pass.
|
|
581
|
+
// Reset every `beforeViewRender` and used after the render to evict
|
|
582
|
+
// containers whose cells left the viewport (see pushCellPortalsIntoPortalManager).
|
|
583
|
+
var renderedPortalContainerKeys = React.useRef(new Set());
|
|
579
584
|
var clearPortalCache = React.useCallback(function () {
|
|
580
|
-
|
|
585
|
+
portalCache.current.clear();
|
|
586
|
+
renderedPortalContainerKeys.current.clear();
|
|
587
|
+
}, []);
|
|
588
|
+
var getPortalContainerCacheSize = React.useCallback(function () {
|
|
589
|
+
return portalContainerCache.current.size;
|
|
581
590
|
}, []);
|
|
582
|
-
var portalContainerCache = React.useRef(new Map());
|
|
583
591
|
var getRendererWrapper = React.useCallback(function (Renderer) {
|
|
584
592
|
return function __internalRenderer(instance, TD, row, col, prop, value, cellProperties) {
|
|
585
593
|
var key = "".concat(row, "-").concat(col);
|
|
@@ -615,6 +623,7 @@ var HotTableContextProvider = function HotTableContextProvider(_ref) {
|
|
|
615
623
|
TD.appendChild(portalContainer);
|
|
616
624
|
}
|
|
617
625
|
portalContainerCache.current.set(portalContainerKey, portalContainer);
|
|
626
|
+
renderedPortalContainerKeys.current.add(portalContainerKey);
|
|
618
627
|
portalCache.current.set(portalKey, portal);
|
|
619
628
|
}
|
|
620
629
|
renderedCellCache.current.set(key, TD);
|
|
@@ -628,6 +637,18 @@ var HotTableContextProvider = function HotTableContextProvider(_ref) {
|
|
|
628
637
|
renderersPortalManager.current = pmComponent;
|
|
629
638
|
}, []);
|
|
630
639
|
var pushCellPortalsIntoPortalManager = React.useCallback(function () {
|
|
640
|
+
// Evict portal containers whose cells were not rendered in this pass (e.g.
|
|
641
|
+
// scrolled out of the viewport). Their container DIVs are already detached
|
|
642
|
+
// from the DOM, so without this they would be retained forever, leaking
|
|
643
|
+
// O(rows × cols) detached nodes for component-based renderers. Containers
|
|
644
|
+
// still in the viewport stay cached, preserving the in-place reuse that
|
|
645
|
+
// avoids remounting renderer components on every grid render (#10800).
|
|
646
|
+
var liveKeys = renderedPortalContainerKeys.current;
|
|
647
|
+
portalContainerCache.current.forEach(function (_, cacheKey) {
|
|
648
|
+
if (!liveKeys.has(cacheKey)) {
|
|
649
|
+
portalContainerCache.current["delete"](cacheKey);
|
|
650
|
+
}
|
|
651
|
+
});
|
|
631
652
|
renderersPortalManager.current(_toConsumableArray(portalCache.current.values()));
|
|
632
653
|
}, []);
|
|
633
654
|
var contextImpl = React.useMemo(function () {
|
|
@@ -639,10 +660,11 @@ var HotTableContextProvider = function HotTableContextProvider(_ref) {
|
|
|
639
660
|
getRendererWrapper: getRendererWrapper,
|
|
640
661
|
clearPortalCache: clearPortalCache,
|
|
641
662
|
clearRenderedCellCache: clearRenderedCellCache,
|
|
663
|
+
getPortalContainerCacheSize: getPortalContainerCacheSize,
|
|
642
664
|
setRenderersPortalManagerRef: setRenderersPortalManagerRef,
|
|
643
665
|
pushCellPortalsIntoPortalManager: pushCellPortalsIntoPortalManager
|
|
644
666
|
};
|
|
645
|
-
}, [setHotColumnSettings, trimColumnSettings, getRendererWrapper, clearRenderedCellCache, setRenderersPortalManagerRef, pushCellPortalsIntoPortalManager]);
|
|
667
|
+
}, [setHotColumnSettings, trimColumnSettings, getRendererWrapper, clearRenderedCellCache, getPortalContainerCacheSize, setRenderersPortalManagerRef, pushCellPortalsIntoPortalManager]);
|
|
646
668
|
return /*#__PURE__*/React__default["default"].createElement(HotTableContext.Provider, {
|
|
647
669
|
value: contextImpl
|
|
648
670
|
}, children);
|
|
@@ -1111,7 +1133,7 @@ var HotColumn = function HotColumn(props) {
|
|
|
1111
1133
|
}, editorPortal);
|
|
1112
1134
|
};
|
|
1113
1135
|
|
|
1114
|
-
var version="0.0.0-next-
|
|
1136
|
+
var version="0.0.0-next-8f26cab-20260630";
|
|
1115
1137
|
|
|
1116
1138
|
/**
|
|
1117
1139
|
* Component used to manage the renderer component portals.
|