react主表一条记录对应子表多条记录,为子表增加主表的字段

实现思路

平台:用友iuap
项目:2019-9阳春能源项目
代码目录:energy-analysis-page/base-data-report-config/

实现核心

        /**
         * getSelect:通过主表id查询子表数据
         * @param {*} param
         * @param {*} getState
         */
        async loadBaseDataReportConfigSubList(param, getState) {
            let {queryBaseDataReportConfigSubParam} = getState().masterDetailOneBaseDataReportConfig;
            let { pData } = param;
            param = {...queryBaseDataReportConfigSubParam,...param};
            actions.masterDetailOneBaseDataReportConfig.updateState({ queryBaseDataReportConfigSubParam: param });

            actions.masterDetailOneBaseDataReportConfig.updateState({ showBaseDataReportConfigSubLoading: true });
            const { result } = processData(await commonApi.getBaseDataReportConfigSub(param));  // 调用 getList 请求数据
            actions.masterDetailOneBaseDataReportConfig.updateState({ showBaseDataReportConfigSubLoading: false });
            const { data: res } = result;
            for(let i = 0;i<res.content.length;i++){
                res.content[i].reportname = pData;
            }
            if (res) {
                const BaseDataReportConfigSubObj = structureObj(res, param);
                actions.masterDetailOneBaseDataReportConfig.updateState({ BaseDataReportConfigSubObj }); // 更新 子表
            } else {
                // 如果请求出错,数据初始化
                const { BaseDataReportConfigSubObj } = getState().masterDetailOneBaseDataReportConfig;
                actions.masterDetailOneBaseDataReportConfig.updateState({ BaseDataReportConfigSubObj: initStateObj(BaseDataReportConfigSubObj) });
            }
        },

子表调用函数中增加一个传入值,也就是想要在子表显示的主表字段,子表取出时所有条目是数组,每个条目是对象形式,使用for循环,为数组中的对象增加一个属性,属性值等于传入的值(主表字段)

            for(let i = 0;i<res.content.length;i++){
                res.content[i].reportname = pData;
            }

主页面实现思路

主页面是主子表联动,当选定的主表条目更变时,查询对应的子表。
因此,实现分三种情况,
1、页面刚加载还没有选定条目时
刚加载时调用的loadPage方法,loadPage又调用loadList

componentDidMount() {
        this.loadPage({
            pageParams: {
                pageIndex: 0,
                pageSize: 5,
            },
            sortMap: [],
            whereParams: [],
        });
    }
loadPage = (param = {}) => {
	...//代码省略
	actions.masterDetailOneBaseDataReportConfig.loadList({ ...queryParam, ...param });
	}
//loadList在model.js中
async loadList(param, getState) {
            actions.masterDetailOneBaseDataReportConfig.updateState({ showLoading: true });   // 正在加载数据,显示加载 Loading 图标
            let { result } = processData(await api.getBaseDataReportConfig(param));  // 调用 getList 请求数据
            let { data: res } = result;
            // 默认选中第一条
            actions.masterDetailOneBaseDataReportConfig.updateState({ showLoading: false, selectIndex: 0, queryParam: param });
            let { content = [] } = res || {};

            if (content.length > 0) { // 获取子表数据
                let BaseDataReportConfigObj = structureObj(res, param);
                actions.masterDetailOneBaseDataReportConfig.updateState({ BaseDataReportConfigObj }); // 更新主表数据
                let { id: search_reportid } = content[0];
                let { masterDetailOneBaseDataReportConfig } = getState();
                let BaseDataReportConfigSubParamObj = { pData:BaseDataReportConfigObj.list[0].reportname,pageSize: masterDetailOneBaseDataReportConfig.BaseDataReportConfigSubObj.pageSize, pageIndex: 0, search_reportid };
                actions.masterDetailOneBaseDataReportConfig.loadBaseDataReportConfigSubList(BaseDataReportConfigSubParamObj);
            } else {
                // 如果请求出错,数据初始化
                const { 
                    BaseDataReportConfigObj, 
                    BaseDataReportConfigSubObj,
                } = getState().masterDetailOneBaseDataReportConfig;
                actions.masterDetailOneBaseDataReportConfig.updateState({
                        BaseDataReportConfigObj: initStateObj(BaseDataReportConfigObj),
                        BaseDataReportConfigSubObj: initStateObj(BaseDataReportConfigSubObj),
                    }
                );
            }
        },

