作者: admin

  • element-ui下拉多选组件el-cascader-multi

    element-ui默认是没有级联下拉多选功能,所以要借助第三方。

    npm i el-cascader-multi --save

     

    注册:

    在main.js中写入下面的代码

    import elCascaderMulti from "el-cascader-multi";
    Vue.use(elCascaderMulti);

     

    在vue文件中事件

    <template>
      <el-cascader-multi v-model="checkList" :data="data"> </el-cascader-multi>
    </template>
    <script>
    export default {
      data () {
       return {
         data: [], // 与element级联选择器格式一致
         checkList: []
       }
      }
    }
    </script>
    
    

    在线案例:https://sdeno.com/wp-content/uploads/2020/04/multi-cascader-demo.html

    有一个坑:如果是设置默认选中的状态要在v-model=”[[5,7,8]]”,加数组,而不是在value上加

     

    单选功能

    默认是没单选设置的,我们可以控制v-model=”checkList”的checkList值,当多选时自动删除里面的元素,仅仅保留一个,即可实现单选。

     

    Select Attributes

    参数 说明 类型 可选值 默认值
    data 用于渲染页面的数据(格式与element的级联选择器的数据格式一致) Array – 无
    value 默认已选择数据项 Array – 无
    disabled 是否禁用 boolean – false
    expand-trigger 次级菜单的展开方式 次级菜单的展开方式 click / hover click
    separator 选项分隔符 string – 横杆’-’
    value-key 指定选项的值为选项对象的某个属性值 string – value
    label-key 指定选项标签为选项对象的某个属性值 string – label
    children-key 指定选项的子选项为选项对象的某个属性值 string – children
    size 尺寸 string medium / small / mini –
    clearable 是否支持清空选项 boolean – false
    collapse-tags 多选时是否将选中值按文字的形式展示 boolean – false
    placeholder 占位符 string – 请选择
    filterable 是否可搜索 boolean – false
    filter-method 自定义搜索方法 function – 参数为(list,searchText),需要把过滤后的数据return
    no-data-text 选项为空时显示的文字 string – 无数据
    popper-class Select 下拉框的类名 string – –
    reserve-keyword 多选且可搜索时,是否在选中一个选项后保留当前的搜索关键词 boolean – false
    only-last 是否只有叶子节点才支持多选 boolean – false
    is-two-dimension-value 绑定的value是[[‘level-1’,‘level-2’, ‘‘level-3’’], [‘level-21’, ‘level-22’]],还是[‘level-3’, ‘level-22’]这种格式 boolean – true
    Select Events

    事件名称 说明 回调参数
    change 选中值发生变化时触发 目前的选中值
    visible-change 下拉框出现/隐藏时触发 出现则为 true,隐藏则为 false
    remove-tag 移除tag时触发 移除的tag值
    clear 可清空模式下用户点击清空按钮时触发 –
    blur 当 input 失去焦点时触发 (event: Event)
    focus 当 input 获得焦点时触发 (event: Event)
    Select Slots

    名称 说明
    prefix 组件头部内容

     

    https://www.npmjs.com/package/el-cascader-multi

  • i18n前端国际化

    国际项目 国外项目 语言快速切换

    i18n从前端角度可以看成是一个模块。

    例如,不同国家不同文化看时间,或者文字都是不一样的。为了统一标=标准,例如在国内调用时间插件的话,立马就符合中国人的习惯。或者一些公共的文案例如,按钮“确定”,“取消”。只要调用一个参数就行不管你是哪个国家的。

     

    国际化重点:
    1、 语言
    语言本地化
    2、 文化
    颜色、习俗等
    3、 书写习惯
    日期格式、时区、数字格式、书写方向
    备注:项目中会兵分两路,一路是语言的国际化,另一路主要为文化国际化

    产品设计之初引入国际化标准,符合项目的开发流程。
    国内主要主要三点,一个是港澳台采用中文繁体+英文,内陆通俗中文简体,新疆等地区采用文化标准。

    *缺点,操作配置繁琐复杂

     

    <script src="https://unpkg.com/vue-i18n/dist/vue-i18n.js"></script>

    或者

    npm install vue-i18n --save-dev

    vue-I18n暴露$t对象进行应用,例如jquery暴露的是$

     

    import VueI18n from 'vue-i18n'
    /* 平台国际语言静态字典 */
    import LangEn from './lang/en'
    import LangZhCHS from './lang/zhCHS'
    import LangZhCHT from './lang/zhCHT'
    /* vue-i18n注册 */
    Vue.use(VueI18n)
    // 设置语言项
    const i18n = new VueI18n({
      locale: 'zhCHS',
      messages: {
       'en': LangEn,
       'zhCHS': LangZhCHS,
       'zhCHT': LangZhCHT
      }
    })
    /* eslint-disable no-new */
    new Vue({
      el: '#app',
      i18n,
      components: { App },
      template: '<App/>'
    })

     

    zhCHS.js
    通过exports

    module.exports = {
      buttom: {
       cancel: '取消',
       determine: '确定',
       login: '登陆',
       signOut: '退出登陆',
       registered: '注册',
       search: '查询',
       submit: '提交',
       save: '保存'
     }
    }

     

    Example.vue
    通过进行数据绑定例子中初始化先检查浏览器默认语言,并保存到中通过i18n.locale可以随意切换版本

    <v-btn flat>{{$t('buttom.cancel')}}</v-btn>
     <v-btn-toggle v-model="icon">
      <v-btn flat value="zhCHS">
      <span>中文</span>
      <v-icon>format_align_left</v-icon>
    </v-btn>
    <v-btn flat value="en">
      <span>English</span>
      <v-icon>format_color_text</v-icon>
    </v-btn>
    
    
    
    watch: {
     icon (val) {
     this.$i18n.locale = val
     this.setLocalStorage('PLAY_LANG', val)
    }
    },
    created () {
     let lang = this.getLocalStorage('PLAY_LANG')
     if (lang) {
      this.icon = lang
     } else {
      let defaultLang = this.getNavigatorLang() // 获取浏览器设置语言
      this.setLocalStorage('PLAY_LANG', defaultLang)
      this.icon = defaultLang
    }
    }

    还能根据你不同国家快速切换语言

    如果你是做国际项目就推荐使用

    https://segmentfault.com/a/1190000014241037

  • axios常用参数详解

    vue axios

    Vue-resource已经不维护了,现在axios已经成为vue的标配

        //全局 拦截器
    //       拦截器一般做什么?
    //
    //      1. 修改请求头的一些配置项
    //        2. 给请求的过程添加loadin
    //        3. 给请求添加参数
    //        4. 权限验证
      this.$axios.create({
        // headers: {
        //   'content-type': 'application/json; charset=utf-8'
        // },
           baseURL: '/api', // url = base url + request url
        //timeout: 10000 // request timeout
      })
    
     this.$axios.interceptors.request.use(config=>{
            console.log(config);
            config.headers.xx='11'
    
            //根据post和get请求传公共参数
            if(config.method === 'post') {
    
              let data = Qs.parse(config.data) //将aa=11&bb=22转{aa=11,bb=22}
              config.data = Qs.stringify({ //赋值给结构是  aa=11&bb=22
                cmsId: JSON.parse(localStorage.getItem('uesrinfo')).id,
                ...data
              })
    
             if( !(/cmsId/ig.test(config.url)) ){
               config.params = {
               cmsId: JSON.parse(localStorage.getItem('uesrinfo')).id,
                 ...config.params
               }
             }
    
           } else if(config.method === 'get') {
             if( !(/cmsId/ig.test(config.url)) ){
               config.params = {
                 cmsId: JSON.parse(localStorage.getItem('uesrinfo')).id,
                 ...config.params
               }
             }
           }
    
            return config
          },err=>{
            console.log(err)
     })
    
    
      // 响应拦截器
     this.$axios.interceptors.response.use((response) => {
    
         if(response.config.method == 'post'){
           Loading.service().close();  //接口请求完成后关闭loading
         }
    
         return response
     }, (error) => {
         Loading.service().close();
         return Promise.reject(error)
     })
    
    
      this.$axios({
            method: 'post',
            url: 'www.xgllseo.com/',
    
            //如果url参数带有http、https则没效果,否则就会是http://www.baidu.com+url的路径
            baseURL:'http://www.baidu.com',
    
            //只有get时才有效,http://xxx/com/1?id=12345
            params: {ID: 12345},
    
            //只有put/post/patch请求类型时,请求体才能传数据给后台,
            // 且数据类型只能是FormData(类似input里面的数据), File(类似选中的图片、rar等), Blob(类似视频、音频)
            data: {
              firstName: 'Fred',
              lastName: 'Flintstone'
            },
            
            //设置返回给浏览器的是什么数据类型
            // 可选项 'arraybuffer', 'blob', 'document', 'json', 'text', 'stream'
            responseType: 'json', // 默认值是json,
            //请求头用来传token居多
            headers: {'Content-Type': 'application/json'},
    
            //可以理解为局部拦截器,在全局的拦截器中加了我们不需要的字段,可以在此处再次编辑
             transformRequest: (data, headers) => {
              delete headers.common.AUTHORIZATION //例如删除了 request.headers.common={AUTHORIZATION:'xxx'}
              return data
            },
    
    
            //拦截器,选项允许我们在数据传送到`then/catch`方法之前对数据进行改动
            transformResponse: [function (data) {
              // Do whatever you want to transform the data
    
              return data;
            }]
    
      }).then(function(response){
           console.log(response);
      }).catch(function(err){
           console.log(err);
      });;

     

    axios中x-www-form-urlencoded格式提交post请求

    axios({
            url: `xxxx`,
            method: 'post',
            data,
            // 利用 transformRequest 进行转换配置
            transformRequest: [
                function(oldData) {
                    // console.log(oldData)
                    let newStr = '';
                    for (let item in oldData) {
                        newStr += encodeURIComponent(item) + '=' + encodeURIComponent(oldData[item]) + '&';
                    }
                    newStr = newStr.slice(0, -1);
                    return newStr;
                }
            ],
            headers: {
                'Content-Type': 'application/x-www-form-urlencoded'
            }
    });
    

     

     

     

    参考https://www.jianshu.com/p/7a9fbcbb1114

    如果遇到跨域问题,请使用代理https://sdeno.com/?p=7834

    要么然后台加一个请求头。https://sdeno.com/?p=4815

  • window打开sketch格式文件

    Sketch最早是在mac用户中使用的,为了跨平台通用,可以通过一些第三方软件查看,比如今天分享的 Lunacy,该软件由 Icon8 团队开发。

    软件名称:Lunacy
    下载地址:https://icons8.com/lunacy

    或者下载

    链接: https://pan.baidu.com/s/1i6bv70L4teUoRqOH-jPksA 提取码: 4hec

  • js时间带T格式转常规时间

    2020-03-18T18:55:27.207转2020-03-18 18:55

    安卓会把这个带T字母的时间看做UTC时间格式,(包括ios打包后也会相差8个小时)与北京时间相差8个小时。你要将UTC时间转化为北京时间然后进行格式化。GMT +0800 已经是加了8个小时的了。或者你直接把T替换掉,然后格式化,忘记是看的是哪位大哥的了

    // 字符串转换成时间 ios中要把毫秒去掉
    function toTime(strTime) {
     if (!strTime) {
        return '';
     }
     var myDate = new Date(strTime + '+0800');
     if (myDate == 'Invalid Date') {
      strTime = strTime.replace(/T/g, ' ');
      strTime = strTime.replace(/-/g, '/');
      strTime = strTime.replace(/\.\d+/, ' ');//去掉毫秒
      myDate = new Date(strTime + '+0800'); 
     } 
     return myDate; //输出的也是带T时间格式,但在安卓和ios上时间保持一致
    }

     

    最终的代码:

    getParseTime:function(time, cFormat){   //('2020-03-18T18:55:27.207', '{y}-{m}-{d} | {h}:{i}' )
    
        if (!time) {
            return '';
        }
        var myDate = new Date(time + '+0800');
        if (myDate == 'Invalid Date') {
            time = time.replace(/T/g, ' ');
            time = time.replace(/-/g, '/');
            time = time.replace(/\.\d+/, ' ');//去掉毫秒
            myDate = new Date(time + '+0800');
        }
        time = myDate;
    
    
        if (time == null) {
            return '';
        }
        if (arguments.length === 0) {
            return null
        }
        var format = cFormat || '{y}-{m}-{d} {h}:{i}:{s}'
        var date
        if (typeof time === 'object') {
            date = time
        } else {
            if ((typeof time === 'string') && (/^[0-9]+$/.test(time))) {
                time = parseInt(time)
            }
            if ((typeof time === 'number') && (time.toString().length === 10)) {
                time = time * 1000
            }
            date = new Date(time)
        }
        var formatObj = {
            y: date.getFullYear(),
            m: date.getMonth() + 1,
            d: date.getDate(),
            h: date.getHours(),
            i: date.getMinutes(),
            s: date.getSeconds(),
            a: date.getDay()
        }
        var time_str = format.replace(/{([ymdhisa])+}/g, (result, key) => {
            var value = formatObj[key]
            // Note: getDay() returns 0 on Sunday
            if (key === 'a') {
                return ['日', '一', '二', '三', '四', '五', '六'][value]
            }
            //return value.toString().padStart(2, '0')  //时间补零,padStart可能出现兼容问题
            return value.toString()
        })
        return time_str
    },

     

    如果时间相差8个小时的就用以下代码:

    getParseTime:function(time){ 
    
                    var date = time//"2019-11-23T00:00:00.000+0000";
                    var arr=date.split("T");
                    var d=arr[0];
                    var darr = d.split('-');
    
                    var t=arr[1];
                    var tarr = t.split('.000');
                    var marr = tarr[0].split(':');
    
                    var dd = parseInt(darr[0])+"/"+parseInt(darr[1])+"/"+parseInt(darr[2])+" "+parseInt(marr[0])+":"+parseInt(marr[1])+":"+parseInt(marr[2]);
    
                    function formatDateTime (date) {
                        let time = new Date(Date.parse(date));
                        time.setTime(time.setHours(time.getHours() + 8));
    
                        // alert(time);
                        // if (!isNaN(time)) {
                        //     return new Date(Date.parse(date.replace(/-/g, "/")));
                        // } else {
                        let Y = time.getFullYear() + '-';
                        let M = addZero(time.getMonth() + 1) + '-';
                        let D = addZero(time.getDate()) + ' ';
                        let h = addZero(time.getHours()) + ':';
                        let m = addZero(time.getMinutes()) + ':';
                        let s = addZero(time.getSeconds());
                        return Y + M + D + h + m + s;
                        // }
                    };
                    // 数字补0操作
                    function addZero(num) {
                        return num < 10 ? '0' + num : num;
                    };
    
    
                    return formatDateTime(dd)
    
                    // const date = new Date("2019-11-23T00:00:00.000+0000");
                    // console.log("date:",date);
                    console.log("Date:",new Date());
    
    },