首页 > 其他分享 >React后台管理(九)-- 页面开发前准备---Outlet布局组件封装

React后台管理(九)-- 页面开发前准备---Outlet布局组件封装

时间:2024-05-25 22:33:37浏览次数:21  
标签:current React render pageSize -- --- state props children

文章目录


前言

本文主要讲Outlet子路由渲染区域—>结构布局的封装。其中涉及的全局搜索hook函数,后面会单独拎出来讲,这期可先忽略,关注布局即可。


一、组件源码+解析如下

// @/layout/list/index.jsx
import React, { useRef, useImperativeHandle } from "react";
import { Pagination } from "antd";
import "./index.scss";
import useStore from "@/store";
import { useSearch } from "@/hook/index.js"; // hook
import { checkDataType } from "@/utils/common"; // utils
import Config from "@/config";

const CdList = (props) => {
  const { TableStore } = useStore();
  const { getReq } = useSearch();
  const state = useRef({
    pageIndex: getReq()?.pageIndex,
    pageSize: getReq()?.pageSize,
    total: 0,
    disabled: false,
  });
  const pageChange = (page, pageSize) => {
    const isFunction = checkDataType().isFunction(props?.page);
    if (!isFunction) {
      return false;
    }
    // 禁用按钮
    state.current.disabled = true;
    // 记录搜索动作类型
    TableStore.SET_FILTER_ACTION("page");
    // 记录页码
    TableStore.SET_PAGE({ size: pageSize, index: page });
    // 更新页码
    state.current.pageIndex = page;
    // 更新每页数量
    state.current.pageSize = pageSize;
    // 调用父组件更新表格数据方法
    props?.page(page, pageSize).finally(() => {
      state.current.disabled = false;
    });
  };
  // 设置总数
  const setTotal = (val) => {
    state.current.total = val * 1;
  };
  // 重置
  const reset = () => {
    state.current.pageIndex = Config.pageIndex;
  };
  // 暴露给父组件的方法放在这里
  useImperativeHandle(props?.tableRef, () => ({
    setTotal,
    reset,
  }));
  return (
    <div id="render-content">
      {/* 导航tab标签 */}
      <div id="render-content-header">
        {props.children.tabs ? (
          <>
            <div id="render-tabs">{props.children.tabs}</div>
          </>
        ) : null}
      </div>
      <div id="render-content-main">
        {/* 筛选 */}
        {props.children.tabschecked ? (
          <>
            <div id="render-tabs-checked">{props.children.tabschecked}</div>
          </>
        ) : null}
        {/* 搜索 */}
        {props.children.search ? (
          <>
            <div id="render-search">{props.children.search}</div>
          </>
        ) : null}
        {/* 手动控制 */}
        {props.children.control ? (
          <>
            <div id="render-control">{props.children.control}</div>
          </>
        ) : null}
        {/* 列表 */}
        <div id="render-body">
          <div>{props.children.default ? props.children.default : null}</div>
        </div>
        {/* 分页 */}
        <div id="render-footer">
          <Pagination className="pull-right" size="small" disabled={state.current.disabled} defaultCurrent={state.current.pageIndex} current={state.current.pageIndex} pageSize={state.current.pageSize} total={state.current.total} showSizeChanger onChange={pageChange} />
        </div>
      </div>
    </div>
  );
};

export default CdList;
-------------------------------------------------------------------------------------------------------------------
// @/layout/list/index.scss
#render-content {
  height: 100%;
  display: flex;
  flex-direction: column;
}
#render-content-header {
  background-color: #fff;
}
#render-content-main {
  flex: 1;
  height: 0;
  padding: 16px 24px 16px;
  background-color: #f0f2f5;
  box-sizing: border-box;
  display: flex;
  flex-direction: column;
}
#render-control {
  padding: 12px;
  background-color: #fff;
}
#render-body {
  flex: 1;
  height: 0;
  overflow-y: hidden;
  border-bottom: none;
  border-radius: 2px 2px 0 0;
  background-color: #fff;
  > div {
    padding: 0 12px;
    height: 100%;
  }
}
#render-footer {
  padding: 12px;
  border-radius: 0 0 2px 2px;
  background-color: #fff;
}
#render-tabs {
  padding: 0 24px;
  border-bottom: 1px solid #e9e9e9;
}
.block {
  height: 12px;
  background-color: #fff;
  border-radius: 2px 2px 0 0;
}
#render-tabs-checked {
  padding: 16px 16px 0;
  background-color: #fff;
  position: relative;
  &:after {
    content: "";
    position: absolute;
    border-bottom: 1px solid #e9e9e9;
    left: 16px;
    right: 16px;
    bottom: 0;
  }
}

二、页面使用方式

