51工具盒子

依楼听风雨
笑看云卷云舒,淡观潮起潮落

Vue教程(1)-基础篇

# 1、模板语法 {#_1、模板语法}

# 1.1 指令 {#_1-1-指令}

{{msg}}/v-text   # 文本插值
v-html   # 原始html
v-once   # 只渲染一次
v-show   # css控制显示隐藏
v-if     # 根据表达式渲染元素   # 用 key 管理可复用的元素
v-else/v-else-if # 紧跟v-if的else
v-for    # 列表渲染  可以循环数字、数组、对象和对象数组
v-on     # 事件渲染
v-bind   # 动态绑定属性 :是缩写
v-model  # 表单输入绑定
v-slot   # 插槽 限用于<template>/组件
v-pre    # 不编译,显示源码
v-cloak  # 隐藏未编译直到实例完成

# 1.2 v-on {#_1-2-v-on}

@[event].stop   # @是v-on的缩写  [event]是动态事件  .stop是修饰符
.stop    # 调用 event.stopPropagation()。停止冒泡
.prevent    # 调用 event.preventDefault()。阻止默认行为
.capture    # 添加事件侦听器时使用 capture 模式。
.self    # 只当事件是从侦听器绑定的元素本身触发时才触发回调。
.{keyCode | keyAlias}    # 只当事件是从特定键触发时才触发回调。
.native    # 监听组件根元素的原生事件。
.once    # 只触发一次回调。
.left    # (2.2.0) 只当点击鼠标左键时触发。
.right    # (2.2.0) 只当点击鼠标右键时触发。
.middle    # (2.2.0) 只当点击鼠标中键时触发。
.passive    # (2.3.0) 以 { passive: true } 模式添加侦听器

# 1.3 v-bind {#_1-3-v-bind}

#:class和:style绑定样式
:class="[ 'red', 'thin', isactive ? 'active' : '' ]" # 1.使用数组、三元表达式
:class="[ 'red', 'thin', { 'active', isactive } ]" # 2.使用嵌套对象
:class="{ red: true, italic: true, active: true }" # 3.使用对象

:[key]="value" # :是v-bind的缩写  [key]是动态特性名  value可以属性/表达式/数组/组合/json对象
.prop     # 被用于绑定 DOM 属性 (property)。
.camel     # (2.1.0+) 将 kebab-case 特性名转换为 camelCase. (从 2.1.0 开始支持)
.sync     # (2.3.0+) 语法糖,会扩展成一个更新父组件绑定值的 v-on 侦听器。

# 1.4 v-for {#_1-4-v-for}

# 1.循环数组和对象数组
<p v-for="(item, i) in list">{{item.name}},{{i}}</p>  
# 2.循环对象
<p v-for="(val, key, i) in user">{{val}},{{key}},{{i}}</p>   
# 3.迭代数字
<p v-for="count in 10">{{count}}</p>   
# 在组件中使用 v-for 时,必须添加key(=string/number)。

# 1.5 v-model {#_1-5-v-model}

.lazy     # 取代 input 监听 change 事件
.number     # 输入字符串转为有效的数字
.trim     # 输入首尾空格过滤

# 1.6 自定义指令 {#_1-6-自定义指令}

钩子函数:bind/inserted/update/componentUpdated/unbind 函数参数:el、binding、vnode 、 oldVnode

<input v-focus>
Vue.directive('focus', {
  inserted: function (el) {
    el.focus()
  }
})

Vue.directive('demo', {
  bind: function (el, binding, vnode) {
    var s = JSON.stringify
    el.innerHTML =
      'name: '       + s(binding.name) + '<br>' +
      'value: '      + s(binding.value) + '<br>' +
      'expression: ' + s(binding.expression) + '<br>' +
      'argument: '   + s(binding.arg) + '<br>' +
      'modifiers: '  + s(binding.modifiers) + '<br>' +
      'vnode keys: ' + Object.keys(vnode).join(', ')
  }
})
# 函数简写(只在 bind 和 update 时触发相同行为)
Vue.directive('color-swatch', function (el, binding) {
  el.style.backgroundColor = binding.value
})

