Open dlrandy opened 6 years ago
Mapping helpers state getters mutations, actions 这些函数根据store里对应的getters和action生成适当的计算属性和方法,所以你不必须每次都敲this.$store.getters和this.dispatch.
helpers的参数要么是组件里同名映射的类型数组,要么是一个对象,key是别名,value是类型值
因为组件里的getters和actions帮助隔离状态和相关的逻辑
同步store和router使用vuex-router-sync,它将在state里暴露当前的路由,state.route而且每次路由改变都会提交一个mutation。
vuex的modules和mainstore成分一样,modules里可以还有module,module它有一个特殊的namespaced的属性(true),main store里的modules,用于存放module,
默认访问某一个module的state的时候,store.state.maps, 每一次都这么访问有些啰嗦,所以有了Namespaced的module,namespaced的告诉vuex加上命名空间在各个构件之前
#1
mapGetters({
center: 'maps/center',
zoom: 'maps/zoom',
})
#2
mapGetters('maps',[
'center',
'zoom',
]);
#3
mapGetters('some/nested/module'',[])
#4
import {
createNamespaceHelpers
} from vuex;
const { mapGetters } = createNameSpacedHelpers('maps');
export default {
computed: mapGetters([
'center',
'zoom',
])
}
访问全局元素,在namespaced的module里可以访问root的state和root的getters
someGetters: (state, getters, rootState, rootGetters) => {}
在actions里,也可以访问context的rootGetters,而且你可以使用{root: true}的option在commit或者dispatch里。
vue里的render方法主要的好处就是更接近compiler,有处理template的js的所有能力,特别是对于动态模板
Vue不会直接使用新的虚拟DOM替换掉真实的DOM树,因为这样有很多的DOM操作,这个代价有些高。为了更好的性能,Vue在两个树之间做了一些diff,只对那些使得真实DOM匹配虚拟Dom的dom操作
vue-cli默认开启了jsx
最佳实践重新命名namespaced helpers,因为可能在另一个模块里添加这个helper
在jsx里tag的第一个字母的大小写很重要,小写会被认为是html元素,大写则被认为是变量。
vue文件里不能同时拥有template和render
scoped的slots传递数据给parent
<slot :results="results" />
<Search>
<template slot-scope="props">
<div>{{props.results.length}} results</div>
</template>
</Search>
template不是必须的
vue里的每个组件实例子啊创建的时候,总要做一些准备工作,比如数据响应式系统,组件声明周期等。一个例外就是functional组件,它们也没有state,不能使用this
export default {
functional: true,
render(h, { props, children }){
return h(`h${props.level}`, children);
}
}
还可以在template上添加functional属性
render方法会有一个context参数包含props, event Listeners, childen content, slots和其他数据
在写functional组件的时候,可以 把所有的属性作为props,也可以通过context.data 获取
Vuex使用集中化的store管理app的全局状态;它引入了几个新概念来帮助管理和调试App的state
随着众多组件之间的通信的复杂度增加,state的同步就会越复杂且不可控,导致code不好维护,难于理解。
单向数据流的好处是App的逻辑和数据流更为清晰。坏处就是需要理解一些新概念,偶尔的写一些code。
使用中心化的store,使得组件之间不需要知道彼此,也不需要依赖组件来同步数据。
Vuex的中心元素是store,它集中数据到一个model,这个model遵循着良好的设计模式。
store包含: state--> data; getters-->computed; mutations-->修改state; actions-->异步API和mutation;
VUE Component------dispatch-->Actions------Commit--->Mutations -------Mutate---->State----->render----> Vue Components
一旦设置了Store / Router, $store,$router, $route就在所有的组件里可用 state是只读的,不该直接修改它,也就失去了使用Vuex的好处
mutation是同步函数,接收state作为第一个参数和一个可选的payload,最好也不要做异步的操作
mutation相当于一个事件,有类型有handler函数
Mutation是同步的主要是为了调试
Vuex的严格模式,主要用于开发阶段,可以避免在同步的mutation之外修改state。不用在production上使用,影响性能
getters是一个函数,接收state和其他getters.不推荐直接访问$store的state,最好是使用getters,因为它允许你改变获取数据的方式而不必修改使用它的组件。例如改变state的结构调整对应的getters,而不会影响component。
actions主要用于store的操作的,它既可以commit mutation也可以执行异步操作,actions和mutations相似,也带有一个类型和handler。handler不能直接调用,需要store来dispacth一个action 类型,action的handler接收两个参数context和payload,context提供和store相关的commit,dispatch,state和getters功能
在组件里使用actions而不是mutations,actions就是app逻辑的抽象