Vue2
Last updated
Last updated
Vue一个大特点就是渐进式,意思就是你可以渐渐地用Vue,而React几乎做不到这一点
动态构建用户界面
你可以继续操作DOM
你可以很方便地做SEO
你可以局部做单页面
你可以整体做单页面
遵循MVVM
编码简洁,体积小,运行效率高,适合PC/移动端开发
本身只关注UI,可以轻松的引入Vue插件或其他第三方库
{{ number + 1 }}
{{ obj.name }}
{{ ok ? 'YES' : 'NO' }}
{{ message.split('').reverse().join('') }}
<div :id="
list-${id}"></div>
el
data
template
methods
components(global / local)
全局定义时命名不能重复
filters(global / local)
{{ message | filter }}
<div v-bind="msg | filter"></div>
watch -> single data
深层
回调触发时机
停止
即时
this.$watch
==computed -> multiple data==(不要在计算函数中做异步请求或者更改 DOM)
VS watch
computed
是计算一个新属性,并将该属性挂载到vm
上,而watch
是监听已经存在且已挂载到vm
上的属性, 计算属性不需要在 data 里面提前定义,watch 则需要,所以用watch
同样可以监听computed
计算属性的变化(其它还有 data
、props
)
computed
本质是一个惰性求值的观察者,具有缓存性,只有当依赖变化后,第一次访问computed
属性,才会计算新的值,而watch
则是当数据发生变化便会调用执行函数
从使用场景上说,computed
适用一个数据被多个数据影响,而watch
适用一个数据影响多个数据,watch
适合异步或开销大的场景
VS method
methods
没有缓存
computed
不可传参,methods
可以
computed
通过getter
、setter
传newValue
==class==
<p :class="{ active: isActive, 'text-danger': hasError }">xxx是字符串</p>
<p :class="classObject">xxx是对象</p>
<p :class="['bClass', 'cClass']">xxx是数组</p>
<div :class="[isActive ? activeClass : '', errorClass]"></div>
<div :class="[{ active: isActive }, errorClass]"></div>
==style==
<p :style="{ color: activeColor, fontSize: fontSize + 'px' }"></p>
<div :style="{ 'font-size': fontSize + 'px' }"></div>
<p :style="styleObject"></p>
<p :style="[baseStyles, overridingStyles]">test style2</p>
<div :style="{ display: ['-webkit-box', '-ms-flexbox', 'flex'] }"></div>
$el、$options、$data
==$attrs、$listeners== (除了class、style、v-on等)、$props
$root、$parent、$children
$refs(操作DOM)
组件上的ref代表的是子组件实例
expose
DOM更新时机
v-once、v-cloak
v-model
原生展开 : <input :value="val" @input="val=$event.target.value" />
自定义组件展开: <CustomInput :modelValue="searchText" @update:modelValue="newValue => searchText = newValue" />
v-for、v-if、v-else、v-else-if、v-show
v-if vs v-show
==v-if > v-for==
v-text、v-html
v-slot、v-pre
==v-bind ==> :==
<div v-bind="objectOfAttrs"></div>
==v-on ==> @==
在内联事件处理器中访问事件参数
事件修饰符stop、prevent、self
once、capture、passive
与[原生 addEventListener
事件相对应
按键修饰符enter、tab、delete、esc、space、up、down、left、right
系统修饰符ctrl、alt、shift、exact、meta
鼠标修饰符left、right、middle
自定义事件
==自定义指令==(只有当所需功能只能通过直接的 DOM 操作来实现时,才应该使用自定义指令。其他情况下应该尽可能地使用 v-bind
这样的内置指令来声明式地使用模板,这样更高效,也对服务端渲染更友好)
hooks
bind 指令第一次绑定到元素时调用,只执行一次,可用于一次性初始化设置
inserted 元素插入父节点时调用
update 所有 VNode 更新时调用,可能发生在子 VNode 之前
componentUpdated 指令所在组件在 VNode 和其子 VNode 更新后调用
unbind 指令与元素解绑时调用
参数
el
指令绑定元素,可操作 DOM
binding
指令描述对象
value
:传递给指令的值。例如在 v-my-directive="1 + 1"
中,值是 2
oldValue
:之前的值,仅在 beforeUpdate
和 updated
中可用。无论值是否更改,它都可用
arg
:传递给指令的参数 (如果有的话)。例如在 v-my-directive:foo
中,参数是 "foo"
modifiers
:一个包含修饰符的对象 (如果有的话)。例如在 v-my-directive.foo.bar
中,修饰符对象是 { foo: true, bar: true }
instance
:使用该指令的组件实例
dir
:指令的定义对象
vnode
代表绑定元素的底层 VNode
prevNode
:之前的渲染中代表指令所绑定元素的 VNode。仅在 beforeUpdate
和 updated
钩子中可用
==表单输入绑定==
基础用法
值绑定
表单事件修饰符v-model:lazy、v-model:number、v-model:trim
自定义model
属性
==传递props==
单向数据流
props初始化先于data,可挂载到子实例data上
校验(null和undefined会通过任何类型验证)
原生属性自动挂载到组件根元素上,可设置inheritAttrs = false
不继承
Non-props
.sync
特殊属性 class / style / ref / key
事件
修饰符事件,应用于原生html元素
普通事件
emits
默认内容
具名插槽
作用域插槽(父组件需要访问子组件的data的时候)
默认插槽
具名插槽
动态组件
异步组件
DOM 模板解析注意事项
大小写
闭合标签
元素位置显示
穿透scoped
在模板中使用两次style标签
使用>>>
或/deep/
操作符(Sass之类的预处理器无法正确解析>>>
)
beforeCreate/created、beforeMount/mounted、beforeUpdate/updated、beforeDestroyed/destroyed、errorCaptured
activated/deactivated、errorCaptured
编码阶段
尽量减少data中的数据,data中的数据都会增加getter和setter,会收集对应的watcher
v-if和v-for不能连用
如果需要使用v-for给每项元素绑定事件时使用事件代理
SPA 页面采用keep-alive缓存组件
在更多的情况下,使用v-if替代v-show
key保证唯一
使用路由懒加载、异步组件
防抖、节流
第三方模块按需导入
长列表滚动到可视区域动态加载
图片懒加载
SEO优化
预渲染
服务端渲染SSR
打包优化
压缩代码
Tree Shaking/Scope Hoisting
使用cdn加载第三方模块
多线程打包happypack
splitChunks抽离公共文件
sourceMap优化
用户体验
骨架屏
PWA
还可以使用缓存(客户端缓存、服务端缓存)优化、服务端开启gzip压缩等