# 2、API简要 {#_2、api简要}

# 2.1 全局API {#_2-1-全局api}

Vue.extend( options )   # 构造器扩展
Vue.directive( id, [definition] )   # 注册或获取全局指令。
Vue.set( target, key, value )   # 全局操作
Vue.component( id, [definition] )   # 注册或获取全局组件。
Vue.nextTick( [callback, context] )   # 在下次 DOM 更新循环结束之后执行延迟回调。
Vue.delete( target, key )   # 删除对象的属性。
Vue.filter( id, [definition] )   # 注册或获取全局过滤器。
Vue.use( plugin )   # 安装 Vue.js 插件。
Vue.mixin( mixin )   # 全局注册一个混入
Vue.compile( template )   # 在 render 函数中编译模板字符串。
Vue.observable( object )   # 让一个对象可响应。v2.6.0+
Vue.version   # 获取Vue 安装版本号。可根据不同版本号制定不同策略。

# 2.2 选项-生命周期 {#_2-2-选项-生命周期}

beforeCreate(){}    // 执行时组件实例还未创建,通常用于插件开发中执行一些初始化任务
created(){}         // 组件初始化完毕,各种数据可以使用,常用于异步数据获取
beforeMount(){}     // 未执行渲染、更新,dom未创建
mounted(){}         // 初始化结束,dom已创建,可用于获取访问数据和dom元素
beforeUpdate(){}    // 更新前,可用于获取更新前各种状态
updated(){}         // 更新后,所有状态已是最新
beforeDestroy(){}   // 销毁前,可用于一些定时器或订阅的取消
destroyed(){}       // 组件已销毁,作用同上
activated(){}       // keep-alive 缓存的组件激活时
deactivated(){}     // keep-alive 缓存的组件停用时
errorCaptured(){}   // 子孙组件的错误时被调用

# 2.3 选项-数据 {#_2-3-选项-数据}

data: Object|Function  # Vue 实例的数据对象。
props: Array<string>|Object   # 用于接收来自父组件的数据。
propsData: {[key:string]:any}   # 创建实例时传递 props。只用于 new 创建的实例中。
computed: {[key:string]:Function|{get:Function,set:Function}}   # 计算属性
methods: {[key:string]:Function}   # 方法
watch: {[key:string]:string|Function|Object|Array}   # 监听器

# 2.4 选项-DOM {#_2-4-选项-dom}

el: string|Element   # 提供一个在页面上已存在的 DOM 元素作为 Vue 实例的挂载目标。
template: string   # 模板
render: (createElement: () => VNode) => VNode   # 渲染函数
renderError: (createElement: () => VNode, error: Error) => VNode   # render函数错误提供另一种渲染输出

# 2.5 选项-资源 {#_2-5-选项-资源}

directives: Object   # 私有指令
filters: Object   # 私有过滤器
components: Object   # 私有组件

# 2.6 选项-组合 {#_2-6-选项-组合}

parent: Vue instance   # 指定已创建的实例之父实例,在两者之间建立父子关系。
mixins: Array<Object>   # 混入
extends: Object|Function   # 继承
provide / inject   # 为高阶插件/组件库提供用例。

# 2.7 选项-其他 {#_2-7-选项-其他}

name: string   # 只有作为组件选项时起作用。
delimiters: Array<string>   # 改变纯文本插入分隔符。只在完整构建版本中的浏览器内编译时可用
functional: boolean   # 使组件无状态 (没有 data ) 和无实例 (没有 this 上下文)。
model: { prop?: string, event?: string }   # 允许一个自定义组件在使用 v-model 时定制 prop 和 event。
inheritAttrs: boolean   #
comments: boolean   # 是否保留且渲染html注释

# 2.8 实例属性 {#_2-8-实例属性}

