vue项目常用方法合集

整理一些vue项目中经常使用到的方法、指令、正则等。

公共方法合集:

//节流
export const throttle = (fn, wait = 300) => {
    let lastTime = 0;
    return function (...args) {
        let now = +new Date();
        if (now - lastTime > wait) {
            lastTime = now;
            fn.call(this, ...args);
        }
    };
};

//防抖
export const debounce = (fn, wait = 300) => {
    let timer;
    return function (...args) {
        if (timer) {
            clearTimeout(timer);
        }
        timer = setTimeout(() => {
            fn.call(this, ...args);
        }, wait);
    };
};

//设置cookie
setCookie(name,value,perpetual) {
    let exdate = new Date()
    exdate.setDate(exdate.getDate() + perpetual)  //exdate.setDate(exdate.getDate() + 365)
    document.cookie = name + '=' + value + ';expires=' + exdate.toGMTString()
},

//获取cookie
getCookie (name) {
      if (document.cookie.length > 0) {
      	let obj = document.cookie.replace(/(\w+|[\u4e00-\u9fa5]+)=(\w+|[\u4e00-\u9fa5]+)/ig,($,$1,$2)=>{result[$1]=$2})
      	return unescape(obj[name])
      }
      return ''
}

//深拷贝
function deepClone(obj){
    let _obj = JSON.stringify(obj),
        objClone = JSON.parse(_obj);
    return objClone
}

//对象转换字符串拼接到url上,列如{a:'1',b:'2',c:'3'}=>a=1&b=2&c=3
Object.entries(obj).map(([key,value])=>`${key}=${value}`).join('&')

//数组对象去重,filterKey:根据这个属性去匹配唯一值
removalData(arr,filterKey ){
      const hasObj = {}
      arr = arr.reduce((total, next) => {
        hasObj[filterKey] ? "" : hasObj[filterKey] = true && total.push(next)
        return total
      }, [])
      return arr
}

vue常用指令:

//防抖
Vue.directive("debounce", {
    bind: (el, binding) => {
        let [fn, type = "input", time = 800] = binding.value;
        let cbFun;
        el.addEventListener(
            type,
            () => {
                if (cbFun) clearTimeout(cbFun);
                cbFun = setTimeout(() => {
                    fn();
                }, time);
            },
            true
        );
    },
});
//点击标签外关闭弹窗
Vue.directive("winClick", {
    bind(el, binding) {
    function documentHandle(e) {
      if (el.contains(e.target)) {
        return false;
      }
      if (binding.expression) {
        binding.value(e);
      }
    }
    el.__documentHandle__ = documentHandle;
    document.addEventListener('click', documentHandle);
  },
  unbind(el) {
    document.removeEventListener('click', el.__documentHandle__);
    delete el.__documentHandle__;
  },
});
v-winClick="event"
event(){this.close = false}

//copy指令
Vue.directive("copy", {
	bind(el, { value }) {
    el.$value = value
    el.handler = () => {
      if (!el.$value) {
        // 值为空的时候,给出提示。可根据项目UI仔细设计
        console.log('无复制内容')
        return
      }
      // 动态创建 textarea 标签
      const textarea = document.createElement('textarea')
      // 将该 textarea 设为 readonly 防止 iOS 下自动唤起键盘,同时将 textarea 移出可视区域
      textarea.readOnly = 'readonly'
      textarea.style.position = 'absolute'
      textarea.style.left = '-9999px'
      // 将要 copy 的值赋给 textarea 标签的 value 属性
      textarea.value = el.$value
      // 将 textarea 插入到 body 中
      document.body.appendChild(textarea)
      // 选中值并复制
      textarea.select()
      const result = document.execCommand('Copy')
      if (result) {
        console.log('复制成功') // 可根据项目UI仔细设计
      }
      document.body.removeChild(textarea)
    }
    // 绑定点击事件,就是所谓的一键 copy 啦
    el.addEventListener('click', el.handler)
  },
  // 当传进来的值更新的时候触发
  componentUpdated(el, { value }) {
    el.$value = value
  },
  // 指令与元素解绑的时候,移除事件绑定
  unbind(el) {
    el.removeEventListener('click', el.handler)
  }
})
v-copy="copyText"
//拖动指令
Vue.directive("drag", {
	inserted: function (el) {
    el.style.cursor = 'move'
    el.onmousedown = function (e) {
      let disx = e.pageX - el.offsetLeft
      let disy = e.pageY - el.offsetTop
      document.onmousemove = function (e) {
        let x = e.pageX - disx
        let y = e.pageY - disy
        let maxX = document.body.clientWidth - parseInt(window.getComputedStyle(el).width)
        let maxY = document.body.clientHeight - parseInt(window.getComputedStyle(el).height)
        if (x < 0) {
          x = 0
        } else if (x > maxX) {
          x = maxX
        }

        if (y < 0) {
          y = 0
        } else if (y > maxY) {
          y = maxY
        }

        el.style.left = x + 'px'
        el.style.top = y + 'px'
      }
      document.onmouseup = function () {
        document.onmousemove = document.onmouseup = null
      }
    }
  }
})

