熟悉 Vue 的都知道 方法methods、计算属性computed、观察者watcher 在 Vue 中有着很是重要的做用,有些时候咱们实现一个功能的时候可使用它们中任何一个都是能够的,可是它们之间又存在一些不一样之处,每个都有一些适合本身的场景,咱们要想知道合适的场景,确定先对它们有一个清楚的了解,先看一个小例子。html
<div id="app"> <input v-model="firstName" type="text"> <input v-model="secondName" type="text"> <p>{{fullName}}</p> </div>
var vm = new Vue({ el: "#app", data: { firstName: "Mo", secondName: "deng", fullName: "" }, methods: { getFullName () { this.fullName = this.firstName + "" + this.secondName; } }, mounted () { this.getFullName(); } });
var vm = new Vue({ el: "#app", data: { firstName: "liu", secondName: "deng" }, computed: { fullName () { return this.firstName + "" + this.secondName; } } });
var vm = new Vue({ el: "#app", data: { firstName: "liu", secondName: "deng", fullName: "liudeng" }, watch: { firstName: function (value) { this.fullName = value+ "" + this.secondName }, secondName: function (value) { this.fullName = this.firstName + "" + value } } });
咱们看到上面三种方法实现一个相同的效果,虽然效果相同,可是咱们每一个方法之间会有所区别。vue
在咱们使用 Vue 时可能会有不少方法会被放到这里,好比它多是咱们的事件处理方法,一些操做方法的逻辑等等,可是它不能跟踪任何依赖,并且还会在每次组件从新加载时都会执行,这就会致使咱们的方法会执行不少次,若是咱们的 UI 操做频繁的话,会致使性能的问题,因此在一些开销比较大的计算时,咱们应该尝试其余方案进行优化处理。git
从名字咱们其实大概的能够看出,它是一个依赖于其余属性的,当依赖的属性发生变化的时候就会触发咱们计算属性的逻辑,并且是基于它们依赖的属性进行缓存的,也就是说只有当依赖的属性发生变化的时候才会重新求值。缓存
相比 methods 的优点在于没必要每次重新执行定义的函数,这给咱们的性能上有着很大的优点,对咱们已经存在的数据属性很是好的处理方式,例如咱们案例中 fullName 的计算,优点很是明显。微信
当一些数据属性变化时,咱们执行一些逻辑时观察者对咱们很是重要,它能够帮助咱们监听属性的变化,只要属性发生变化,咱们就能够执行对应的一些操做。app
在 methods 中咱们放置了一些事件处理方法,咱们能够在事件绑定中直接应用,不会依赖于任何的属性。性能
<button class="todo-remove" type="button" @click="removeTodoItem(item)">x</button> export default { name: "TodoList", data() { return { todoType: "all", //任务类型 allTodoItems: [], }; }, methods: { //... 省略 //添加任务 addItem() { this.allTodoItems.push({ id: this.allTodoItems.length, text: this.itemText, completed: false }); this.itemText = ""; }, //删除任务 removeTodoItem(item) { this.allTodoItems = this.allTodoItems.filter( value => value.id != item.id ); } } };
咱们能够看到计算属性都是依赖于其余属性的,只有当依赖的属性值发生改变时,咱们的计算属性才会发生变化。
例如:passTodoItems 计算属性依赖于 todoType 属性,只要 todoType 属性发生变化,咱们的 passTodoItems 也会发生变化,从而筛选出咱们须要的数据。学习
export default { name: "TodoList", data() { return { todoType: "all", //任务类型 allTodoItems: [], }; }, computed: { //展现的任务 passTodoItems() { return this[this.todoType](this.allTodoItems); }, //是否显示底部的选项 isShowOptions() { return this.allTodoItems.length; } } }
能够看到咱们利用 watcher 进行数据的存储逻辑操做,只要当咱们监听的属性 allTodoItems 发生变化时,咱们就把数据进行保存。优化
export default { name: "TodoList", data() { return { todoType: "all", //任务类型 allTodoItems: [], }; }, watch: { allTodoItems: { handler() { localStorage.setItem("todoItems", JSON.stringify(this.allTodoItems)); }, deep: true //深度监听对象属性的变化,若是没有检测不到对象属性的变化 } } }
经过一个简单的 TodoList 案例展现了 methods、computed、watcher 三者的用法,固然咱们的实战项目中不单单是这么简单。
咱们再使用 methods、computed、watcher 时,应该选择它们合适的使用场景,虽然它们能够实现相同的结果。
methods 通常定义一些事件处理方法,操做方法,由于会频繁的触发,因此会引发性能问题,通常不会用在操做频繁的地方。
computed 会依赖于其余已经存在的属性,并且会进行缓存,只有在依赖的属性发生变化时,计算属性才会发生改变,开销大的地方使用较多。
watcher 它提供了一个更通用的方法来监听咱们的属性,当咱们的属性变化是执行一些逻辑的操做。
关注微信公众号:六小登登。领取全套学习资源