Vue 实例( 选项及生命周期 )
每个 Vue.js 应用,都是通过 Vue 构造函数,创建一个 Vue 实例 开始的。
- 实例化时,需要传入一个选项对象,它可以包含:挂载元素、数据、方法、生命周期钩子等选项
var vm = new Vue({ // 选项对象:el、data、methods、computed、watch ... }) // 虽然没有完全遵循 MVVM 模型,但 Vue 的设计也受到了它的启发, // 因此,在文档中经常会使用 vm ( ViewModel ) 这个变量名表示 Vue 实例。
- 一个 Vue 应用,由一个通过 new Vue 创建的根 Vue 实例,以及可选的、嵌套的、可复用的组件树组成
// 一个 todo 应用的组件树,可以是这样的: 根实例 └─ TodoList ├─ TodoItem │ ├─ DeleteTodoButton │ └─ EditTodoButton └─ TodoListFooter ├─ ClearTodosButton └─ TodoListStatistics # 所有的 Vue 组件都是 Vue 实例,并且接受相同的选项对象 (一些根实例特有的选项除外)。
Vue 实例的属性和方法
[
数据属性] 每个 Vue 实例,都会代理其 data 对象里所有的属性,因此,访问vm.a等价于访问vm.$data.a。var vm = new Vue({ data: { a:1 } }) vm.a === data.a // -> true // 设置属性也会影响到原始数据 vm.a = 2 data.a // -> 2 # 问题是,只有这些被代理的属性是响应的。 # 如果在实例创建之后添加新的属性到实例上,它不会触发视图更新。 vm.b = 3; // data中的数据会变化,但视图上的数据不会响应式变化
[ 动态处理响应式数据 ] 此外,Vue 还提供了一些有用的实例属性和方法:它们都有前缀 $,以便与用户定义的属性区分开来
[1] 属性
- vm.$el 获取实例挂载的元素
- vm.$data 获取属性(数据)
- vm.$options 获取自定义选项、属性、函数;
- vm.$refs 获取通过 ref 属性注册的DOM对象
// HTML <div id="app"> <p>{{msg}}</p> <p ref="numRef">{{num}}</p> </div> // JS const vm = new Vue({ // 挂载的DOM元素 el:'#app', data(){ return{ msg:'HelloWorld', num:100 } }, // 自定义属性 username:'webpiece', login(){ console.log('login'); }, methods:{ print(){ // (1)获取数据 console.log(vm.$data.msg); // HelloWorld // this 指向了 vm 实例 // (2)获取实例挂载的元素 console.log(this.$el); // <div id="app"> // <p>HelloWorld</p> // <p>100</p> // </div> // (3) 获取自定义属性、方法 console.log(this.$options.username); // webpiece this.$options.login(); // login // (4) 获取通过ref属性注册的DOM元素 console.log(this.$refs.numRef); // <p>100</p> } } }); // 调用方法 vm.print();
[2] 方法
- vm.$set() 增加属性值( 响应式 )
- vm.$delete() 删除属性值
const vm = new Vue({ // 挂载的DOM元素 el:'#app', data(){ return{ user:{ username:'webpiece' } } }, methods:{ addId(){ // this.$set(this.user,'id', 1); 局部的 // Vue.set(this.user,'id', 1); 全局的 this.$set(this.user,'id','1'); console.log(this.user.id); // 1 }, deleteId(){ Vue.delete(this.user,'id'); console.log(this.user.id); // undefined } } }); // 调用方法 vm.addId(); vm.deleteId();
- vm.$watch() 检测属性值变化
// HTML <p @click="changeNum()">数据:{{num}}</p> // JS const vm = new Vue({ el:'#app', data(){ return{ num:100 } }, methods:{ changeNum(){ this.num = 5; } } }) vm.$watch('num', function (val, oldVal) { console.log('新数据为' + val + ',旧数据为' + oldVal); // 新数据为5,旧数据为100 })
- 生命周期相关的实例方法
vm.$mount('#app'); // 挂载DOM元素 vm.$destroy(); // 销毁实例 // 将回调延迟到下次 DOM 更新循环之后执行 vm.$nextTick(function(){}) // 局部 Vue.$nextTick(function(){ // 全局(推荐) // 放在Vue.nextTick()回调函数中的执行的应该是会对DOM进行操作的js代码 })