vm.$data: Object   # Vue 实例观察的数据对象。
vm.$props: Object   # 当前组件接收到的 props 对象。
vm.$el: Element   # Vue 实例使用的根 DOM 元素。
vm.$options: Object   # 用于当前 Vue 实例的初始化选项。
vm.$parent: Vue instance   # 父实例,如果当前实例有的话。
vm.$children: Array<Vue instance>   # 当前实例的直接子组件。
vm.$slots: { [name: string]: ?Array<VNode> }   # 用来访问被插槽分发的内容。
vm.$scopedSlots: { [name: string]: props => Array<VNode> | undefined }   # 用来访问作用域插槽。
vm.$refs: Object   # 一个对象,持有注册过 ref 特性 的所有 DOM 元素和组件实例。
vm.$isServer: boolean   # 当前 Vue 实例是否运行于服务器。
vm.$attrs: { [key: string]: string }   # 包含了父作用域中不作为 prop 被识别 (且获取) 的特性绑定 (class 和 style 除外)。
vm.$listeners: { [key: string]: Function | Array<Function> }   # 包含了父作用域中的 (不含 .native 修饰器的) v-on 事件监听器。

# 2.9 实例方法 {#_2-9-实例方法}

vm.$watch( expOrFn, callback, [options] )    #监听器
vm.$set( target, key, value )   # 全局 Vue.set 的别名。
vm.$delete( target, key )   # 全局 Vue.delete 的别名。

vm.$on( event, callback )   # 监听当前实例上的自定义事件。
vm.$once( event, callback )   # 监听一个自定义事件,但是只触发一次.
vm.$off( [event, callback] )   # 移除自定义事件监听器。
vm.$emit( eventName, [...args] )   # 触发当前实例上的事件。

vm.$mount( [elementOrSelector] )   # -生命周期-挂载实例
vm.$forceUpdate()   # -生命周期-重新渲染
vm.$nextTick( [callback] )   # -生命周期-将回调延迟到下次 DOM 更新循环之后执行。
vm.$destroy()   # -生命周期-销毁实例

# 2.10 内置组件 {#_2-10-内置组件}

component   # 渲染一个"元组件"为动态组件。依 is 的值,来决定哪个组件被渲染。
transition   # 为单个元素/组件的过渡效果。
transition-group   # 为多个元素/组件的过渡效果。
keep-alive   # 动态组件
slot   # 为组件模板之中的内容分发插槽。

# 2.11 特殊特性 {#_2-11-特殊特性}

key: number | string   # 设置唯一的值
ref: string   # 用来给元素或子组件注册引用信息。
is: string | Object (组件的选项对象)   # 用于动态组件且基于 DOM 内模板的限制来工作。
slot/slot-scope(已废弃):v-slot指令替代
scope(已移除)

# 3、其他 {#_3、其他}

# 3.1 计算属性和侦听器 {#_3-1-计算属性和侦听器}

  • 计算属性computed具有缓存性,适合做筛选,不可异步。多用于多对一场景,一些值变化时,生成一个计算值。
  • 侦听器watch适合做异步或开销较大的操作。多用于一对多场景,监听某个值变化时,处理相应的变化。

# 3.2 插件 {#_3-2-插件}

Vue.use(MyPlugin)   // 使用插件
// 开发插件
MyPlugin.install = function (Vue, options) {
  // 1. 添加全局方法或属性
  Vue.myGlobalMethod = function () {
    // 逻辑...
  }
  // 2. 添加全局资源
  Vue.directive('my-directive', {
    bind (el, binding, vnode, oldVnode) {
      // 逻辑...
    }
    // ...
  })
  // 3. 注入组件
  Vue.mixin({
    created: function () {
      // 逻辑...
    }
    // ...
  })
  //  4. 添加实例方法
  Vue.prototype.$myMethod = function (methodOptions) {
    // 逻辑...
  }
}

# 3.3 过滤器 {#_3-3-过滤器}

常用于文本格式化,用在双花括号插值和 v-bind 表达式中。

