【React】Ant Design社区扩展库之分割面板:react-resizable-panels

news2024/11/26 22:31:22

主角:react-resizable-panels
简介:来之Ant Design官方文档社区精选组件

1、效果

分割面板应用效果

2、环境

  • react-resizable-panels: ^2.0.16
  • next: 14.1.3
  • react: ^18

3、安装

# npm
npm install react-resizable-panels

# yarn
yarn add react-resizable-panels

# pnpm
pnpm add react-resizable-panels

# bun
bun add react-resizable-panels

4、组件概述

  • PanelGroup: 布局容器
  • PanelResizeHandle: 分割线控件,无自带样式,使用classNamestyle属性自定义
  • Panel: 面板容器,其下可嵌套任何元素

5、基础用法

// file: app/test/page.tsx
"use client"

import { Card } from "antd"

// 引入基础组件
import { 
	Panel, 
	PanelGroup, 
	PanelResizeHandle
} from "react-resizable-panels";

// 给边线来点小样式
const PanelResizeHandleStyle = {
    outline: 'none',
    flex: '0 0 .25rem',
    justifyContent: 'stretch',
    alignItems: 'stretch',
    transition: 'background-color .2s linear',
    display: 'flex'
}

const TestView = function () {

    return (
        <>
            <PanelGroup direction="horizontal">
                <Panel>
                    <Card>Card Panel 1</Card>
                </Panel>
                <PanelResizeHandle style={PanelResizeHandleStyle} />
                <Panel>
                    <Card>Card Panel 1</Card>
                </Panel>
            </PanelGroup>;
        </>
    )
}

export default TestView;

6、组件Props

6.1、PanelGroup Props

属性类型描述
autoSaveId?string用于自动保存组排列的唯一 ID localStorage
childrenReactNode任意 React 元素
className?string附加到根元素的类名
direction“horizontal”“vertical”
id?string组ID;回落到useId未提供时
onLayout?(sizes: number[]) => void当组布局更改时调用
storage?PanelGroupStorage自定义存储API;默认为localStorage
style?CSSProperties附加到根元素的 CSS 样式
tagName?string = “div”根元素的 HTML 元素标签名称

①:存储API必须定义以下同步方法:

  • getItem: (name:string) => string
  • setItem: (name: string, value: string) => void

用于手动调整大小的命令式 API:

方法描述
getId(): string获取面板组的 ID
getLayout(): number[]获取面板组的当前布局( [1 - 100, ...])。
setLayout(layout: number[])将面板组大小调整为指定布局( [1 - 100, ...])

6.2、Panel Props

属性类型描述
childrenReactNode任意 React 元素
className?string附加到根元素的类名
collapsedSize?number=0面板应折叠至此尺寸
collapsible?boolean=false当调整大小超出其范围时,面板应该折叠minSize
defaultSize?number面板的初始大小(1-100之间的数值)
id?string面板 ID(组内唯一);回落到useId未提供时
maxSize?number = 100面板最大允许尺寸(1-100之间的数值);默认为100
minSize?number = 10面板最小允许尺寸(1-100之间的数值);默认为10
onCollapse?() => void面板折叠时调用
onExpand?() => void面板展开时调用
onResize?(size: number) => void调整面板大小时调用;size参数是 1-100 之间的数值。1
order?number小组内小组的顺序;对于具有条件渲染面板的组来说是必需的
style?CSSProperties附加到根元素的 CSS 样式
tagName?string = “div”根元素的 HTML 元素标签名称

6.3、PanelResizeHandle Props

属性类型描述
children?ReactNode自定义拖动UI;可以是任意 React 元素
className?string附加到根元素的类名
hitAreaMargins?{ coarse: number = 15; fine: number = 5; }在确定可调整大小的手柄点击检测时允许这么多余量
disabled?boolean禁用拖动手柄
id?string调整句柄 ID 的大小(组内唯一);回落到useId未提供时
onDragging?(isDragging: boolean) => void当组布局更改时调用
style?CSSProperties附加到根元素的 CSS 样式
tagName?string = “div”根元素的 HTML 元素标签名称

7、持久布局与 SSR 结合使用

默认情况下,该库用于localStorage保留布局。对于服务器渲染,当默认布局(在服务器上渲染)替换为持久布局(在 中localStorage)时,这可能会导致闪烁。
避免这种闪烁的方法是使用 cookie 来持久化布局,如下所示:

服务器组件

import ResizablePanels from "@/app/ResizablePanels";
import { cookies } from "next/headers";

export function ServerComponent() {
  const layout = cookies().get("react-resizable-panels:layout");

  let defaultLayout;
  if (layout) {
    defaultLayout = JSON.parse(layout.value);
  }

  return <ClientComponent defaultLayout={defaultLayout} />;
}

