微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!
使用elementUI的时候,使用Upload 上传的时候,使用 list-type 属性来设置文件列表的样式,before-upload方法失效
最近在做项目的时候,使用elementUI的时候,使用Upload 上传的时候,before-upload方法失效。情况下:使用 list-type 属性来设置文件列表的样式。最终的优化之后:(演示的是修改)需求:1、已经提交的附件不可删除,新上传的附件可以删除2、图片附件不能上传其他格式的文件,一次可以多张上传图片,最多上传3张,最大不超过2M3、文件附件不能上传除了图片格式以外的格式,一次可以上传多个文件,最多上传3个文件,最大不超过2M4、手动上传文件一、使用on-change方法来模拟before-upload方法来判断文件类型或大小查找了资料发现还是不行,只能求助大佬们?<el-form-item prop="image" label="图片附件上传"><el-uploadref="uploadImage":action="uploadAction":before-upload="beforeUploadPicture":before-remove="beforeRemovePicture":on-change="imageChange"list-type="picture-card"name="files":file-list="eventDetail.images":limit="3"multiple:auto-upload="false":on-preview="handlePictureCardPreview":on-remove="handleRemovePicture":on-exceed="handleExceedPicture"><i class="el-icon-plus"></i></el-upload><el-dialog append-to-body title="图片详情" :visible.sync="dialogVisible"><img width="100%" :src="dialogImageUrl" alt=""></el-dialog></el-form-item> 最后只能使用on-change来模拟before-upload方法的判断上传的照片或者文件的格式。//这个是before-upload方法,来判断上传文件 beforeUploadPicture(file){// console.log(file, fileList, '=============================')const isImage = file.raw.type == 'image/png' || file.raw.type == 'image/jpg' || file.raw.type == 'image/jpeg' || file.raw.type == 'image/bmp' || file.raw.type == 'image/gif' || file.raw.type == 'image/webp';const isLt2M = file.size < 1024 * 1024 * 2;if (!isImage) {this.$message.error('上传只能是png,jpg,jpeg,bmp,gif,webp格式!');}if (!isLt2M) {this.$message.error('上传图片大小不能超过 2MB!');}return isImage && isLt2M;},******然后这个方法失效,on-change方法正常。我只能使用on-change方法来******//on-change的方法 imageChange(file, fileList) {const isImage = file.raw.type == 'image/png' || file.raw.type == 'image/jpg' || file.raw.type == 'image/jpeg' || file.raw.type == 'image/bmp' || file.raw.type == 'image/gif' || file.raw.type == 'image/webp';const isLt2M = file.size < 1024 * 1024 * 2;if (!isImage) {this.$message.error('上传只能是png,jpg,jpeg,bmp,gif,webp格式!');}if (!isLt2M) {this.$message.error('上传图片大小不能超过 2MB!');}if(isImage && isLt2M){this.imageList = fileList;this.images[''] = fileList;}else{fileList.splice(-1,1);}},以上是图片附件的:使用on-change方法模拟before-upload方法,使用splice删除文件,splice方法是可以改变原始数组的,这样就模拟了上传前判断文件格式。文件附件的方法跟这个类似,改一下方法名就行 二、已经保存的文件不可删除,怎么判断思路:我本来是打算从列表中根据单子状态来判断,然后发现我新上传的文件,也删除不了,所以最后使用文件的url路径来判断是不是已经保存的,因为这是手动保存,文件路径如果不是服务器地址而是本地地址,就可以判断为这是新上传的文件,就可以删除。使用before-remove方法beforeRemovePicture(file, fileList){if(file.url.indexOf('blob') === -1){this.$message.warning('已提交的服务单的附件不能删除')return false;}}, 三、手动上传文件和附带其他参数思路:可以自己构建FormData数据,使用append方法构造一个文件对象,并且将其他参数加入到文件对象手动上传方法(构造FormData文件对象)let wfForm = new FormData();wfForm.append('orderId', this.eventDetail.orderId)wfForm.append('eventCategory', this.eventDetail.eventCategory)wfForm.append('priority', this.eventDetail.priority==null?'':this.eventDetail.priority)wfForm.append('title', this.eventDetail.title)wfForm.append('dsc', this.eventDetail.dsc==null?'':this.eventDetail.dsc)wfForm.append('occurDate', this.eventDetail.occurDate==null?'':this.eventDetail.occurDate)let attIds = ''for (let i = 0, length = this.eventDetail.files.length; i < length; i++) {attIds += this.eventDetail.files[i].attId + ',';}for (let i = 0, length = this.eventDetail.images.length; i < length; i++) {attIds += this.eventDetail.images[i].attId + ',';}attIds = attIds.substring(0, attIds.length - 1);wfForm.append('attIds', attIds);Object.entries(this.images).forEach(file => {file[1].forEach(item => {wfForm.append('file', item.raw)wfForm.append(item.name, file[0])})})Object.entries(this.files).forEach(file => {file[1].forEach(item => {wfForm.append('file', item.raw)wfForm.append(item.name, file[0])})})说明一下:1、this.images指的是新上传的图片的数组,this.files值的是新上传的文件的数组。2、Object.entries方法主要是用来遍历对象属性。3、wfForm.append('file', item.raw)用来构建文件对象 
vue + elementUi + upLoadIamge组件 上传文件到阿里云oss
<template><div class="upLoadIamge"><el-uploadaction="https://jsonplaceholder.typicode.com/posts/"list-type="picture-card":on-preview="handlePictureCardPreview":on-remove="handleRemove":http-request="myLoad"><i class="el-icon-plus"></i></el-upload><el-dialog :visible.sync="dialogVisible"><img width="100%" :src="dialogImageUrl" alt=""></el-dialog></div></template><script>let axios = require('axios')export default {name: 'upLoadIamge',data () {return {dialogImageUrl: '',dialogVisible: false}},methods: {handleRemove (file, fileList) {console.log(file, fileList)},handlePictureCardPreview (file) {this.dialogImageUrl = file.urlthis.dialogVisible = true},// 自定义上传的方式 作者:曾经的水哥 https://www.cnblogs.com/cengjingdeshuige/myLoad (param) {let file = param.file // 得到文件的内容console.log(file)let index = file.name.indexOf('.')let nameEnd = file.name.substr(index)const ossApiUrl = '这个是获取OSS签名的后台接口地址' // 获取oss签名的地址// 获取oss签名axios.post(ossApiUrl).then((data) => {if (data.status == 200 && data.data.code == 0) { //eslint-disable-linelet json = data.data.datalet ossUrl = json.hostlet nameStart = new Date().getTime() + '' + Math.ceil(Math.random() * 100)let name = '/' + nameStart + nameEndlet getUrl = json.host + '/' + json.dir + name // 上传后的文件地址let sendData = new FormData() // 上传文件的data参数sendData.append('OSSAccessKeyId', json.accessid)sendData.append('policy', json.policy)sendData.append('Signature', json.signature)sendData.append('keys', json.dir)sendData.append('key', json.dir + name)sendData.append('success_action_status', 200) // 指定返回的状态码sendData.append('type', 'image/jpeg')sendData.append('file', file)console.log(sendData)axios.post(ossUrl, sendData).then(() => {console.log('得到上传到阿里云的图片地址: ' + getUrl)})}})}},mounted () {}}</script> 
vue项目中的elementui的表格中画甘特图
最近的项目要求甘特图在elementui中实现,在此做出总结。性能限制,不能传入太多的数据。条件(时间):计划开始时间、计划结束时间、开始时间、结束时间、最大时间和最小时间。思维:渲染表格头、渲染天数、填充色块。实现简单的表格<el-table:data = "tableData"border><el-table-columnlabel="序号"type="index"align="center"width="40"></el-table-column><el-table-columnlabel="计划开始时间"prop="planned_start"align="center"width="110"><template slot-scope="scope"><span>{{ scope.row.planned_start }}</span></template></el-table-column><el-table-columnlabel="计划结束之间"prop="planned_end"align="center"width="100"><template slot-scope="scope"><span>{{ scope.row.planned_end }}</span></template></el-table-column><el-table-columnlabel="实际开始时间"prop="start_date"align="center"width="110"><template slot-scope="scope"><span>{{ scope.row.start_datet }}</span></template></el-table-column><el-table-columnlabel="实际结束时间"prop="end_date"align="center"width="110"><template slot-scope="scope"><span>{{ scope.row.end_date }}</span></template></el-table-column><el-table-columnv-for="(item, index) in showMonths":label="item.month" // 渲染月份prop="showMonths"align="center":key="index"><el-table-columnv-for="(it, index1) in item.daysArr":label="it.day"width="20"padding: 0; margin: 0;"align="center":key="index1"><template slot-scope="scope1" class="progressCon"><div :class="scope1.row['s-' + item.str + '-' + it.day] ? 'progressUpon' : '' "></div><div :class="scope1.row['t-' + item.str + '-' + it.day] ? 'progressDownon' : '' "></div></template></el-table-column></el-table-column></el-table>两个样式.el-table--enable-row-transition .el-table__body td{position: relative;}.progressCon{padding: 0;margin: 0;position: relative;},progressUpon{background: rgb(38, 84, 124);height: 10px;width: 20px;z-index: 3;position: absolute;top: 8px;},progressDownon{background: rgb(255,209,102);height: 10px;width: 20px;z-index: 3;position: absolute;top: 25px;left: 0px;}实现方法设:最小时间为startDate、最大时间为endDate、表格数据为tableData;// 渲染表格头,首先是年月,如2018年11月getChartTitle(startDate, endDate){var chartTable = this.tableDate;for(var i = 0; i < chartTable.length; i++){var planStartDate = chartTable[i].planned_start;var planEndDate = chartTable[i].planned_end;var realStartDate = chartTable[i].start_date;var realEndDate = chartTable[i].end_date;var mainObj = chartTable[i];var allPlanArr = this.getAll(planStartDate, planEndDate); // 获取两段时间中的所有日期,添加到数据的表格中if(allPlanArr){for(var j = 0; i < allPlanArr.length; j++){var objIndex = "s-" + allPlanArr[j]'mainObj[objIndex] = true;}}var all RealArr = this.getAll(realStartDate, realEndDate);if(allRealArr){for(var j = 0; j < allRealArr.length; j++){var objIndex = "t-" + allRealArr[j];mainObj[objIndex] = true;}}}// 以下操作把数据放到表格中var dateArr = this.getAll(startDate, endDate); // 表格上方的标题和日期this.getYearArr(dateArr); //获取并拼接我们需要的年月信息。var allYearArr = this.getYearArr(dateArr);var allMonths = []'for(var i = 0; i < allYearArr.length; i++){for(var j = 0; j < allYearArr[i]/days.length; j++){allMonths.push(allYearArr[i].days[j]);}}this.showMonths = allMonths; // 渲染表格上部的标题}// 获取时间数组的函数getAll(begin, end){ // 开始时间和结束时间有不存在的if(!begin || !end){return false;}// 获取两个日期之间的所有日期Date.prototype.format = function(){var s = "";var month = this.getMonth() + 1;var day = this.getDate();s += this.getFullYear() + '-';s += month + '-';s += day;return s; // 返回可以prop进表格的数据如:'s-2018-11-19'}var ab = begin.split('-');var ae = end.split('-');var db = new Date();db.setUTCFullYear(ab[0], ab[1] - 1, ab[2]);var de = new Date();de.setUTCFullYear(ae[0], ae[1] - 1, ae[2]);var unixDb = db.getTime();var unixDe = de.getTime();var arr = [];for(var k = unixDb, k <= unixDe; ){ // 开始的时间戳,结束的时间戳arr.push(new Date(parseInt(k)).format());k = k + 24 * 60 * 60 * 1000;}return arr;}// 获取我们需要的格式的年月日信息getYearArr(dateArr){// 获取我们需要格式的年月信息var yearArr = [];var arr1 = []; // 存年for(var i = 0; i < dateArr.length; i++){var fullYear = new Date(dateArr[i]).getFullYear();if(arr1.indexOf(fullYear) >= 0){// 有这一年,继续continue;}else{arr1.push(fullYear); // 没有就新增}}for(var i = 0; i < arr1.length; i++){var yearObj = {year: "",months: [], // 放月的数组days: [{strs: "",month: "",daysArr: [day: "",a: "",b: ""]}]};yearArr.push(yearObj);yearArr[i].year = arr1[i]; // 赋值年}for(var i = 0; i < arr1.length; i++){// 遍历拥有的年yearArr[i].months = [];for(var j = 0; j < dateArr.length; j++){// 遍历日期 获得这一年,依据这一年获取月份var fullYear = new Date(dateArr[j]).getFullYear();if(arr1[1] == fullYear){// 当数组中的年和日期的年相等时,获取月份var fullYear = new Date(dateArr[
基于Elementui的日期选择器时间范围限制
一般在实际开发场景中我们需要对时间选择做一些限制,如不能选择今天之前的时间、不能选择今天以后的日期、限制日期不能大于开始日期等等。日期组件<el-date-pickerv-model="value1"type="date"placeholder="选择日期":picker-options="pickerOptions0"></el-date-picker>1.选择今天及今天以后的日期data(){return {value1: '',pickerOptions0: {disabledDate(time){return time.getTime() < Date.now() - 8.64e7;}}}}2. 选择今天及今天以前的日期data (){return {value1: '',pickerOptions0: {disabledDate(time) {return time.getTime() > Date.now() - 8.64e6}},}}3. 选择今天之后的日期(不能选择当天)data (){return {value1: '',pickerOptions0: {disabledDate(time) {return time.getTime() < Date.now();}},}}4. 选择今天之前的日期(不能选择当天)data (){return {value1: '',pickerOptions0: {disabledDate(time) {return time.getTime() > Date.now() - 8.64e7;}},}}两个日期组件<el-date-pickerv-model="value1"type="date"placeholder="开始日期":picker-options="pickerOptions0"></el-date-picker><el-date-pickerv-model="value2"type="date"placeholder="结束日期":picker-options="pickerOptions1"></el-date-picker>两日日期之间的日期data(){return {value1: '',value2: '',pickerOptions0: {disabledDate: (time) => {if (this.value2 != "") {return time.getTime() > Date.now() || time.getTime() > this.value2;} else {return time.getTime() > Date.now();}}},pickerOptions1: {disabledDate: (time) => {return time.getTime() < this.value1 || time.getTime() > Date.now();}},}}转载自: https://www.cnblogs.com/xjcjcsy/p/7977966.html作者:rookie.he(kuke_kuke)博客链接:http://blog.csdn.net/qq_33599109欢迎关注支持,谢谢!