utils_react-nexacro_hooks.js

import React from "react";

/**
 * 넥사크로 데이터셋(Dataset)의 변경 이벤트를 구독하여,
 * 데이터나 로우 포지션이 변경될 때마다 React 컴포넌트를 리렌더링하게 만드는 훅입니다.
 *
 * @function useNexacroDataset
 * @param {nexacro.Dataset} dataset  - 구독할 넥사크로 데이터셋 객체
 * @returns {nexacro.Dataset} 전달받은 데이터셋 객체를 그대로 반환
 * @memberof $react
 * @example
 * function MyGrid() {
 *     // 부모로부터 받거나 컨텍스트 등에서 구한 데이터셋 객체
 *     const ds = useNexacroDataset(this.ds_list);
 *
 *     return React.createElement(NxGrid, { binddataset: ds.name });
 * }
 *
 */
export function useNexacroDataset(dataset) {
    const [, forceRender] = React.useReducer((s) => s + 1, 0);

    React.useEffect(() => {
        if (!dataset) return;

        const handleUpdate = () => {
            forceRender();
        };

        // 데이터셋 상태 변경과 관련된 핵심 이벤트들을 구독
        dataset.addEventHandler("onrowsetchanged", handleUpdate, this);
        dataset.addEventHandler("onrowposchanged", handleUpdate, this);
        dataset.addEventHandler("oncolumnchanged", handleUpdate, this);
        dataset.addEventHandler("onload", handleUpdate, this);

        return () => {
            // 언마운트 시 구독 해제
            dataset.removeEventHandler("onrowsetchanged", handleUpdate, this);
            dataset.removeEventHandler("onrowposchanged", handleUpdate, this);
            dataset.removeEventHandler("oncolumnchanged", handleUpdate, this);
            dataset.removeEventHandler("onload", handleUpdate, this);
        };
    }, [dataset]);

    return dataset;
}