loadList中先调用了getBaseDataReportConfig(param)方法,且将值赋值给了BaseDataReportConfigObj,因此可以直接将BaseDataReportConfigObj中的字段增加到调用子表的参数中。这时,加载页面默认显示第一条主表数据,因此子表也默认显示第一条主表对应的子表数据。

2、选定一个条目时

 <Grid
                    ref={(el) => this.grid = el}
                    data={BaseDataReportConfigObj.list}
                    rowKey={(r, i) => i}
                    columns={this.BaseDataReportConfigColumn()}
                    multiSelect={false}
                    dragborder={true}
                    showHeaderMenu={false}  //是否显示锁定解锁
                    showFilterMenu={false} //是否显示行过滤菜单
                    onRowClick={(record, index) => {
                        // 获取子表数据
                        actions.masterDetailOneBaseDataReportConfig.updateState({ selectIndex: index }); // 更新默认主表行 数据
                        const { list } = BaseDataReportConfigObj;
                        const { id: search_reportid } = list[index];
                        const BaseDataReportConfigSubParam = { pData : BaseDataReportConfigObj.list[index].reportname ,search_reportid, pageSize: BaseDataReportConfigSubObj.pageSize, pageIndex: 0 };
                        actions.masterDetailOneBaseDataReportConfig.loadBaseDataReportConfigSubList(BaseDataReportConfigSubParam);
                    }}
                    rowClassName={(record, index, indent) => {
                        return selectIndex === index ? "selected" : "";
                    }}
                    paginationObj={{
                        ...this.getBasicPage(BaseDataReportConfigObj),
                        freshData: pageSize => _this.freshData(pageSize, "BaseDataReportConfigObj"),
                        onDataNumSelect: (index, value) => _this.onDataNumSelect(index, value, "BaseDataReportConfigObj"),
                        dataNum: _this.getDataNum(BaseDataReportConfigObj.pageSize),
                    }} 
                />

选定一个条目时是在主表的Grid组件中绑定了一个OnRowClick函数,点击时函数会传入当前的index值,将这个index对应的主表对象中的显示字段取出,在调用子表的函数中传入到参数中即可。

3、点击分页时。

    onPageSelect = (value, type, tableName) => {
        let queryParam = deepClone(this.props.queryParam); // 深拷贝查询条件从action里
        let modalObj = this.props[tableName];
        let { pageIndex, pageSize } = getPageParam(value, type, modalObj);

        if (tableName === "BaseDataReportConfigObj") { //主表分页
            queryParam.pageParams.pageSize = pageSize;
            queryParam.pageParams.pageIndex = pageIndex;
            actions.masterDetailOneBaseDataReportConfig.updateState({ queryParam });
            actions.masterDetailOneBaseDataReportConfig.loadList(queryParam);
        }
        if (tableName === "BaseDataReportConfigSubObj") { //detail 表分页
            let { selectIndex, BaseDataReportConfigObj } = this.props;
            // console.log(selectIndex);
            let { id: search_reportid } = BaseDataReportConfigObj.list[selectIndex];
            const pData = BaseDataReportConfigObj.list[selectIndex].reportname;//MYX增加主表信息
            // console.log(pData);
            let temp = { pData : pData,search_reportid, pageSize, pageIndex };
            actions.masterDetailOneBaseDataReportConfig.loadBaseDataReportConfigSubList(temp);
        }
    }

点击分页时调用的是OnPageSelect函数,子表分页中使用selectIndex绑定了选中的主表信息,因此只要将selectIndex对应的主表对象的值传入子表调用参数中即可。

新增修改页实现思路

