vue自定义组件——split-pane
pre { overflow-y: auto; max-height: 500px }
github地址: https://github.com/lxmghct/my-vue-components
组件介绍
- props:
- splitCount: 分割数量, default: 2
- direction: 分割方向, 'vertical' or 'horizontal', default: 'horizontal'
- defaultRatio: 默认比例, 类型为数组, default: [1/spiltCount, 1/spiltCount, ...]
- slots:
- ...
- ...
- ...
- events:
- @resize: 拖动分割条时触发, 参数为分割线两侧的div
- @resize-stop: 拖动分割条结束时触发
- methods:
- changeItemSize(index, itemSize, dire='next') 改变第item个pane的大小, dire为next或prev, 表示修改当前pane时连带修改前一个pane还是后一个
效果展示

设计思路
整个组件采用flex布局,通过设置整体的flex-direction控制分割方向,通过修改每个pane的style.flex控制每个pane的大小。
<div class="split-main" ref="splitMain"
:class="direction === 'vertical' ? 'split-vertical' : 'split-horizontal'">
<template v-if="direction === 'vertical'">
<div v-for="i in splitCount" :key="i" ref="splitItem"
class="split-vertical-item">
<div class="split-vertical-line" v-if="i < splitCount"
@mousedown="_startDrag(i)"
@touchstart="_startDrag(i)"></div>
<div class="split-vertical-content">
<slot :name="`pane${i}`"></slot>
</div>
</div>
</template>
<template v-else>
<div v-for="i in splitCount" :key="i" ref="splitItem"
class="split-horizontal-item">
<div class="split-horizontal-line" v-if="i < splitCount"
@mousedown="_startDrag(i)"
@touchstart="_startDrag(i)"></div>
<div class="split-horizontal-content">
<slot :name="`pane${i}`"></slot>
</div>
</div>
</template>
</div>
通过v-for循环生成分割数量的pane,每个pane中间插入分割线,分割线通过@mousedown和@touchstart事件绑定_startDrag方法,该方法用于监听鼠标或手指的移动事件,从而实现拖动分割线改变pane大小的功能。
_startDrag (index) {
this.dragIndex = index - 1
},
_onMouseMove (e) {
if (this.dragIndex === -1) {
return
}
let items = this.$refs.splitItem
let item1 = items[this.dragIndex]
let item2 = items[this.dragIndex + 1]
let rect1 = item1.getBoundingClientRect()
let rect2 = item2.getBoundingClientRect()
let ratio1, ratio2
let minLen = this.minLen
if (this.direction === 'vertical') {
let height = this.$refs.splitMain.clientHeight
let tempY = e.clientY - rect1.top > minLen ? e.clientY : rect1.top + minLen
tempY = rect2.bottom - tempY > minLen ? tempY : rect2.bottom - minLen
ratio1 = (tempY - rect1.top) / height
ratio2 = (rect2.bottom - tempY) / height
} else {
let width = this.$refs.splitMain.clientWidth
let tempX = e.clientX - rect1.left > minLen ? e.clientX : rect1.left + minLen
tempX = rect2.right - tempX > minLen ? tempX : rect2.right - minLen
ratio1 = (tempX - rect1.left) / width
ratio2 = (rect2.right - tempX) / width
}
item1.style.flex = ratio1
item2.style.flex = ratio2
e.preventDefault()
this.$emit('resize', item1, item2)
},
_onMouseUp () {
if (this.dragIndex === -1) {
return
}
this.dragIndex = -1
this.$emit('resize-stop')
}
完整代码在github上。https://github.com/lxmghct/my-vue-components
vue自定义组件——split-pane的更多相关文章
- vue自定义组件(vue.use(),install)+全局组件+局部组件
相信大家都用过element-ui.mintui.iview等诸如此类的组件库,具体用法请参考:https://www.cnblogs.com/wangtong111/p/11522520.html ...
- Vue自定义组件实现v-model指令
Tips: 本文所描述的Vue均默认是Vue2版本 在我们初次接触Vue的时候,一定会了解到一个语法糖,那就是v-model指令,它带给我们的第一印象就是它可以实现双向绑定 那么,什么是双向绑定?通俗 ...
- [转] vue自定义组件(通过Vue.use()来使用)即install的使用
在vue项目中,我们可以自定义组件,像element-ui一样使用Vue.use()方法来使用,具体实现方法: 1.首先新建一个Cmponent.vue文件 // Cmponent.vue<te ...
- vue 自定义组件销毁
今天在开发电商vue前端项目时,用户每次登出再换其它用户登录时,页面显示的用户名和左则导航都还是上个用户的,刚开始以为是localStorage中没有清除全局数据,然后在用户点击退出系统时手动清除lo ...
- Vue自定义组件插入值
我们自定义组件的时候有时候需要往组件里面插一些内容: //定义一个组件test,插值内容用slog来代替 export default { name: 'test', template:` <d ...
- VUE 自定义组件之间的相互通信
一.自定义组件 1.全局自定义组件 我们在var vm = new Vue({});的上面并列写上Vue.component('自定义组件名',{组件对象});来完成全局自定义组件的声明.示例代码如下 ...
- vue自定义组件并使用
以下是使用自己写的一个简单的文件上传框为例 1.自定义组件结构(一个js文件,一个vue文件),最好单独放一个文件 2.upload.vue 内容 其中,action是父组件传递给子组件的参数,使用p ...
- vue自定义组件中的v-model简单解释
在使用iview框架的时候,经常会看到组件用v-model双向绑定数据,与传统步骤父组件通过props传值子组件,子组件发送$emit来修改值相比,这种方式避免操作子组件的同时再操作父组件,显得子组件 ...
- 8、VUE自定义组件
1.为什么要使用自定义组件? 自定义组件是用来封装复杂的内容,提高可重用性,比如封装复杂的表格组件.日历组件.图片轮播组件等. 2.自定义组件 2.1. 全局组件 全局组件是每个Vue对象都能使用的组 ...
- Vue自定义组件以及组件通信的几种方式
本帖子来源:小贤笔记 功能 组件 (Component) 是 Vue.js 最强大的功能之一.组件可以扩展 HTML 元素,封装可重用的代码.在较高层面上,组件是自定义元素,Vue.js 的编译器为它 ...
随机推荐
- 导入ssm项目时,项目基本的配置文件
一.ssm框架基本的配置文件 上面的这些配置文件对于比较简单的ssm项目其实大同小异,逻辑上是差不多的. 在config目录下 在lib下就是各种jar包 二.导入ssm项目后,本地环境配置和项目本身 ...
- winIO介绍
WinIO程序库允许在32位的Windows应用程序中直接对I/O端口和物理内存进行存取操作.通过使用一种内核模式的设备驱动器和其它几种底层编程技巧,它绕过了Windows系统的保护机制. 因为需要加 ...
- flink常用命令
1.查看flink任务 /var/lib/hadoop-hdfs/flink/bin/flink list 2.停止flink任务 /var/lib/hadoop-hdfs/flink/bin/fl ...
- Ubuntu与centos之间的文件传输
Ubuntu与centos之间的文件传输 默认端口:22 传输前确认端口是否开启 1.在Ubuntu上安装scp命令 apt-get install openssh-server 2.将U ...
- 第四章 快速排序 分而治之(divide an conquer)
def quicksort(array): if len(array) < 2: return array else: flag = array[0] less = [] greater = [ ...
- JavaScript argument
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- Django数据迁移介绍
1.简介 迁移是 Django 将你对模型的修改(例如增加一个字段,删除一个模型)应用至数据库表结构对方式 2.基本命令 python manage.py migrate---负责应用和撤销迁移 py ...
- TypeError: list indices must be integers or slices, not str解决方法
print (response.json()['data']['patientId'])TypeError: list indices must be integers or slices, not ...
- 我亲自整理的Tampermonkey(以下简称tm)v4.13.6136的编辑器按键映射(基于联想笔记本键盘+win10+火狐浏览器企业版)
警告:你可以对该随笔内容进行转载,但必须写明其来源网址,以及其作者是博客园的zqdlly,否则后果自负!不要小看了我,我一定会让你付出你应得的成本. 0. 家喻户晓的 键 原生comment myMe ...
- [picoCTF]Scavenger Hunt write up
http://mercury.picoctf.net:5080/,这个网站周围隐藏着一些有趣的信息.你能找到它吗? 根据提示: 您应该有足够的提示来查找文件,不要运行暴力破解程序. 点击链接,进入页面 ...