├── .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 | [![npm version](https://img.shields.io/npm/v/vue-image-upload-preview.svg?style=flat)](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 | 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 | 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 | 26 | 27 | 98 | 99 | 114 | -------------------------------------------------------------------------------- /src/lib/image-upload.vue: -------------------------------------------------------------------------------- 1 | 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 | --------------------------------------------------------------------------------