常用正则:

identityCard:/^[1-9]\d{5}(18|19|([23]\d))\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$/,//身份证号码
mobile: /^1([3|4|5|7|8|])\d{9}$/, // 手机号码
telephone: /^(\(\d{3,4}\)|\d{3,4}-|\s)?\d{7,14}$/, // 固定电话
num: /^[0-9]*$/, // 数字
phoneNo: /(^1([3|4|5|7|8|])\d{9}$)|(^(\(\d{3,4}\)|\d{3,4}-|\s)?\d{7,14}$)/, // 电话或者手机
policeNo: /^[0-9A-Za-z]{4,10}$/, // 账号4-10位数字或字母组成
pwd: /^[0-9A-Za-z]{6,16}$/, // 密码由6-16位数字或者字母组成
isNumAlpha: /^[0-9A-Za-z]*$/, // 字母或数字
isAlpha: /^[a-zA-Z]*$/, // 是否字母
isNumAlphaCn: /^[0-9a-zA-Z\u4E00-\uFA29]*$/, // 是否数字或字母或汉字
isPostCode: /^[\d\-]*$/i, // 是否邮编
isNumAlphaUline: /^[0-9a-zA-Z_]*$/, // 是否数字、字母或下划线
isNumAndThanZero: /^([1-9]\d*(\.\d+)?|0)$/, // 是否为整数且大于0/^[1-9]\d*(\.\d+)?$/
isNormalEncode: /^(\w||[\u4e00-\u9fa5]){0,}$/, // 是否为非特殊字符(包括数字字母下划线中文)
isTableName: /^[a-zA-Z][A-Za-z0-9\#\$\_\-]{0,29}$/, // 表名
isInt: /^-?\d+$/, // 整数
isTableOtherName: /^[\u4e00-\u9fa5]{0,20}$/, // 别名
isText_30: /^(\W|\w{1}){0,30}$/, // 匹配30个字符,字符可以使字母、数字、下划线、非字母,一个汉字算1个字符
isText_50: /^(\W|\w{1}){0,50}$/, // 匹配50个字符,字符可以使字母、数字、下划线、非字母,一个汉字算1个字符
isText_20: /^(\W|\w{1}){0,20}$/, // 匹配20个字符,字符可以使字母、数字、下划线、非字母,一个汉字算1个字符
isText_100: /^(\W|\w{1}){0,100}$/, // 匹配100个字符,字符可以使字母、数字、下划线、非字母,一个汉字算1个字符
isText_250: /^(\W|\w{1}){0,250}$/, // 匹配250个字符,字符可以使字母、数字、下划线、非字母,一个汉字算1个字符
isNotChina: /^[^\u4e00-\u9fa5]{0,}$/, // 不为中文  IDcard: /^[1-9]\d{7}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}$|^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}([0-9]|X)$/, // 身份证
IDcardAndAdmin: /^(([1-9]\d{7}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}$|^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}([0-9]|X))|(admin))$/, // 身份证或者是admin账号
IDcardTrim: /^\s*(([1-9]\d{7}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3})|([1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}([0-9]|X))|(admin))\s*$/, // 身份证
num1: /^[1-9]*$/, // 数字
companyNO: /^qqb_[0-9a-zA-Z_]{1,}$/, // 公司人员账号
imgType: /image\/(png|jpg|jpeg|gif)$/, // 上传图片类型
SociologyId: /^[0-9A-HJ-NPQRTUWXY]{2}\d{6}[0-9A-HJ-NPQRTUWXY]{10}$/, //社会信用代码
thousandAccount: /^(\d+(,\d\d\d)*(\.\d{1,4})?)$/,//千分位,4位小数
discountRate: /^((?!0+(?:\.0+)?$)(?:[1-9]\d*|0))(?:\.\d{1,2})?$/,//折扣率,(0-100]之间
acountTwoDecimal: /^(?!0+(?:\.0+)?$)(?:[1-9]\d*|0)(?:\.\d{1,2})?$/,//大于0精确到2位小数
positiveNumber: /^[+]{0,1}(\d+)$|^[+]{0,1}(\d+\.\d+)$/,//匹配正数包括0和小数