{{ message | capitalize }}
<div v-bind:id="rawId | formatId"></div>
# 局部过滤器
filters: {
    capitalize: function (value) {
        if (!value) return ''
        value = value.toString()
        return value.charAt(0).toUpperCase() + value.slice(1)
    }
}
# 全局过滤器
Vue.filter('dateFormat', function (time,format) {
	let t = new Date(time);
	let tf=(str)=>(str.toString().padStart(2,'0'));
	return format.replace(/yyyy|MM|dd|HH|mm|ss/g, function(a){
		switch(a){
			case 'yyyy':
				return tf(t.getFullYear());
				break;
			case 'MM':
				return tf(t.getMonth() + 1);
				break;
			case 'mm':
				return tf(t.getMinutes());
				break;
			case 'dd':
				return tf(t.getDate());
				break;
			case 'HH':
				return tf(t.getHours());
				break;
			case 'ss':
				return tf(t.getSeconds());
				break;
		}
	})
})

# 4、组件 {#_4、组件}

  • 组件是可复用的 Vue 实例,带有一个名字,我们可以在一个通过 new Vue 创建的 Vue 根实例中,把这个组件作为自定义元素来使用。
  • 组件的data必须是函数。
  • 每个组件必须只有一个根元素。

# 4.1 组件注册 {#_4-1-组件注册}

  • 全局注册 Vue.component(name, options)

  • 局部注册

  • 在模块系统中局部注册

    var ComponentA = { /* ... */ } import ComponentB from 'ComponentB' new Vue({ el: '#app', components: { 'component-a': ComponentA, 'component-b': ComponentB } })

  • 基础组件的自动化全局注册

