1.关于数据for循环不要用index作为key,2.面二次刷新404问题(空白) 的探讨 3. vue图片上传

问题一:for循环建议不要直接用index作为key

  效果:页面删除之后不刷新,页面有两个图元,将前面画的图元删除掉,下拉找到的还是原来的那个图元,下拉数据没有“刷新”,

  我们首先来讨论一下页面vue数据绑定的机制

  原因:图元删除的时候,页面是有两个图元,一个先画一个后画,如果我删除后画的那个,正常,但是如果我删除的是第一个图元,如果页面正常走,看不出效果,但是如果页面在断点的情况下看,就能看出了问题

页面流程实际是先将后画的图元删掉了,然后将后一个图元的数据放到了前面一个数据中将dom渲染,

a图元对应index为1的数据   b图元对应index为2的数据

刚刚页面的问题,是因为for循环的时候用了index作为索引,删除数据1的时候,来到页面的时候并没有删除掉对应dom也就是index为1 而是把index为2的这个图元 删除掉了,把数据1放进了dom1的这个图元里面 渲染了

而在代码实现中,把业务代码写进了destroy里面,destroy他是判断页面dom销毁的时候触发  因为销毁的dom 因为index的问题,删除1的数据销毁了图元2,,取到的数据也是不对的了

 

解决办法:

  1、不直接用index作为索引

  2、如果用了,操作数据时候不要在destroy里面进行

 

问题二:页面刷新空白

报表页面从菜单进,可以正常打开报表页面,但是当页面一刷新了,页面就报错了

whitelabel Error Page

当时一直没有找到解决办法 后台觉得不是他的问题,前端也说不是前端问题,因为毕竟第一次能出来,

原因:

  因为页面url地址的原因,url路由链接写成了report   而前端代码在vue.config.js里面用了配置服务器  proxy   如果有report字段的就进行地址重写,因为碰到了这个report  进行了重定向跳到了一个位置的地址里面去了,所以就报错了

 

 

问题三:图片上传

1、头部信息一直带不上 上传不了,主要是因为请求头部被污染

解决办法,新建了axios,单独用做上传用

/**
 * 封装上传图片upload的方法
 * @param url
 * @param data
 * @returns {Promise}
 */
export function upload(url, data = {}) {
    let instance = axios.create();
    let Authorization = cookies.get('access_token') ?  "Bearer " + cookies.get('access_token')  : ''
    instance.defaults.headers.common['Authorization'] = Authorization
    return new Promise((resolve, reject) => {
        instance.post(url, data)
            .then(response => {
                if (response.data) resolve(response.data);
            }, err => {
                reject(err)
            })
    })
}

页面代码:

<template>
    <div class="param-pannel">
        <common-prm/>
        <border-prm myStyle="style" />
        <collapse-item title="图片" :isShow='true'>
            <div class="param-gap">
                <label class="left" for="">路径&nbsp;:</label>
                <div class="right">
                    <input type="file" name="file" ref="input" enctype="multipart/form-data" accept="image/gif,image/jpeg,image/jpg,image/png,image/svg" multiple="multiple" @change="getFile" class="data-value" />
                </div>
            </div>
        </collapse-item>
    </div>
</template>
<script>
import mixins from '../paramMixins.js'
import Api from '@frameworks/conf/api'
export default {
    name: 'ImgParam',
    mixins: [mixins],
    methods: {
        getFile(e) {
            //验证
            if (e.target.files[0].size >= 10048576) {
                this.$_c.msg("上传图片大小不得超过10M", { type: 'error' })
                return false;
            }
            // 预览图片用
            // var reader = new FileReader();
            // let _this = this
            // reader.onload = (function(file) {
            //     return function(e) {
            //         var datainfo = this.result
            //         console.log(datainfo)
            //         _this.params.images = datainfo
            //         _this.updateData()

            //     }
            // })(e.target.files[0]);
            // reader.readAsDataURL(e.target.fes[0]);
            //上传
            this.upload(e.target.files[0])
        },
        //调用上传图片的接口上传
        upload(file) {
            var formData = new FormData()
            formData.append('file', file)
            /*axios请求方式 */
            this.$ajax.upload(Api.uploadFile, formData).then((res) => {
                if (res.code === 200) {
                    this.$_c.msg(res.message)
                    //console.log(res.data.url)//将成功返回的url值设置回去
                    //console.log(this.params)
                    this.params.images = res.data.url  //如果想模拟就把下面两行去掉
                    this.updateData()
                } else {
                    this.$_c.msg(res.message, { type: 'error' })
                }
            }).catch(error => {
                this.$_c.msg("服务器报错", { type: 'error' })
            })
            //axios封装的post请求(不成功)
            /*this.$ajax.post(Api.uploadFile, formData).then(function(res) {
                alert(123)
            }, function() {
                this.promptText = '请求失败'
                this.$refs.prompt.show()
            })*/
            /*原生请求方式(成功) */
            // let xhr = new XMLHttpRequest();  // XMLHttpRequest 对象
            // xhr.open("post", "http://localhost:8082/api/files/api/upload/uploadFile", true); //post方式,url为服务器请求地址,true 该参数规定请求是否异步处理。
            // //xhr.setRequestHeader('content-type', 'multipart/form-data')
            // //xhr.setRequestHeader('Accept', 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8')
            // xhr.send(formData); //开始上传,发送form数据
            // xhr.onreadystatechange = function () {
            //     var data = xhr.responseText;
            //     console.log(data);
            // }
        }
    }
}
</script>
<style scoped lang="scss">
.param-pannel input,
.param-pannel select {
    border: 1px solid #ddd;
    width: 100%
}
.param-pannel>div {
    padding: 5px 0;
}
</style>

效果图 (支持各种图片上传   gif的如果不行就是后台问题,请求头问题)

 

posted @ 2020-05-22 21:20  人在路途  阅读(254)  评论(0编辑  收藏  举报