内容简介:最近老板让做一个自定义面板,能够在面板上自由的拖拽,新增,删除组件。组件可以是各种echarts图形,通过各个组件的拖拽组合,从而让用户自定义想要看到的面板。需求就是这样,那么撸起袖子开始干!:joy:组件可以动态添加,删除,可以自由拖拽,缩放。并且缩放后组件内部的echarts图表也会跟着缩放。
最近老板让做一个自定义面板,能够在面板上自由的拖拽,新增,删除组件。组件可以是各种echarts图形,通过各个组件的拖拽组合,从而让用户自定义想要看到的面板。需求就是这样,那么撸起袖子开始干!:joy:
项目预览
组件可以动态添加,删除,可以自由拖拽,缩放。并且缩放后组件内部的echarts图表也会跟着缩放。
项目实战
技术架构
- 前端框架:React
- UI库:Ant Design
- 脚手架: create-react-app
- 拖拽插件: react-grid-layout
技术实现
- 使用npm安装react-grid-layout包
npm install react-grid-layout 复制代码
- 在js文件中引入WidthProvider和Responsive组件,并且实例化响应式拖拽组件。在css文件中引入插件的样式。
import { WidthProvider, Responsive } from "react-grid-layout"; const ResponsiveReactGridLayout = WidthProvider(Responsive); 复制代码
@import '~react-grid-layout/css/styles.css'; @import '~react-resizable/css/styles.css'; 复制代码
- 在React的render方法中渲染可拖拽布局。ResponsiveReactGridLayout组件有多个属性,这里举几个比较重要的说明一下:
- cols:定义了响应式布局划分成几列。
- rowHeight:响应式布局中组件的行高。
- onLayoutChange:当响应式布局中的组件发生拖拽或者放大缩小时触发该函数。
<ResponsiveReactGridLayout className="layout" {...this.props} layouts={this.state.layouts} onLayoutChange={(layout, layouts) => this.onLayoutChange(layout, layouts) } > {this.generateDOM()} </ResponsiveReactGridLayout> 复制代码
- 通过generateDOM函数生成布局中的组件,首先先遍历组件数组,通过每个组件的类型判断生产柱状图组件,折线组件,还是饼图组件。每个组件必须定义一个全局唯一的key值。data-grid为每一个组件绑定了其属性。下面会介绍具体的data-grid属性。
generateDOM = () => { return _.map(this.state.widgets, (l, i) => { let option; if (l.type === 'bar') { option = getBarChart(); }else if (l.type === 'line') { option = getLineChart(); }else if (l.type === 'pie') { option = getPieChart(); } let component = ( <ReactEcharts option={option} notMerge={true} lazyUpdate={true} style={{width: '100%',height:'100%'}} /> ) return ( <div key={l.i} data-grid={l}> <span className='remove' onClick={this.onRemoveItem.bind(this, i)}>x</span> {component} </div> ); }); }; 复制代码
- 通过addItem函数来新增组件。每个组件属性如下:
- x: 组件在x轴坐标
- y: 组件在y轴坐标
- w: 组件宽度
- h: 组件高度
- i: 组件key值
addItem(type,widgetId) { const addItem = { x: (this.state.widgets.length * 2) % (this.state.cols || 12), y: Infinity, // puts it at the bottom w: 2, h: 2, i: widgetId || new Date().getTime().toString(), }; this.setState( { widgets: this.state.widgets.concat({ ...addItem, type, }), }, ); }; 复制代码
- 通过onRemoveItem函数来移除增组件。
onRemoveItem(i) { console.log(this.state.widgets) this.setState({ widgets: this.state.widgets.filter((item,index) => index !=i) }); } 复制代码
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- [Grid 网格布局教程]显式网格和隐式网格之间的区别
- CSS网格布局(Grid)教程
- CSS Grid 网格布局教程
- CSS自定义属性+CSS Grid网格实现超级的布局能力
- Visual Studio Code 1.25支持新的网格布局和大纲视图
- 【译】如何利用CSS网格布局和CSS自定义变量快速构建app原型
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。