├── .babelrc
├── .editorconfig
├── .gitignore
├── README.md
├── dist
├── delete.png
├── vue-image-upload-preview.js
└── vue-image-upload-preview.js.map
├── index.html
├── package-lock.json
├── package.json
├── src
├── App.vue
├── assets
│ ├── delete.png
│ └── logo.png
├── lib
│ ├── image-preview.vue
│ ├── image-upload.vue
│ └── index.js
└── main.js
└── webpack.config.js
/.babelrc:
--------------------------------------------------------------------------------
1 | {
2 | "presets": [
3 | ["env", { "modules": false }],
4 | "stage-3"
5 | ]
6 | }
7 |
--------------------------------------------------------------------------------
/.editorconfig:
--------------------------------------------------------------------------------
1 | root = true
2 |
3 | [*]
4 | charset = utf-8
5 | indent_style = space
6 | indent_size = 2
7 | end_of_line = lf
8 | insert_final_newline = true
9 | trim_trailing_whitespace = true
10 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | .DS_Store
2 | node_modules/
3 | npm-debug.log
4 | yarn-error.log
5 |
6 | # Editor directories and files
7 | .idea
8 | *.suo
9 | *.ntvs*
10 | *.njsproj
11 | *.sln
12 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # vue-image-upload-preview
2 | [](https://www.npmjs.com/package/vue-image-upload-preview)
3 |
4 | 基于vue的图片上传和预览插件
5 |
6 | 该组件引用了 [mint-ui](https://github.com/ElemeFE/mint-ui) 和 [lrz](https://github.com/think2011/localResizeIMG)
7 |
8 | ## Install
9 |
10 | ```shell
11 | npm install vue-image-upload-preview --save-dev
12 | ```
13 | ## Usage
14 |
15 | - 引入图片上传和预览组件,可按需引入
16 | ```js
17 | import {ImageUpload , ImagePreview} from 'vue-image-upload-preview'
18 | ```
19 |
20 | - 注册组件
21 | ```js
22 | components:{
23 | 'image-preview':ImagePreview,
24 | 'image-upload':ImageUpload
25 | }
26 | ```
27 |
28 | - 使用组件
29 | ```html
30 |
31 |
32 |
33 |
45 |
46 |
47 |
55 |
56 |
57 |
58 | ```
59 |
60 | - 绑定数据
61 | ```js
62 | data() {
63 | return {
64 | index: -1,
65 | images: []
66 | }
67 | },
68 |
69 | computed:{
70 | preImages() {
71 | return this.images.map(v=>{return v.src});
72 | }
73 | }
74 | ```
75 |
76 | - 上传图片
77 | ```js
78 | this.$refs.imgaeUpload.uploadImages(this.images)
79 | .then(res => {
80 | ...
81 | }).catch(res => {
82 | ...
83 | })
84 | ```
85 |
86 | - 自定义上传按钮样式
87 | ```css
88 | .image_upload{ height: 60px; width: 60px;background: red}
89 | ```
90 |
91 | ## Props
92 |
93 | ##### ImageUpload
94 | - `url` - `String` - 上传图片的路径;
95 | - `field-name` - `Stirng` - 上传图片的字段名;
96 | - `multiple` - `Boolean` - [default:`false`] - 是否支持图片多选;
97 | - `lrz-options` - `Object` - [default:`{quality:0.7}`] - 图片压缩选项,参考(https://github.com/think2011/localResizeIMG/wiki/2.-参数文档);
98 | - `max-count` - `Number` - [default:`-1`] - -1表示无限张;
99 | - `chooseImages` - `Function` - 选择图片回调;
100 | ```js
101 | bindtap_chooseImages(e){
102 | /*
103 | * 选择成功 e是一个数组
104 | * e[0].file 图片文件对象,用于上传
105 | * e[0].src 图片base64,用于预览
106 | * e[0].compress 图片是否经过压缩
107 | */
108 | if(Array.isArray(e)){
109 | this.images = this.images.concat(e);
110 | }else {
111 | console.log(e);
112 | }
113 | }
114 | ```
115 | ##### ImagePreview
116 | - `images` - `Array` - [default:`[]`] - 预览图片的所有路径;
117 | - `deleteIsShow` - `Boolean` - [default:`false`] - 是否显示删除按钮;
118 | - `numIsShow` - `Boolean` - [default:`false`] - 是否显示数字;
119 | - `chooseImages` - `Function` - 选择图片回调;
120 | ```js
121 | bindtap_delete(e){
122 | /*
123 | * e 当前显示的图片的下标(双向绑定index,可以忽略e)
124 | * this.images 存储选择图片传过来的对象
125 | * this.index 双向绑定当前显示的图片的下标
126 | * 下面是删除的例子
127 | */
128 | this.images = this.images.filter((v,i) => {
129 | return this.index!=i;
130 | })
131 | },
132 | ```
133 |
134 |
135 | ## Notice
136 | - 使用方法仅供参考
137 | - /src/App.vue 有简单的例子 [demo](https://github.com/zhaodahai/vue-image-upload-preview/blob/master/src/App.vue)
138 |
--------------------------------------------------------------------------------
/dist/delete.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaodahai/vue-image-upload-preview/33fe5e56b3a3a47bd09af9d042c2318ac0951381/dist/delete.png
--------------------------------------------------------------------------------
/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | vue-image-upload-preview
6 |
7 |
8 |
9 |
10 |
11 |
12 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "vue-image-upload-preview",
3 | "description": "基于vue的图片上传和预览插件",
4 | "version": "1.0.2",
5 | "author": "zdh ",
6 | "license": "MIT",
7 | "private": false,
8 | "main": "dist/vue-image-upload-preview.js",
9 | "directories": {
10 | "dist": "dist"
11 | },
12 | "scripts": {
13 | "dev": "cross-env NODE_ENV=development webpack-dev-server --open --hot",
14 | "build": "cross-env NODE_ENV=production webpack --progress --hide-modules"
15 | },
16 | "dependencies": {
17 | "vue": "^2.5.11"
18 | },
19 | "browserslist": [
20 | "> 1%",
21 | "last 2 versions",
22 | "not ie <= 8"
23 | ],
24 | "devDependencies": {
25 | "babel-core": "^6.26.0",
26 | "babel-loader": "^7.1.2",
27 | "babel-preset-env": "^1.6.0",
28 | "babel-preset-stage-3": "^6.24.1",
29 | "cross-env": "^5.0.5",
30 | "css-loader": "^0.28.7",
31 | "file-loader": "^1.1.4",
32 | "vue-loader": "^13.0.5",
33 | "vue-template-compiler": "^2.4.4",
34 | "webpack": "^3.6.0",
35 | "webpack-dev-server": "^2.9.1",
36 | "lrz": "^4.9.40",
37 | "mint-ui": "^2.2.13"
38 | },
39 | "repository": {
40 | "type": "git",
41 | "url": "https://github.com/zhaodahai/vue-image-upload-preview.git"
42 | }
43 | }
44 |
--------------------------------------------------------------------------------
/src/App.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |

4 |
{{ msg }}
5 |
Essential Links
6 |
15 |
16 |
![]()
17 |
18 |
19 |
27 |
28 |
29 | 上传
30 |
31 |
32 |
33 |
34 |
35 |
111 |
112 |
119 |
--------------------------------------------------------------------------------
/src/assets/delete.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaodahai/vue-image-upload-preview/33fe5e56b3a3a47bd09af9d042c2318ac0951381/src/assets/delete.png
--------------------------------------------------------------------------------
/src/assets/logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaodahai/vue-image-upload-preview/33fe5e56b3a3a47bd09af9d042c2318ac0951381/src/assets/logo.png
--------------------------------------------------------------------------------
/src/lib/image-preview.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
{{'( '+((value>0?value:index)+1)+' / '+images.length+' )'}}
7 |

8 |
9 |
10 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
98 |
99 |
114 |
--------------------------------------------------------------------------------
/src/lib/image-upload.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
11 |
12 |
13 |
14 |
195 |
196 |
200 |
--------------------------------------------------------------------------------
/src/lib/index.js:
--------------------------------------------------------------------------------
1 |
2 | import ImageUpload from './image-upload';
3 | import ImagePreview from './image-preview';
4 |
5 | export {ImageUpload, ImagePreview};
6 |
--------------------------------------------------------------------------------
/src/main.js:
--------------------------------------------------------------------------------
1 | import Vue from 'vue'
2 | import App from './App.vue'
3 |
4 |
5 | // import ImageUploadPreview from './lib/index.js'
6 | // console.log(1111,ImageUploadPreview);
7 |
8 | new Vue({
9 | el: '#app',
10 | render: h => h(App)
11 | })
12 |
--------------------------------------------------------------------------------
/webpack.config.js:
--------------------------------------------------------------------------------
1 | var path = require('path')
2 | var webpack = require('webpack')
3 |
4 | module.exports = {
5 | entry: './src/lib/index.js',
6 | output: {
7 | path: path.resolve(__dirname, './dist'),
8 | publicPath: '/dist/',
9 | filename:'vue-image-upload-preview.js',
10 | library:'ImageUploadPreview',
11 | libraryTarget:'umd',
12 | umdNamedDefine:true
13 | },
14 | module: {
15 | rules: [
16 | {
17 | test: /\.css$/,
18 | use: [
19 | 'vue-style-loader',
20 | 'css-loader'
21 | ],
22 | }, {
23 | test: /\.vue$/,
24 | loader: 'vue-loader',
25 | options: {
26 | loaders: {
27 | }
28 | // other vue-loader options go here
29 | }
30 | },
31 | {
32 | test: /\.js$/,
33 | loader: 'babel-loader',
34 | exclude: /node_modules/
35 | },
36 | {
37 | test: /\.(png|jpg|gif|svg)$/,
38 | loader: 'file-loader',
39 | options: {
40 | name: '[name].[ext]?[hash]'
41 | }
42 | }
43 | ]
44 | },
45 | resolve: {
46 | alias: {
47 | 'vue$': 'vue/dist/vue.esm.js'
48 | },
49 | extensions: ['*', '.js', '.vue', '.json']
50 | },
51 | devServer: {
52 | historyApiFallback: true,
53 | noInfo: true,
54 | overlay: true
55 | },
56 | performance: {
57 | hints: false
58 | },
59 | devtool: '#eval-source-map'
60 | }
61 |
62 | if (process.env.NODE_ENV === 'production') {
63 | module.exports.devtool = '#source-map'
64 | // http://vue-loader.vuejs.org/en/workflow/production.html
65 | module.exports.plugins = (module.exports.plugins || []).concat([
66 | new webpack.DefinePlugin({
67 | 'process.env': {
68 | NODE_ENV: '"production"'
69 | }
70 | }),
71 | new webpack.optimize.UglifyJsPlugin({
72 | sourceMap: true,
73 | compress: {
74 | warnings: false
75 | }
76 | }),
77 | new webpack.LoaderOptionsPlugin({
78 | minimize: true
79 | })
80 | ])
81 | }
82 |
--------------------------------------------------------------------------------