特性
- Vue 创建实例时,会自动为 methods 绑定当前实例 this
- 保证在事件监听时,回调始终指向当前组件实例
- 方法要避免使用箭头函数(箭头函数没法改变this指向,本身指向父级)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| var app = Vue.createApp({ data() { return { title: 'This is my TITLE' } }, template: ` <h1>{{ title }}</h1> <button @click="changeTitle">CHANGE TITLE</button> `, methods: { changeTitle() { this.title = 'This is your TITLE' } } });
const vm = app.mount('#app');
|
@click="changeTitle('This is your TITLE')"
- 函数名 + () 不是执行,而是传入实参的容器
- 相当于React的写法:
onclick = "() => changeTitle('This is your TITLE')"
- 也能这么写:
onClick={ () => changeTitle('This is your TITLE') }
onClick={ changeTitle.bind(this, 'his is your TITLE')}
方法挂载在实例上
而不是 methods 上,而且也没抛出 methods 属性到 vm 实例上
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| var app = Vue.createApp({ data() { return { title: 'This is my TITLE' } }, template: ` <h1>{{ title }}</h1> <button @click="changeTitle('This is your TITLE')">CHANGE TITLE</button> `, methods: { changeTitle(title) { this.title = title; } } });
const vm = app.mount('#app'); console.log(vm); console.log(vm);
|
lodash的debounce防抖函数
第一种写法:
组件共用一个debounce,每个实例都共用它,不太好
第二种写法(推荐):
每次创建的时候都返回一个新的debounce函数
手写data
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68
| var Vue = (function() { function Vue(options) { this.$data = options.data(); this._methods = options.methods;
this._init(this); }
Vue.prototype._init = function(vm) { initData(vm); initMethods(vm); }
function initData(vm) { for (var key in vm.$data) { (function(k) { Object.defineProperty(vm, k, { get: function() { return vm.$data[k]; }, set: function(newVal) { vm.$data[k] = newVal; } }); })(key); } }
function initMethods(vm) { for (var key in vm._methods) { vm[key] = vm._methods[key]; } }
return Vue; })();
var vm = new Vue({ data() { return { a: 1, b: 2 } }, methods: { increaseA(num) { this.a += num; }, increaseB(num) { this.b += num; }, getTotal() { console.log(this.a + this.b); } } });
vm.increaseA(1); vm.increaseA(1); vm.increaseA(1); vm.increaseA(1);
vm.increaseB(2); vm.increaseB(2); vm.increaseB(2); vm.increaseB(2);
vm.getTotal();
|