import { useMemo, useRef } from "react"; import { merge } from "lodash-es"; import type { DataModelOptions } from "./data-model"; import DataModel from "./data-model"; /** * useDataModel 选项接口 */ export interface UseDataModelOptions { /** 动态数据监听的目标 */ effectTargets?: any[]; /** 动态的 params 数据,包含了 query */ effectParams?: Partial>; /** 动态的 query 数据 */ effectQuery?: DataModelOptions["query"]; } /** * 解决 hooks 重复实例化导致 query 丢失的问题 * @param {Object} initParams 初始参数 * @param {Object} opt * @param {Object} opt.effectTargets 动态数据监听的目标 * @param {Object} opt.effectParams 动态的 params 数据,包含了 query * @param {Object} opt.effectQuery 动态的 query 数据 * @returns DataModel 实例 */ export const useDataModel = function ( initParams: DataModelOptions = {}, opt: UseDataModelOptions = {}, ) { const model = useRef>(new DataModel(initParams)); return useMemo(() => { const { effectParams, effectQuery } = opt || {}; if (effectParams) { merge(model.current, effectParams); } if (effectQuery) { merge(model.current.query, effectQuery); } return model.current; }, opt.effectTargets || []); };