Angular Data GridMigrate from 14.6 to 15.0
Migrate from Handsontable 14.6 to Handsontable 15.0, released on December 16th, 2024.
More information about this release can be found in the 15.0.0 release blog post (opens new window).
For a detailed list of changes in this release, see the Changelog.
Introducing the New React Wrapper
With Handsontable 15.0, we're rolling out a brand-new React wrapper designed for functional programming. It focuses on type safety, idiomatic React usage, and developer experience. Named react-wrapper, you can find it in our GitHub monorepo (opens new window) or install it directly from npm (opens new window).
This guide will help you migrate your existing @handsontable/react class-based wrapper to @handsontable/react-wrapper.
Key changes
- Removal of the
settingsprop in favor of direct prop passing - Updated syntax for defining custom renderers and editors
- Introduction of the
useHotEditorhook for creating function-based custom editors
TIP
The class-based @handsontable/react wrapper is still around and fully supported. So if you're into class-based editor and renderer components, you can keep using it.
Warning messages
To assist you in the migration process, @handsontable/react-wrapper provides warning messages to help identify and update deprecated practices:
Obsolete Renderer Warning:
Providing a component-based renderer using `hot-renderer`-annotated component is no longer supported.
Pass your component using `renderer` prop of the `HotTable` or `HotColumn` component instead.
Obsolete Editor Warning:
Providing a component-based editor using `hot-editor`-annotated component is no longer supported.
Pass your component using `editor` prop of the `HotTable` or `HotColumn` component instead.
Migration steps
1. Removal of settings property
The settings property has been removed. Configuration options must now be passed directly to the HotTable component.
@handsontable/react:
const settings = { rowHeaders: true, colHeaders: true };
<HotTable settings={settings} />
@handsontable/react-wrapper:
<HotTable
rowHeaders={true}
colHeaders={true}
// Other options are available as props
/>
2. Custom renderer changes
Custom renderers should now be provided using the renderer prop of either HotTable or HotColumn.
@handsontable/react:
<HotColumn width={250}>
<RendererComponent hot-renderer />
</HotColumn>
@handsontable/react-wrapper:
<HotColumn width={250} renderer={RendererComponent} />
Additionally, custom renderers now receive props with proper TypeScript definitions:
import { HotRendererProps } from '@handsontable/react-wrapper';
const MyRenderer = (props: HotRendererProps) => {
const { value, row, col, cellProperties } = props;
return (
<div style={{ backgroundColor: cellProperties.readOnly ? '#f0f0f0' : '#fff' }}>
{`${value.name}: ${value.value} at (${row}, ${col})`}
</div>
);
};
TIP
If you’re using the renderer option for JavaScript function-based renderers, don’t worry - you can still use them! Just define them under the hotRenderer key instead of renderer.
3. Custom editor changes
Custom editors have changed a lot - they've moved from class-based to function-based components, now using the new useHotEditor hook.
3.1. Replace the class declaration with a function:
@handsontable/react:
class EditorComponent extends BaseEditorComponent {
// ...
}
@handsontable/react-wrapper:
const EditorComponent = () => {
// ...
};
3.2. Implement the useHotEditor hook
Replace the BaseEditorComponent methods with the useHotEditor hook:
import { useHotEditor } from '@handsontable/react-wrapper';
const EditorComponent = () => {
const { value, setValue, finishEditing } = useHotEditor({
onOpen: () => {
// Open logic
},
onClose: () => {
// Close logic
},
});
// Component logic here
};
3.3. Update the component structure
Replace the render method with the function component's return statement:
return (
<div>
<button onClick={finishEditing}>Apply</button>
</div>
);
3.4. Update HotColumn Usage
Just like with renderers, custom editors now need to be provided using the editor prop on either HotTable or HotColumn.
@handsontable/react:
<HotColumn width={250}>
<EditorComponent hot-editor />
</HotColumn>
@handsontable/react-wrapper:
<HotColumn width={250} editor={EditorComponent} />
TIP
If you’re using the editor option for JavaScript class-based editors, you can still use them. Just define them under the hotEditor key instead of editor.