计算属性:
什么是计算属性:
用于简单运算的
模板内的表达式非常便利,但是设计它们的初衷是用于简单运算的。在模板中放入太多的逻辑会让模板过重且难以维护。
计算属性的使用:
在一个计算属性里可以完成各种复杂的逻辑,包括运算、函数调用等,只要最终返回一个结果就可以。
语法:
computed: {
属性名 () {
// `this` 指向 vm 实例
return this.message.split('').reverse().join('')
}
}
调用计算属性的的时候直接{{属性名}}即可
或者是this.属性名
每一个计算属性都包含一个getter 和一个setter ,我们一般使用的是计算属性的默认用法, 只是利用了getter 来读取。
在你需要时,也可以提供一个setter 函数, 当手动修改计算属性的值就像修改一个普通数据那样时,就会触发setter 函数,执行一些自定义的操作,
var vm = new Vue({
el: '#demo',
data: {
firstName: 'Foo',
lastName: 'Bar'
},
computed: {
fullName: {
// getter
get: function () {
return this.firstName + ' ' + this.lastName
},
// setter
set: function (newValue) {
var names = newValue.split(' ');
this.firstName = names[0];
this.lastName = names[names.length - 1];
}
}
}
});
绝大多数情况下,我们只会用默认的getter 方法来读取一个计算属性,在业务中很少用到setter,所以在声明一个计算属性时,可以直接使用默认的写法,不必将getter 和setter 都声明。
计算属性缓存
我们可以将同一函数定义为一个方法而不是一个计算属性,两种方式的最终结果确实是完全相同的。只是一个使用reverseTitle()取值,一个使用reverseTitle取值。
然而,不同的是计算属性是基于它们的依赖进行缓存的。计算属性只有在它的相关依赖发生改变时才会重新求值。
这就意味着只要 title还没有发生改变,多次访问 reverseTitle计算属性会立即返回之前的计算结果,而不必再次执行函数。
<div>{{reverseTitle()}}</div><br><br>
// 在组件中
methods: {
reverseTitle: function () {
return this.title.split('').reverse().join('')
}
},
computed:{
reverseTitle(){
return this.title.split('').reverse().join('')
}
}
我们为什么需要缓存?
假设我们有一个性能开销比较大的的计算属性 A,它需要遍历一个巨大的数组并做大量的计算。然后我们可能有其他的计算属性依赖于 A 。如果没有缓存,我们将不可避免的多次执行 A 的 getter!如果你不希望有缓存,可以用方法来替代。
计算属性禁用箭头函数
注意,不应该使用箭头函数来定义计算属性函数 (例如 aDouble: () => this.a * 2
)。理由是箭头函数绑定了父级作用域的上下文,所以 this
将不会按照期望指向 Vue
实例,this.a
将是 undefined
。
安装vuex
npm install vuex --save
开始使用
commit: 同步操作
存储:
this.$store.commit('mutations名字',name)
取值
this.$store.state.state中的key
dispatch: 异步操作
存储
this.$store.dispatch('action的名字',name)
取值
this.$store.getters.getters中的名字
commit 和dispatch的区别在于commit是提交mutatious的同步操作,dispatch是分发actions的异步操作
action不能直接修改state值
action 必须通过提交mutation来更新state
只有mutation才能更新state
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
const store = new Vuex.Store({
state: {
count: 0
},
mutations: {
increment (state) {
state.count++
}
}
})
存值:
<template>
<div class="about">
<button @click="addCount">按钮</button>
{{count}}
</div>
</template>
<script>
export default{
data(){
return {
count:1
}
},
methods:{
addCount(){
this.count=this.count+1;
this.$store.dispatch('increment',this.count);
alert(this.$store.getters.increment);
}
}
}
</script>
取值:
<template>
<div class="home">
数字:{{count}}
</div>
</template>
<script>
export default {
computed:{
count(){
return this.$store.getters.increment;
}
}
}
</script>
state
:需要管理的全局data
mutations
:定义改变全局data的方法,Mutation 必须是同步函数
actions
:同mutation类似,也是定义修改全局data的方法,不同的是可以进行异步操作
getters
:可以理解成vuex的computed计算属性,state发生变化他也会同步发生变化
modules
:可以对vuex的state进行分模块管理
import handle from './handle'
modules: {
handle
}
})
handle.js:
let state = {
list: []
}
let mutations = {
getList (state, info) {
state.list = info
}
}
export default {
state: state,
mutations
}