持续更新中…

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
vue常用方法总结 第一章 Vue核心知识讲解 5 第二节 引包、留坑、实例化 、插值表达式{{}} 5 1. 引包 5 2. 留坑 5 3. 实例化 5 4. 插值表达式{{ }} 5 第三节 熟悉及使用常用指令 5 1. 什么是指令 5 2. 常用的指令有哪些,及怎么使用这些指令 6 第四节 阐述vue单双向数据流及事件绑定 6 1. vue单向数据流绑定属性值 v-bind: (属性) 简写 :(属性) 6 2. vue双向数据流 v-model 只作用于有value属性的元素 7 3. 事件绑定v-on:事件名="表达式||函数名" 简写 @事件名="表达式||函数名" 8 4. 总结 8 第五节 过滤器 8 1、过滤器有全局过滤器和组件内的过滤器 应用 {{ msg | 过滤器名}} 8 2、 vue中的this是vue封装好给我们使用的,跟平常方法里面的this是不同的 9 第六节 数据监听watch(深度监听)计算属性computed 9 watch监听单个,computed监听多个 9 总结: 10 第二章 组件化开发知识介绍 11 第一节 组件化开发 11 1、 创建组件的两种方式 11 局部声明 11 2、组件类型(组件开发三步曲:声明、注册、使用 ) 11 第二节 slot插槽和ref、$parent (重点) 11 1、slot插槽 11 2、ref获取子组件实例 12 第三节 父子组件的通信 (核心) 13 1、父传子 14 2、子传父 14 第四节 非父子组件之间的通信 14 简介:建立Bus总线机制实施非父子组件通讯 14 3、回调函数写法 16 第五节 vue的生命周期 17 1、需要频繁的创建和销毁组件 17 2、组件缓存 17 3、成对比较 17 第三章 Vue核心插件之路由模块 18 第一节 路由的跳转原理(哈希模式) 18 1、单页应用的路由模式有两种(哈希模式、history模式) 19 2、 哈希模式原理 19 3、建议的选择:(小D课堂课程) 19 第二节 安装和使用路由 19 第三节 路由的跳转 20 1、路由的跳转方式2种: 20 2、区别: 20 3、vue-router中的对象:$route $router 21 第四节 路由的传参和取参 21 1. 查询参 21 2. 路由参数 21 3、js跳转路由传参和标签传参,路由相同而参数不同时页面不做刷新的问题 22 总结: 22 第五节 嵌套路由(Children) 23 第六节 路由守卫 23 第五章 Vue全家桶各部分核⼼知识详解 24 第1节 构建vue项⽬的利器—脚⼿架vue-cli3 24 1、安装vue-cli3 24 2、创建项⽬ 24 3、 vue.config.js ⼿动在根⽬录新建⼀个vue.config.js⽂件 24 第2节 ⽗⼦组件传值(参考第二章第2、3节) 25 第3节 非⽗⼦组件传值(参考第二章第4节) 25 1. 事件总线(参考第二章第4节) 25 2. $attrs / $listeners 25 3. Vuex (详见第5节) 25 第4节 玩转单⻚⾯应⽤的控制中⼼—vue-router(与第三章基本差不多) 26 梦学谷第137课ElementUI实现页面横向指示导航,比小D课堂的那种写法要好点 26 1、路由的基本配置 26 2、路由的跳转 26 3、动态路由 27 4、嵌套路由 27 5、导航守卫 27 6、路由懒加载 28 第5节 状态管理中⼼—vuex的基础⽤法(官方文档,非常好用) 28  State 28  Mutations 28  Actions 28  vuex⾥包含的基本参数 28  还有别的mapState这些很好用 29 import { mapState, mapMutations } from "vuex";(导入非默认成员) 29 其实是ES6语法,详见梦学谷89课 29 第6节 状态管理中⼼—vuex的⾼级⽤法 29  vuex中的计算属性—Getters 30  模块化概念—Modules 30

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值