一、模块化
原因:
使用单一状态树,应用的所有状态会集中到一个比较大的对象。当应用变得非常复杂时,store 对象就有可能变得相当臃肿。
步骤:
1.一个模块一个js文件,负责管理一个数据每个模块拥有自己的 state、mutations、actions、getters,不需要module、plgins
2.模块对象的首行添加:namespaced:true,代表开启模块化,并将该对象导出
3.vuex对象文件中导入需要的模块
4.vuex对象中的moudles方法中管理导入的模块
------------------------------1.是一个js文件( 模块 ) , 负责管理historylist这个数据
export default {
namespaced:true,----------2.开启模块化
state:{ //存储数据
historylist:[],
},
getters:{ //定义计算方法( 类似于组件中的计算属性 )
},
mutations:{ //定义同步方法
//新增历史记录
addHistory( state, payload ){
state.historylist.push(payload);
}
},
actions:{ //定义异步方法
}
}
//----------------------------------------------------------
import { createStore,createLogger } from 'vuex'
-------------------------------------3.导入拆分出去的模块
import historylist from './modules/historylist'
//实例化vuex
export default createStore({
state:{ //存储数据
},
getters:{ //定义计算方法( 类似于组件中的计算属性 )
},
mutations:{ //定义同步方法
},
actions:{ //定义异步方法
},
modules:{ //以模块化的方式管理state中的数据
hl:historylist,-----------4.管理导入的模块
},
plugins:[ //集成第三方插件 来管理state中的数据
createLogger()
]
})
使用:
-
获取模块中的数据:
$store.state.模块名.数据名
-
获取模块中的计算方法:
$store.getters["模块名"/计算方法名]
-
触发模块中的同步方法:
$store.commit("模块名/同步方法名",参数)
-
触发模块中的异步方法:
$store.dispatch("模块名/异步方法名",参数)
<template>--------------------获取模块中的计算方法
<div class="summary">
<span>全部( {{ $store.getters['tl/totalCount'] }} )</span>
<span>已完成( {{ $store.getters['tl/finishedCount'] }} )</span>
<span>未完成( {{ $store.getters['tl/unfinishedCount'] }} )</span>
</div>
</template>
//=========================================
<template>
<div class="tasklist">
<div class="task" v-for="(item,index) in $store.state.tl.tasklist" :key="index">----获取模块中的数据
<div class="left">
<input type="checkbox" :checked="item.status" @click="handleClick(item.id)">
<span>{{item.name}}</span>
</div>
<span @click="handleDelete(item.id)">删除</span>
</div>
</div>
</template>
<script>
export default {
methods:{
handleClick(id){
//触发同步方法(调用同步方法) changeTaskStatus
this.$store.commit('tl/changeTaskStatus',id);-----触发模块中的同步方法
},
handleDelete(id){
//触发同步方法(调用同步方法) deleteTask
this.$store.commit('tl/deleteTask',id);------------触发模块中的同步方法
}
}
}
</script>
二、映射函数
作用:
可以将Vuex中的状态映射到组件的计算属性或方法中,以便于组件使用。在组件中使用映射函数,可以直接使用计算属性或方法来访问Vuex中的状态,而不需要在组件中写$store
步骤
-
在组件中,从vuex导入映射函数mapStat、mapGetters、mapMutations、mapActions
-
在对应的选项中映射数据,mapStat和mapGetters映射到computed,mapMutations和mapActions映射到methods中,
-
直接使用模块中的数据或者方法,不需要再加this.$store,
使用
-
获取模块中的数据:
-
映射数据:
computed:{...mapState('模块名',['数据名'])}
-
使用数据:this.数据名
-
-
获取模块中的计算方法:
使用数据:this.计算方法名
-
映射数据:
computed:{...mapGetters('模块名',['计算方法名'])}
-
-
触发模块中的同步方法:
使用数据:this.同步方法名
-
映射数据:
computed:{...mapMutations('模块名',['同步方法名'])}
-
-
触发模块中的异步方法:
使用数据:this.异步方法名
-
映射数据:
computed:{...mapActions('模块名',['异步方法名'])}
-
<template>
<div class="historyrecord">
<div class="title">历史记录</div>
<div class="list">-------------historylist直接使用
<span v-for="(item,index) in historylist" :key="index">{{item}}</span>
</div>
</div>
<script>
import { mapState } from 'vuex'------mapState()从vuex中获取(映射)state到组件的computed中
export default {
computed:{
...mapState('hl',['historylist'])--------映射模块的state数据
}
}
</script>
//================================================================================
<script>
import { mapMutations } from 'vuex'------mapMutations() 从vuex中获取(映射)同步方法到组件的methods中
export default {
data(){
return {
taskname:''
}
},
methods:{
...mapMutations( 'tl', ['addTask']),--------映射模块的同步方法addTask
...mapMutations( 'hl', ['addHistory'])--------映射模块的同步方法addHistory
handleAdd(){
//触发同步方法( 调用同步方法 ) addTask
this.addTask(this.taskname);----------直接使用
//触发同步方法( 调用同步方法 ) addHistory
this.addHistory(this.taskname);----------直接使用
//清空输入框的值
this.taskname = '';
},
}
}
</script>
三、sass
作用:
Sass(Syntactically Awesome Style Sheets)是一种CSS预处理器,它为CSS添加了许多功能和语法,使得CSS更加强大、灵活和易于维护。
步骤:
-
下载sass模块:
nmp i sass
-
style
修改为:<style scoped lang='scss'>
特点
-
变量:Sass中可以定义变量,可以存储颜色、字体、尺寸等常用的样式值。使用变量可以使样式表更加清晰易读,并且可以方便地修改样式。
-
嵌套:Sass中支持选择器的嵌套,可以使样式表更加易于管理。不需要在CSS中写出完整的选择器,可以使用嵌套的方式来定义样式。
-
条件语句:Sass中支持if语句和for循环语句,可以根据条件动态生成样式,从而实现更加灵活的样式设计。
-
函数:Sass中支持函数的定义和调用,可以实现更加复杂的样式计算。可以定义一些常用的样式计算函数,然后在样式表中直接调用。