vue Mutation 必须是同步函数 为什么_Vue 开发必须知道的 36 个技巧「近1W字」

d9c266105cd434099aecfed736cd1945.png

Vue 开发必须知道的 36 个技巧

说明:本文并非原创,来源于segmentfault,搜索文章标题可查看原文

前言

Vue 3.x 的Pre-Alpha 版本。后面应该还会有 Alpha、Beta 等版本,预计至少要等到 2020 年第一季度才有可能发布 3.0 正式版;

所以应该趁还没出来加紧打好 Vue2.x 的基础;

Vue基本用法很容易上手,但是有很多优化的写法你就不一定知道了,本文从列举了 36 个 vue 开发技巧;

后续 Vue 3.x 出来后持续更新.

1.require.context()

1.场景:如页面需要导入多个组件,原始写法:

import titleCom from '@/components/home/titleCom'import bannerCom from '@/components/home/bannerCom'import cellCom from '@/components/home/cellCom'components:{titleCom,bannerCom,cellCom}

2.这样就写了大量重复的代码,利用 require.context 可以写成

const path = require('path')const files = require.context('@/components/home', false, /.vue$/)const modules = {}files.keys().forEach(key => { const name = path.basename(key, '.vue') modules[name] = files(key).default || files(key)})components:modules

这样不管页面引入多少组件,都可以使用这个方法

3.API 方法

实际上是 webpack 的方法,vue 工程一般基于 webpack,所以可以使用require.context(directory,useSubdirectories,regExp)接收三个参数:directory:说明需要检索的目录useSubdirectories:是否检索子目录regExp: 匹配文件的正则表达式,一般是文件名

2.watch

2.1 常用用法

1.场景:表格初始进来需要调查询接口 getList(),然后input 改变会重新查询

created(){ this.getList()},watch: { inpVal(){ this.getList() }}

2.2 立即执行

2.可以直接利用 watch 的immediate和handler属性简写

watch: { inpVal:{ handler: 'getList', immediate: true }}

2.3 深度监听

3.watch 的 deep 属性,深度监听,也就是监听复杂数据类型

watch:{ inpValObj:{ handler(newVal,oldVal){ console.log(newVal) console.log(oldVal) }, deep:true }}

此时发现oldVal和 newVal 值一样;

因为它们索引同一个对象/数组,Vue 不会保留修改之前值的副本;

所以深度监听虽然可以监听到对象的变化,但是无法监听到具体对象里面那个属性的变化

3. 14种组件通讯

3.1 props

这个应该非常属性,就是父传子的属性;

props 值可以是一个数组或对象;

// 数组:不建议使用props:[]// 对象props:{ inpVal:{ type:Number, //传入值限定类型 // type 值可为String,Number,Boolean,Array,Object,Date,Function,Symbol // type 还可以是一个自定义的构造函数,并且通过 instanceof 来进行检查确认 required: true, //是否必传 default:200, //默认值,对象或数组默认值必须从一个工厂函数获取如 default:()=>[] validator:(value) { // 这个值必须匹配下列字符串中的一个 return ['success', 'warning', 'danger'].indexOf(value) !== -1 } }}

3.2 $emit

这个也应该非常常见,触发子组件触发父组件给自己绑定的事件,其实就是子传父的方法

// 父组件// 子组件this.$emit('title',[{title:'这是title'}])

3.3 vuex

1.这个也是很常用的,vuex 是一个状态管理器

2.是一个独立的插件,适合数据共享多的项目里面,因为如果只是简单的通讯,使用起来会比较重

3.API

state:定义存贮数据的仓库 ,可通过this.$store.state 或mapState访问getter:获取 store 值,可认为是 store 的计算属性,可通过this.$store.getter 或 mapGetters访问mutation:同步改变 store 值,为什么会设计成同步,因为mutation是直接改变 store 值, vue 对操作进行了记录,如果是异步无法追踪改变.可通过mapMutations调用action:异步调用函数执行mutation,进而改变 store 值,可通过 this.$dispatch或mapActions 访问modules:模块,如果状态过多,可以拆分成模块,最后在入口通过...解构引入

3.4 $attrs和$listeners

2.4.0 新增

这两个是不常用属性,但是高级用法很常见;

1.$attrs

场景:如果父传子有很多值,那么在子组件需要定义多个 props

解决:$attrs获取子传父中未在 props 定义的值

// 父组件// 子组件mounted() { console.log(this.$attrs) //{title: "这是标题
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值