客户端组件

"use client";

import { Panel, PanelGroup, PanelResizeHandle } from "react-resizable-panels";

export function ClientComponent({
  defaultLayout = [33, 67],
}: {
  defaultLayout: number[] | undefined;
}) {
  const onLayout = (sizes: number[]) => {
    document.cookie = `react-resizable-panels:layout=${JSON.stringify(sizes)}`;
  };

  return (
    <PanelGroup direction="horizontal" onLayout={onLayout}>
      <Panel defaultSize={defaultLayout[0]}>{/* ... */}</Panel>
      <PanelResizeHandle className="w-2 bg-blue-800" />
      <Panel defaultSize={defaultLayout[1]}>{/* ... */}</Panel>
    </PanelGroup>
  );
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1577526.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Web】纯萌新的CISCN刷题记录(1)

目录 [CISCN 2019华东南]Web11 [CISCN 2019华北Day2]Web1 [CISCN 2019初赛]Love Math [CISCN 2022 初赛]ezpop [CISCN 2019华东南]Double Secret [CISCN 2023 华北]ez_date [CISCN 2019华北Day1]Web1 [CISCN 2019华东南]Web4 [CISCN 2019华北Day1]Web2 [CISCN 2023 …

知识融合与消歧:完善知识图谱的关键步骤

知识融合与消歧&#xff1a;完善知识图谱的关键步骤 一、引言&#xff1a;知识融合与消歧的重要性 在今天的数据驱动时代&#xff0c;知识图谱已成为组织和理解海量信息的关键技术。它们使得复杂的数据关系可视化&#xff0c;为人工智能提供了丰富的知识基础。然而&#xff0c…

成都源聚达:抖音开店新手做什么靠谱

在数字化浪潮下&#xff0c;抖音成为创业者的新阵地。新手若想在这片热闹非凡的土地上开垦出自己的一片天地&#xff0c;首要策略是选择靠谱的商品或服务。靠谱的定义在于市场需求的稳定性与产品的可持续性&#xff0c;以及是否具备一定的创新性和差异化特征。 以李华为例&…

一种保护隐私的混合联邦学习方法-文章翻译

一种保护隐私的混合联邦学习方法 摘要 联邦学习促进了模型的协作培训,而无需共享原始数据。然而,最近的攻击表明,仅仅在培训过程中维护数据位置并不能提供足够的隐私保证。相反,我们需要一个联邦学习系统,该系统能够防止对训练期间交换的消息和最终训练的模型进行推理,…

货物摆放-C++题解

计算本题前先了解一下约数 约数&#xff0c;又称因数。整数a除以整数b(b≠0) 除得的商正好是整数而没有余数&#xff0c;我们就说a能被b整除&#xff0c;或b能整除a。a称为b的倍数&#xff0c;b称为a的约数 然后首先要求出n的所有因数&#xff0c;因为题目需要满足的条件是nLWH…

柯桥外语培训之【韩语干货】如何用韩语作简单自我介绍

안녕하세요! 意思是“您好”“你好”&#xff0c;这是最常用的问候语&#xff0c;正式场合可以使用“안녕하십니까?" 제 이름은 [你的名字]이고, [你的年龄] 살입니다. 意思是“我的名字是~&#xff0c;~岁了”&#xff0c;这是比较谦虚的自我介绍方式 介绍自己的名字…

Python第四次作业

周六&#xff1a; 1. 找出10000以内能被5或6整除&#xff0c;但不能被两者同时整除的数&#xff08;函数&#xff09; def find_number():for number in range(0,10000):if number % 5 0 or number % 6 0:if number % 5 ! number % 6:ls.append(number)print(ls)ls [] fin…

CSS 基础:设置背景的 5 个属性及简写 background 注意点

你好&#xff0c;我是云桃桃。 一个希望帮助更多朋友快速入门 WEB 前端的程序媛。大专生&#xff0c;一枚程序媛&#xff0c;感谢关注。回复 “前端基础题”&#xff0c;可免费获得前端基础 100 题汇总&#xff0c;回复 “前端工具”&#xff0c;可获取 Web 开发工具合集 263篇…

谷歌浏览器用不了怎么办?

打开谷歌浏览器点击右上角的三个点 &#xff0c; 点击设置 在搜索引擎里面把这个改成百度 然后越狱登录你的谷歌账号就可以用了 我个人用的越狱软件是r2rayn &#xff0c; 浏览器上面可以搜索的 默认浏览器那里可以设置成谷歌

Vue - 你知道Vue2中对象动态新增属性,视图无法更新的原因吗

难度级别:中高级及以上 提问概率:55% 这道题面试官会这样描述,比如有这样一个场景,一个对象里有name属性,可以正常显示在页面中。但后续动态添加了一个age属性,通过调试打印发现对象里的age属性已经添加了上了,但试图中却没有展示出来,…

有了这款开源的电子签就再也不用重复造轮子了!

程序员的公众号&#xff1a;源1024&#xff0c;获取更多资料&#xff0c;无加密无套路&#xff01; 最近整理了一份大厂面试资料《史上最全大厂面试题》&#xff0c;Springboot、微服务、算法、数据结构、Zookeeper、Mybatis、Dubbo、linux、Kafka、Elasticsearch、数据库等等 …

LeetCode刷题之105. 从前序与中序遍历序列构造二叉树

文章目录 1.题目描述2. 分析2.1 前序遍历2.1.1 什么是前序遍历&#xff1f;2.1.2 前序遍历有什么特点&#xff1f; 2.2 中序遍历2.2.1 什么是中序遍历2.2.2 中序遍历有什么特点&#xff1f; 2.3 后序遍历2.3.1 什么是后序遍历&#xff1f;2.3.2 特点 2.4 总结 3. 解法 1.题目描…

职场成功的关键因素:如何成为一位优秀的职场人

在竞争激烈的职场环境中&#xff0c;如何脱颖而出&#xff0c;成为一位优秀的职场人&#xff0c;成为了许多职场人士关注的焦点。本文将探讨职场成功的关键因素&#xff0c;帮助您在职场中取得更好的发展。 一、专业技能 专业技能是职场成功的基础。具备扎实的专业技能&#xf…

D-ID介绍以及订阅教程

D-ID 是一家提供人工智能仿真人视频产品服务和开发的公司。 用户只需上传人像照片&#xff0c;输入要说的内容&#xff08;台词&#xff09;&#xff0c;D-ID 就能利用AI 语音机器人自动将用户输入的文字转换成音频&#xff0c;用户甚至还能直接上传录音文件&#xff0c;快速获…

[Mac]安装App后“XX已损坏,无法打开“

问题&#xff1a; “xx.app”已损坏&#xff0c;无法打开。你应该将它移到废纸篓。 解决&#xff1a; 终端输入sudo xattr -r -d com.apple.quarantine 后将Applications中对应的问题app拖入生成路径&#xff0c;然后执行。 $ sudo xattr -r -d com.apple.quarantine /Appli…

做抖店什么东西好卖?什么商品赚钱?抖音小店的选品标准来了!

哈喽~我是电商月月 做抖店&#xff0c;选品决定了一切&#xff01; 而从没接触过抖店的新手朋友&#xff0c;根本不知道什么样的商品才能算的上是好商品 在这里&#xff0c;我不敢告诉大家这个商品好卖&#xff0c;你们快去卖&#xff01;店铺的情况不同&#xff0c;运营方式…

蓝桥杯算法题:练功

【问题描述】 小明每天都要练功&#xff0c;练功中的重要一项是梅花桩。 小明练功的梅花桩排列成 n 行 m 列&#xff0c;相邻两行的距离为 1&#xff0c;相邻两列的距离也为 1。 小明站在第 1 行第 1 列上&#xff0c;他要走到第 n 行第 m 列上。小明已经练了一段时间&#xff…

如何使用固定公网地址SSH远程访问本地内网openEuler系统

文章目录 1. 本地SSH连接测试2. openEuler安装Cpolar3. 配置 SSH公网地址4. 公网远程SSH连接5. 固定连接SSH公网地址6. SSH固定地址连接测试 欧拉操作系统(openEuler, 简称“欧拉”)是面向数字基础设施的操作系统,支持服务器、云计算、边缘openEuler是面向数字基础设施的操作系…

xgo: golang基于-toolexec实现猴子补丁

注&#xff1a; 转载请注明出处&#xff0c; 原文链接。 概述 在这篇博客中&#xff0c;我将详细介绍 xgo 的实现细节。 如果你不知道&#xff0c;xgo 项目位于 https://github.com/xhd2015/xgo。 它的作用很简单&#xff0c;就是在每个 Go 函数的开头添加拦截器&#xff0…

【C++】手搓 list 容器

送给大家一句话&#xff1a; 若结局非你所愿&#xff0c;就在尘埃落定前奋力一搏。—— 《夏目友人帐》 手搓 list 容器 1 前言1. 1 底层结构1.2 使用场景1.3 功能简介 2 框架搭建2.1 节点类2.2 list 类2.3 迭代器类 3 功能实现3.1 begin() 与 end()3.2 插入操作3.3 删除操作…