// 引用container组件
import CdList from "@/layout/list/index.jsx";
// html
<CdList tableRef={tableRef} page={changePage}>
  {{
     tabs: (
       <>
         {/* 导航tabs标签组件 */}
         {/* ... */}
       </>
     ),
     search: (
        <>
          {/* 筛选区域 */}
          {/* ... */}
        </>
     ),
     default: (
        <>
          {/* 表格区域 */}
          {/* ... */}
        </>
     ),
  }}
</CdList>

三、效果展示

在这里插入图片描述


总结

下一篇讲【页面开发前准备 – Tabs 标签页组件封装】。关注本栏目,会实时更新。

标签:current,React,render,pageSize,--,---,state,props,children
From: https://blog.csdn.net/weixin_43883615/article/details/139095668

相关文章

  • 赛克oj The diameter of a rectangle(笛卡尔树)
    赛氪OJ-专注于算法竞赛的在线评测系统(saikr.com)这题是hduoj1506的加强版,区别在于宽度不是固定为1了,思路差不多,也是使用笛卡尔树。参考hduoj1506(笛卡尔树)-Venux-博客园(cnblogs.com)1#defineIOstd::ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)2#definebu......
  • linux文件权限常用知识点,基于Linux(openEuler、CentOS8)
    目录知识点常用实例知识点真实环境文件显示解读常用实例文件所有者chown-Rnginx:nginx/home/source目录权限(R选填必须大写<遍历子文件夹及文件>)chmod-R755/home/sourcechmod-R777/home/source......
  • C#开发的通讯调试工具
    一款基于C#开发的通讯调试工具(支持ModbusRTU、MQTT调试) 前言今天大姚给大家分享一款基于C#、WPF、Prism、MaterialDesign、HandyControl开发的通讯调试工具(支持ModbusRTU、MQTT调试,界面色彩丰富):Wu.CommTool。工具特点工具界面色彩丰富。支持ModbusRTU、MQTT服务器、M......
  • Linux服务器安装docker,基于Linux(openEuler、CentOS8)
    本实验环境为openEuler系统(以server方式安装)(CentOS8基本一致,可参考本文)目录知识点实验知识点Docker是一个开源的应用容器引擎。它允许开发者将应用及其所有依赖项打包到一个可移植的容器中,并发布到任何支持Docker的流行Linux或Windows操作系......
  • 泛型中K T V E ? Object等分别代表的含义
    E–Element(在集合中使用,因为集合中存放的是元素)T–Type(Java类)K–Key(键)V–Value(值)N–Number(数值类型)?–表示不确定的java类型(无限制通配符类型)S、U、V–这几个有时候也有,这些字母本身没有特定的含义,它们只是代表某种未指定的类型。一般认为和T差不多。......
  • Windows安全应急--在应急响应中需要知道的信息
    在网络安全事件发生后,一般是要去客户现场排查问题的,那么要想解决问题,信息的完整性决定了这次任务的成败。。1.你需要知道的:先让客户梳理一遍事情的起因经过结果询问客户需要解决的问题了解客户的网络环境(有拓扑图最好了)了解系统环境(比如Linux系统还是Windows系统......
  • Get中的路由管理
    文章目录1.概念介绍2.使用方法2.1普通路由2.2命名路由3.示例代码4.内容总结我们在上一章回中介绍了"使用get显示Dialog"相关的内容,本章回中将介绍使用get进行路由管理.闲话休提,让我们一起TalkFlutter吧。1.概念介绍我们在本章回中介绍的路由管理主要是......
  • 解决移植Metasploitable3到VM虚拟机无网络的问题
    第一步导入后不要开机,先在虚拟机设置里面将原有的两个网络适配器移除。第二步接着在选项里面,在客户机操作系统里面,选择MicrosoftWindwos(W),版本选择WindowsServer2008R2x64第三步先打开虚拟机,然后再添加一个网络适配器(没有打开添加不知道行不行,你们可以试试)......
  • Windows安全应急--反隐身术
    NO.1dir命令首先做个演示,把演示01这个文件夹隐藏起来,在文件夹上是看不到了,我们可以使用dir命令查看,NO.2文件夹选项–显示隐藏这个是非常常规的了,这里不做过多介绍有些隐藏文件很顽固,上面两种常规方法可能搞不定,下面再讲一些其他方法。NO.3移行大法看能......
  • 产品经理如何学习大模型?——从“小白”到“大牛”的奇幻旅程
    引言在这个由数据驱动的时代,产品经理们面临着一个全新的挑战——大模型。想象一下,你是一名产品经理,站在一个由代码和算法构成的神秘岛屿前,准备开始一场探索之旅。这场旅程不仅需要勇气,还需要智慧和耐心。那么,如何从一个对大模型一无所知的“小白”成长为一个精通此道的“大......