# 4.2 Prop {#_4-2-prop}

  • prop传值为单向数据流,子组件可通过新定义参数接受改值

  • prop类型、默认值、校验

  • prop 可以通过 v-bind 动态赋值

    Vue.component('my-component', { props: { propA: Number, // 基础的类型检查 (nullundefined 会通过任何类型验证) propB: [String, Number], // 多个可能的类型 propC: { type: String, required: true }, // 必填的字符串 propD: { type: Number, default: 100 }, // 带有默认值的数字 propE: { type: Object, default:()=> { message: 'hello' }}, // 对象或数组默认值必须从一个工厂函数获取 propF: { validator: (value)=> ['success', 'warning', 'danger'].indexOf(value) !== -1 }, // 自定义验证函数 } })

# 4.3 event 自定义事件 {#_4-3-event-自定义事件}

  • 事件名:使用 kebab-case
  • 自定义组件的 v-model : 需要实现内部input的:value和@input
  • .native 修饰符 将原生事件绑定到组件
  • .sync 修饰符 双向绑定
  • 监听子组件事件

# 4.4 插槽slot {#_4-4-插槽slot}

- 插槽内容
- 编译作用域
- 后备内容:可在slot内定义默认内容
- 具名插槽:用name特性定义额外插槽,用带有v-slot的<template>提供内容;v-slot:header可缩写为#header
- 作用域插槽:如<slot v-bind:user="user">{{ user.lastName }}</slot>
- 动态插槽名:如<template v-slot:[dynamicSlotName]></template>
- 将插槽转换为可复用的模板:模板基于输入的 prop 渲染出不同的内容

# 4.5 动态组件 {#_4-5-动态组件}

  • is特性:实现动态组件
  • keep-alive:包裹动态组件时,会缓存不活动的组件实例
  • 异步组件:...
  • 处理加载状态: v2.3.0+ 新增

# 5、过渡与动画 {#_5、过渡与动画}

# 5.1 过渡的类名 {#_5-1-过渡的类名}

v-enter    进入过渡的开始状态。# 在元素被插入之前生效,在元素被插入之后的下一帧移除。
v-enter-active    进入过渡生效时的状态。# 在整个进入过渡的阶段中应用,在元素被插入之前生效,在过渡/动画完成之后移除。
v-enter-to    进入过渡的结束状态。# 在元素被插入之后下一帧生效 (与此同时 v-enter 被移除),在过渡/动画完成之后移除。
v-leave    离开过渡的开始状态。# 在离开过渡被触发时立刻生效,下一帧被移除。
v-leave-active    离开过渡生效时的状态。# 在整个离开过渡的阶段中应用,在离开过渡被触发时立刻生效,在过渡/动画完成之后移除。
v-leave-to    离开过渡的结束状态。# 在离开过渡被触发之后下一帧生效 (与此同时 v-leave 被删除),在过渡/动画完成之后移除。
# 自定义过渡的类名
enter-class    enter-active-class    enter-to-class
leave-class    leave-active-class    leave-to-class

# 5.2 显性的过渡持续时间 {#_5-2-显性的过渡持续时间}

<transition :duration="1000">...</transition>
<transition :duration="{ enter: 500, leave: 800 }">...</transition>

# 5.3 JavaScript 钩子 {#_5-3-javascript-钩子}

# 这些钩子函数可以结合 CSS transitions/animations 使用,也可以单独使用
<transition
  v-on:before-enter="beforeEnter"
  v-on:enter="enter"
  v-on:after-enter="afterEnter"
  v-on:enter-cancelled="enterCancelled"

  v-on:before-leave="beforeLeave"
  v-on:leave="leave"
  v-on:after-leave="afterLeave"
  v-on:leave-cancelled="leaveCancelled"
>...</transition>

methods: {   # 当与 CSS 结合使用时, 回调函数 done 是可选的
  beforeEnter: function (el){// ...},
  enter: function (el, done) {// ... done() }, 
  afterEnter: function (el){// ...},
  enterCancelled: function (el) {// ...},

  beforeLeave: function (el) {// ...},
  leave: function (el, done) {// ... done() }, 
  afterLeave: function (el) {// ...},
  leaveCancelled: function (el) {// ...}  # leaveCancelled 只用于 v-show 中
}

# 使用 Velocity.js 
  methods: {
    beforeEnter: function (el) {
      el.style.opacity = 0
      el.style.transformOrigin = 'left'
    },
    enter: function (el, done) {
      Velocity(el, { opacity: 1, fontSize: '1.4em' }, { duration: 300 })
      Velocity(el, { fontSize: '1em' }, { complete: done })
    },
    leave: function (el, done) {
      Velocity(el, { translateX: '15px', rotateZ: '50deg' }, { duration: 600 })
      Velocity(el, { rotateZ: '100deg' }, { loop: 2 })
      Velocity(el, {rotateZ: '45deg',translateY: '30px',translateX: '30px',opacity: 0}, { complete: done })
    }
  }

# 5.4 初始渲染的过渡 {#_5-4-初始渲染的过渡}

# 可以通过 appear 特性设置节点在初始渲染的过渡
<transition
  appear
  # 自定义 CSS 类名
  appear-class="custom-appear-class"
  appear-to-class="custom-appear-to-class"
  appear-active-class="custom-appear-active-class"
  # 自定义 JavaScript 钩子
  v-on:before-appear="customBeforeAppearHook"
  v-on:appear="customAppearHook"
  v-on:after-appear="customAfterAppearHook"
  v-on:appear-cancelled="customAppearCancelledHook"
>...</transition>

# 5.5 其他 {#_5-5-其他}

多个元素的过渡:key 特性
过渡模式: mode="out-in" mode="in-out"
多个组件的过渡:使用动态组件
列表过渡:使用transition-group  组件
列表的排序过渡:v-move 特性
表的交错过渡:通过 data 属性与 JavaScript 通信
可复用的过渡:将 transition 或者 transition-group 作为根组件,然后将任何子组件放置在其中 
动态过渡:通过 name 特性来绑定动态值。 v-bind:name="transitionName"

# 5.6 状态过渡 {#_5-6-状态过渡}

对于据元素本身的动效:数字和运算、颜色的显示、SVG 节点的位置、元素的大小和其他的属性

# 使用第三方库来实现切换元素的过渡状态
数值:TweenMax.min.js
CSS的color值:Tween.js和Color.js
动态状态过渡
把过渡放到组件里
赞(1)
未经允许不得转载:工具盒子 » Vue教程(1)-基础篇