项目总结

65 阅读3分钟

滚动条样式

例子:

 /*滚动条样式*/
        .innerbox::-webkit-scrollbar {
            width: 4px;    
            /*height: 4px;*/
        }
        .innerbox::-webkit-scrollbar-thumb {
            border-radius: 10px;
            -webkit-box-shadow: inset 0 0 5px rgba(0,0,0,0.2);
            background: rgba(0,0,0,0.2);
        }
        .innerbox::-webkit-scrollbar-track {
            -webkit-box-shadow: inset 0 0 5px rgba(0,0,0,0.2);
            border-radius: 0;
            background: rgba(0,0,0,0.1);

        }

兼容ie问题

initial

initial 关键字用于设置 CSS 属性为它的默认值,可作用于任何 CSS 样式。(IE 不支持该关键字)

edg中的ie兼容调试

%systemroot%\system32\f12\IEChooser.exe

IE10+支持placeholder属性,它的表现与其它浏览器也不一致

•IE10+里鼠标点击时(获取焦点)placeholder文本消失 •Firefox/Chrome/Safari点击不消失,而是键盘输入时文本消失

textarea在ie下和谷歌下的显示不同(饿了么ui为例)

.el-textarea__inner {

overflow-y: auto;

}

心得

开启项目前做好充足的准备:

准备点要求
整个项目的基础配置 开发 / 测试/ 生产 环境的配置等等
全局样式的编写 , 字体 ,字号, 行间距 , 常用样式, 使用scss变量先声明
全局加载的引入
全局提示的引入
全局暂无数据的样式使用
编写代码尽量组件化 , 多去抽离组件 , 组件与组件之间低内聚 高耦合

前端文件流下载

关于前端文件流的下载, 项目中遇到很多次了, 一直没有一次归纳.

这其中又分为两种方式 一种是get下载方式, 一种是post方式, 下面依次介绍这两种方式的优缺点.........

请求方式优点缺点
get 请求简单粗暴, 直接在标签调用即可如果url要鉴权 , 可能无法鉴权, 鉴权困难
post 请求实现比较复杂
  const action = `/api/user-service${api}?${qs.stringify(params)}`;
  window.open(action, '_target');

而使用post方法下载

var blob = new Blob(['后台返回的二进制文件'],{type : '该文件是什么类型的文件(MIME)'});

​ 常用的文件类型有(MIME),根据需要返回怎样的文件,就填写怎样的MIME类型,也可以不写,写的话指定了下载的文件格式,不写,文件是什么格式,下载就是什么格式,根据项目需求.

	一定要在请求的res里清楚的拿到二进制流文件,一般是res或者res.data,可以console.log打印试试。

拿数据时,切记设置post请求的 responseType: ‘blob’,(经常忘记) 还有需要注意的是, 这个要'blob'这个字符串, 而不是一个Blob对象....., 这个问题也让我犯错了几次. 请求拿到后,创建blob对象要知道文件具体格式,如上所列,如果是excle则,

const blob = new Blob([res.data], {
   type: 'application/vnd.ms-excel',
 })

​ 还有需要注意的是, 如果项目中使用mock来拦截数据, 那么会使项目死掉, 因为该返回并不是字符串, 结合axios的使用都会发生这样的事情, 不知道能否去判断和去配置.

最后使用 window.URL.createObjectURL(blob)来将 得到的blob对象来进行 URL转换 , 然后通过js来点击调用下载.

 /**
 * 导出
 */
exportExcleFun() {
  axios({
    method: 'post',
    url: '/api/lostFound-service/travel/deposit/export',
    responseType: 'blob',
    data: this.model,
  })
    .then((res) => {
      // console.log(res.data);
      const blob = new Blob([res.data], {
        type: 'application/vnd.ms-excel',
      });
      const url = window.URL.createObjectURL(blob);
      this.download(url, '物品寄存列表');
      // window.location.href = url;
    });
},
    /**
       * post方式导出。
       * @param {blob路径} blobUrl
       * @param {*} name
    */
    download(blobUrl, name) {
        const link = document.createElement('a');
        link.style.display = 'none';
        link.href = blobUrl;
        link.download = `${name}.xlsx`;
        document.body.appendChild(link);
        link.click();
        document.body.removeChild(link);
        window.URL.revokeObjectURL(href); //释放掉blob对象
    },

使用provide/indject

应用场景: 父组件向子孙组件数据共享(不要破坏单向数据流)

如何具有响应式 : 函数式声明 + 函数式调用 + 计算属性来保护单向数据流