Skip to content

Commit 8d53ae1

Browse files
committed
add:add clipboard
1 parent a185412 commit 8d53ae1

File tree

7 files changed

+110
-0
lines changed

7 files changed

+110
-0
lines changed

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
},
1515
"dependencies": {
1616
"axios": "0.16.2",
17+
"clipboard": "1.7.1",
1718
"codemirror": "5.26.0",
1819
"dropzone": "5.1.0",
1920
"echarts": "3.6.2",

src/directive/clipboard/clipboard.js

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
// Inspired by https://github.com/Inndy/vue-clipboard2
2+
const Clipboard = require('clipboard')
3+
if (!Clipboard) {
4+
throw new Error('you shold npm install `clipboard` --save at first ')
5+
}
6+
7+
export default {
8+
bind(el, binding) {
9+
if (binding.arg === 'success') {
10+
el._v_clipboard_success = binding.value
11+
} else if (binding.arg === 'error') {
12+
el._v_clipboard_error = binding.value
13+
} else {
14+
const clipboard = new Clipboard(el, {
15+
text() { return binding.value },
16+
action() { return binding.arg === 'cut' ? 'cut' : 'copy' }
17+
})
18+
clipboard.on('success', e => {
19+
const callback = el._v_clipboard_success
20+
callback && callback(e) // eslint-disable-line
21+
})
22+
clipboard.on('error', e => {
23+
const callback = el._v_clipboard_error
24+
callback && callback(e) // eslint-disable-line
25+
})
26+
el._v_clipboard = clipboard
27+
}
28+
},
29+
update(el, binding) {
30+
if (binding.arg === 'success') {
31+
el._v_clipboard_success = binding.value
32+
} else if (binding.arg === 'error') {
33+
el._v_clipboard_error = binding.value
34+
} else {
35+
el._v_clipboard.text = function() { return binding.value }
36+
el._v_clipboard.action = function() { return binding.arg === 'cut' ? 'cut' : 'copy' }
37+
}
38+
},
39+
unbind(el, binding) {
40+
if (binding.arg === 'success') {
41+
delete el._v_clipboard_success
42+
} else if (binding.arg === 'error') {
43+
delete el._v_clipboard_error
44+
} else {
45+
el._v_clipboard.destroy()
46+
delete el._v_clipboard
47+
}
48+
}
49+
}

src/directive/clipboard/index.js

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
import Clipboard from './clipboard'
2+
3+
const install = function(Vue) {
4+
Vue.directive('Clipboard', Clipboard)
5+
}
6+
7+
if (window.Vue) {
8+
window.clipboard = Clipboard
9+
Vue.use(install); // eslint-disable-line
10+
}
11+
12+
Clipboard.install = install
13+
export default Clipboard

src/icons/svg/clipboard.svg

Lines changed: 1 addition & 0 deletions
Loading

src/router/index.js

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -174,6 +174,14 @@ export const asyncRouterMap = [
174174
noDropdown: true,
175175
children: [{ path: 'index', component: _import('theme/index'), name: '换肤' }]
176176
},
177+
{
178+
path: '/clipboard',
179+
component: Layout,
180+
redirect: 'noredirect',
181+
icon: 'clipboard',
182+
noDropdown: true,
183+
children: [{ path: 'index', component: _import('clipboard/index'), name: 'clipboard' }]
184+
},
177185

178186
{ path: '*', redirect: '/404', hidden: true }
179187
]

src/utils/clipboard.js

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
import Clipboard from 'clipboard'
2+
import Vue from 'vue'
3+
4+
function clipboardSuccess() {
5+
Vue.prototype.$message({
6+
message: '复制成功',
7+
type: 'success',
8+
duration: 1500
9+
})
10+
}
11+
12+
function clipboardError() {
13+
Vue.prototype.$message({
14+
message: '复制失败',
15+
type: 'error'
16+
})
17+
}
18+
19+
export default function handleClipboard(text, event) {
20+
const clipboard = new Clipboard(event.target, {
21+
text: () => text
22+
})
23+
clipboard.on('success', () => {
24+
clipboardSuccess()
25+
clipboard.off('error')
26+
clipboard.off('success')
27+
clipboard.destroy()
28+
})
29+
clipboard.on('error', () => {
30+
clipboardError()
31+
clipboard.off('error')
32+
clipboard.off('success')
33+
clipboard.destroy()
34+
})
35+
clipboard.onClick(event)
36+
}

src/views/clipboard/index.vue

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
<template>
2+
<div class="app-container">

0 commit comments

Comments
 (0)