核心

        /**
         * getSelect:通过id查询子表数据 紧急联系人
         * @param {*} param
         * @param {*} getState
         */
        async loadBaseDataReportConfigSubList(param, getState) {
            let {pData} = param;
            let {queryBaseDataReportConfigSubParam} = getState().masterDetailMainBaseDataReportConfig;
            param = {...queryBaseDataReportConfigSubParam,...param};
            actions.masterDetailMainBaseDataReportConfig.updateState({ queryBaseDataReportConfigSubParam: param });

            actions.masterDetailMainBaseDataReportConfig.updateState({ showDetailLoading: true });
            const { result } = processData(await commonApi.getBaseDataReportConfigSub(param));  // 调用 getList 请求数据
            actions.masterDetailMainBaseDataReportConfig.updateState({ showDetailLoading: false });
            const { data: res } = result;
            for(let i = 0 ;i<res.content.length;i++){
                res.content[i].reportname = pData;
            }
            // console.log(res);
            if (res) {
                const queryBaseDataReportConfigSubObj = structureObj(res, param);
                actions.masterDetailMainBaseDataReportConfig.updateState({ queryBaseDataReportConfigSubObj }); // 更新 子表
            } else {
                // 如果请求出错,数据初始化
                const { queryBaseDataReportConfigSubObj } = getState().masterDetailMainBaseDataReportConfig;
                actions.masterDetailMainBaseDataReportConfig.updateState({ queryBaseDataReportConfigSubObj: initStateObj(queryBaseDataReportConfigSubObj) });
            }
        },

子表调用函数中增加一个传入值,也就是想要在子表显示的主表字段,子表取出时所有条目是数组,每个条目是对象形式,使用for循环,为数组中的对象增加一个属性,属性值等于传入的值(主表字段)

1、初加载时

async getQueryParent(param, getState) {
            actions.masterDetailMainBaseDataReportConfig.updateState({ showLoading: true });   // 正在加载数据,显示加载 Loading 图标
            let { result } = processData(await listApi.getBaseDataReportConfig(param));  // 调用 getList 请求数据
            actions.masterDetailMainBaseDataReportConfig.updateState({ showLoading: false });
            let { data: res, status } = result;
            let { content = [] } = res || {};
            let queryParent = content[0] ? content[0] : {};
            actions.masterDetailMainBaseDataReportConfig.updateState({ queryParent });
            if (content.length > 0) { // 获取子表数据
                let { value } = param.whereParams[0];
                let paramObj = { pData:res.content[0].reportname,pageSize: 10, pageIndex: 0, search_reportid: value};
                actions.masterDetailMainBaseDataReportConfig.loadBaseDataReportConfigSubList(paramObj);
            } else {
                // 如果请求出错,数据初始化
                let { queryDetailObj } = getState().masterDetailMainBaseDataReportConfig;
                actions.masterDetailMainBaseDataReportConfig.updateState({
                    queryDetailObj: initStateObj(queryDetailObj),
                    showModalCover: true,
                });
            }
        },

初加载时主表子表一起加载,可以直接将主表的内容赋值给子表参数。

2、分页时

/**
     *
     * @param {Number} value pageIndex 或者 pageSize
     * @param {Number} type type 为0标识为 pageIndex,为1标识 pageSize
     */
    onPageSelect = (value, type) => {
        const { queryParent } = this.props;
        const { id: search_reportid } = queryParent;
        let tabKey = this.tabKey;
        let pData = this.props.queryBaseDataReportConfigSubParam.pData;
        const { pageIndex, pageSize } = getPageParam(value, type, this.props[`query${tabKey}Obj`]);
        const temp = { pData:pData, search_reportid, pageSize, pageIndex };
        actions.masterDetailMainBaseDataReportConfig[`load${tabKey}List`](temp);
    }

分页时使用props中的queryBaseDataReportConfigSubParam,其中存储了pData的信息,可以直接赋值给子表调用参数。

问题:
1、queryBaseDataReportConfigSubParam是哪来的?
2、所有的action调用是怎么将值赋给对应的对象的?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值