Github原文阅读
MVVM
分为Model
、View
、ViewModel
三部分。html
Model
表明数据模型,定义数据和业务逻辑,访问数据层View
表明视图,展现页面结构、布局和外观(UI)ViewModel
表明视图模型,负责监听Model
数据变化并更新视图,处理用户交互 Model
和View
是经过ViewModel
,Model
的数据变化会触发View
的更新,View
的交互操做也会使Model
的数据发生改变。只须要针对数据进行维护操做,数据的自动同步不须要经过操做dom
实现。指令 | 做用 | 指望数值类型 |
---|---|---|
v-text | 更新元素文本内容 | string |
v-html | 更新元素的innerHTML |
string |
v-show | 条件渲染。根据表达式的真假值,控制元素的显示或隐藏 | any |
v-if | 条件渲染。根据表达式的值的真假条件选择是否渲染元素这个节点 | any |
v-else | 条件渲染。根据v-if 的相反条件进行元素渲染 |
any |
v-else-if | 条件渲染。作v-if 的链式调用 |
any |
v-for | 列表渲染。对数据进行遍历渲染,最好提供key 值 |
Array / Object / number / string |
v-on | 事件处理。绑定事件监听器,事件类型由参数指定,表达式能够是方法名或内联语句。 | Function / Inline Statement / Object |
v-bind | 动态绑定。动态绑定一个或多个特性,或一个组件prop 到表达式 |
any (with argument) / Object (without argument) |
v-model | 表单绑定。在表单或组件是上建立双向绑定 | 随表单控件类型变化 |
v-pre | 跳过该元素和它的子元素的编译过程 | |
v-cloak | 设置 [v-cloak] { display: none } 能够在渲染时延后加载Vue 实例,避免闪现 |
|
v-once | 元素和组件只渲染一次,从新渲染,元素/组件及其全部的子节点将被视为静态内容并跳过 |
不是刚需,和生命周期有很大关系,可见五个生命周期钩子。vue
bind
inserted
update
componentUpdated
unbind
Vue
实例化时,遍历访问data
的全部属性,使用Object.defineProperty
将其属性所有转换为getter/setter
进行依赖追踪以便修改属性时进行变动通知,每一个组件实例都有相应的 watcher 实例对象,它会在组件渲染的过程当中把属性记录为依赖,以后当依赖项的 setter
被调用时,会通知 watcher 从新计算,从而导致它关联的组件得以更新。git
model
的更新会触发view
的更新,view
的更新也会触发model
的更新github
model
的更新会触发view
的更新,可是view
的更新不会触发model
的更新web
Vue
是单向数据流,不是双向绑定Vue
的双向绑定不过是语法糖Object.defineProperty
是用来作响应式更新的,和双向绑定不要紧简单实现,有一个子组件输入框,一个按钮,父组件经过props
传值给子组件,当按钮增长时,子组件经过$emit
通知父组件修改相应的props
值。vue-router
<div id="app"> <parent></parent> </div> <script> var childNode = { template:` <div class = "child"> <div> <span>子组件数据</span> <input v-model="childMsg"> <button @click=add>+1</button> </div> </div> `, data(){ return{ childMsg:0 } }, methods: { add(){ this.childMsg++; this.$emit('update:foo',this.childMsg) } } }; var parentNode = { template:` <div class="parent"> <div> <span>父组件数据:{{msg}}</span> <child :foo.sync="msg"></child> </div> </div> `, components:{ 'child':childNode }, data(){ return{ 'msg':0 } } }; let vm = new Vue({ el:'#app', components:{ 'parent':parentNode } })
computed
)的应用watch)
watch
提供一个底层API
,能够执行任何逻辑,如函数节流、Ajax
异步获取数据,操做DOM
,可是不推荐computed
能作的,侦听器watch
都能作,反之不行computed
的尽可能不用侦听器watch
钩子 | 调用 | 类型 | 是否在服务端渲染期间调用 |
---|---|---|---|
beforeCreate | Vue 实例初始化以后,数据观察和事件配置以前 |
Function | Yes |
create | 实例建立完成(数据观察/属性和方法运算/事件回调)以后,挂载以前 | Function | Yes |
beforeMount | 挂载开始以前,render 函数首次调用 |
Function | Yes |
mounted | 实例挂载完成以后 | Function | No |
beforeUpdate | DOM 被patch 以前调用进行数据修改 |
Function | No |
updated | 组件 DOM 更新完成,避免在此期间更改状态 | Function | No |
actived | keep-alive 组件激活时 | Function | No |
deactived | keep-alive 组件停用时 | Function | No |
beforeDestroy | 实例销毁以前 | Function | No |
destroyed | 实例销毁 | Function | No |
errorCaptured | 当任何一个来自后代组件的错误时被捕获时 收到三个参数:错误对象、发生错误的组件实例,和一个包含错误在何处被捕获信息的字符串 返回 false,以阻止该错误继续向上冒泡 |
Function | No |
通常用于作展现用。vuex
functional:true
this
上下文、无生命周期Vue
组件 = Vue
实例 = new Vue(options)
,每一个组件就是一个Vue
实例。组件能够是页面中每个区域板块,也能够是某一个复用业务逻辑,也能够是每个单页面。编程
就以上面的双向数据绑定实现为例:数组
props
:组件props
中声明的属性,父组件使用props
定义数据属性,向子组件传递数据attrs
:没有声明的属性,默认自动挂载到组件根元素上,设置inheritAttrs
为false
能够关闭自动挂载class
、style
:挂载在组件根元素上,支持字符串、对象、数组等多种语法event
:
@click
、@input
、@change
、@xxx
等事件,经过this.$emit('xxx',...)
触发自定义事件event
向父组件发送消息@input.trim
、@click.stop
、@submit.prevent
等,通常用于原生HTML
元素,自定义组件须要自行开发支持slot
:
slot
进行组件内容分发,插入子组件内容,简单点就是传递内容的 <template slot="xxx">...</template>
、<template v-slot="xxx">...</template>
<template slot="xxx" slot-scope="props">...</template>
、<template v-slot:xxx="props">...</template>
props
向子组件通讯,子组件使用$emit
向父组件传递消息v-on
监听子组件的任何事件,子组件使用$emit
传入事件,这样父组件就会收到事件并更新Vuex
比较好管理组件的更新都是由数据驱动的,没有特殊状况,任何更改DOM
的行为都是在做死。缓存
包含三个部分:
props
data
vuex vue.observable
注意
状态和属性的改变未必会触发组件更新
通常用于底层组件通讯。底层组件通讯,不只属性要层层传递,事件也要层次冒泡,这是很耗性能的。
Vue Router 是 Vue.js 官方的路由管理器。它和 Vue.js 的核心深度集成,让构建单页面应用变得易如反掌。包含的功能有:
下面是一个简单路由的实现:
<div id="app" class="demo"> <h1>Hello App!</h1> <p> <!-- 经过router-link导航 --> <!-- 经过传入'to '属性指定连接--> <!-- <router-link> 默认会被渲染成一个 `<a>` 标签--> <router-link to="/foo">go to Foo</router-link> <router-link to="/bar">go to Bar</router-link> </p> <!-- 路由出口 --> <!-- 路由匹配到的组件将渲染在这里 --> <router-view></router-view> </div> <!-- 0. 若是使用模块化机制编程,导入Vue和VueRouter,要调用 Vue.use(VueRouter) 1. 定义 (路由) 组件。 2.定义路由 --> <script> //1. 定义 (路由) 组件。 const Foo = {template:'<div>foo</div>'}; const Bar = {template:'<div>bar</div>'}; //2.定义路由 //每一个路由应该映射一个组件。其中component能够是经过Vue.extend()建立的组件构造器 //或者只是一个组件配置对象 const routes = [ {path:'/foo',component:Foo}, {path:'/bar',component:Bar} ] //3.建立router实例,而后传‘routes’配置 const router = new VueRouter({ routes//(缩写)至关于routes:routes }) //4.建立和挂载根实例 //要记得经过router配置参数注入路由,从而让整个应用都有路由功能 const app = new Vue({ router }).$mount('#app');