文章目录
一、Vuex
1)理解vuex
Vuex是一个专为Vue.js应用程序开发的
状态管理系统+库
。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化
解读
在Vue中实现集中式状态(数据)管理的一个Vue插件,对vue应用中多个组件的共享状态进行集中式的管理(读/写),也是一种组件间通信的方式,且适用于任意组件间通信。
2)优点
Vuex状态管理跟使用传统全局变量的不同之处:
-
Vuex的状态存储是响应式的: 就是当你的组件使用到了这个 Vuex
的状态,一旦它改变了,所有关联的组件都会自动更新相对应的数据,这样开发者省事很多。
-
不能直接修改Vuex的状态: 如果是个全局对象变量,要修改很容易,但是在 Vuex 中不能这样做,想修改就得使用 Vuex。提供的唯一途径:显示地提交(commint)mutations来实现修改。这样做的好处就是方便我们跟踪每一个状态的变化,在开发过程中调试的时候,非常实用。
3)何时使用?
当你无法很好的进行数据管理的时候,多个组件需要共享数据时,你就需要用Vuex,即:
- 多个组件依赖于同一状态
- 来自不同组件的行为需要变更为同一状态
Vuex 背后的基本思想.
进行注解
4)使用步骤
因为我是通过命令创建vue项目的,当时已经选配好了,所以下面前四个步骤都不用自己配置
与router一样,当我们在项目中使用vuex之后,为了方便代码维护,我们一般需要做特殊的目录调整,约定的结构如下:
python
根组件
└── src
├── main.js
├── router
│ └── index.js # 路由
└── store
└── index.js # vuex
① 安装vuex
python
npm install vuex --save
② 创建vuex
在src文件夹下新建store/index.js,并初始化下列代码
python
import Vue from 'vue' //引入Vue核心库
import Vuex from 'vuex' //引入Vuex
Vue.use(Vuex) //应用Vuex插件
③ 导入vuex
在main.js中导入
python
import Vue from 'vue'
import App from './App.vue'
import store from './store' //导入
Vue.config.productionTip = false
new Vue({
store, //挂载
render: h => h(App)
}).$mount('#app')
④ 创建仓库Store
要使用 Vuex,我们要创建一个实例 store,我们称之为仓库,利用这个仓库 store 来对我们的状态进行管理。
python
//创建一个 store
export default new Vuex.Store({
state:{
//存放状态
},
getters:{
//state的计算属性
},
mutations: {
//更改state中状态的逻辑,同步操作
},
actions: {
//提交mutation,异步操作
},
//如果将store分成一个个的模块的话,则需要用到modules.
//然后在每一个module中的state,getters,mutations,actions等
modules: {
a: moduleA,
b: moduleB,
//...
}
})
⑤ 基本使用
修改state中的年龄
store/index.js
python
import Vue from 'vue'
import Vuex from 'vuex' //安装过直接导入
Vue.use(Vuex) //使用vuex插件
export default new Vuex.Store({
state: {
age:18,
},
mutations: {
addAgeMutation(state){
state.age++
}
},
actions: {
addAgeAction(context){
console.log(context) //第一个采纳数传入context,内部有commit和dispatch
context.commit('addAgeMutation') //调用commit会触发mutations中函数的执行
} //封装性很强,这里可以做出判断,是否有权限改值,如果有权限就通过
},
})
组件中使用修改
python
<script>
export default {
name: 'StatesView',
created() {
console.log(this.$store.state.age)
},
methods: {
handleClick() {
//this.$store.state.age++ 可以直接修改但是不建议这样使用
this.$store.dispatch('addAgeAction') //按照流程 触发Vuex中的actions得函数执行 使用dispatch
}
},
}
</script>
<template>
<div>
<h1>vuex的基本使用</h1>
<hr>
<h3>vuex中的age---------》{{ $store.state.age }}</h3>
<button @click="handleClick">点击修改vuex中的age属性+1</button>
</div>
</template>
5)五个模块介绍
State:
定义了应用状态的数据结构,可以在这里设置默认的初始状态。Getter:
允许组件从 store 中获取数据,mapGetters 辅助函数仅仅是将 store 中的 getter映射到局部计算属性(state的计算属性)。Mutation:
是唯一更改 store 中状态的方法,且必须是同步函数。Action:
用于提交 mutation,而不是直接变更状态,可以包含任意异步操作。Module:
可以将 store 分割成模块(module)。每个模块拥有自己的state、mutation、action、getter、甚至是嵌套子模块(将store模块化)
1.State
概念:State 本质上就是 Object 对象
state的作用是:保存公共数据(多组件中共用的数据)
state是响应式的: 如果修改了数据,相应的在视图上的值也会变化。
组件访问 State 数据
在每个 Vue 组件中,可以通过
this.$store.state
全局数据名称 访问 Store 中的数据。
定义公共数据格式
python
export default new Vuex.Store({
state: {
属性名:属性值,
},
})
使用公共数据
python
在组件中,通过this.$store.state.属性名来访问。
在模板标签中,则可以省略this而直接写成: {{$store.state.属性名}}
2.mutations
Mutation 本质上是JavaScript 函数,专门用来变更Store 中的数据
特点:
想要修改State 中的数据,只能调用Mutation 方法,它是Vuex中用来修改公共数据的唯一入口。好处:
能够确保修改来源的唯一性,方便调试和后期维护。在定义时:
它的第一个参数是state,第二个参数是载荷在调用时:
用this.$store.commit('mutation名', 载荷)
来调用注意:
Mutation 必须是同步函数,Mutation 里面不能放异步代码
更改 Vuex 的 store 中的状态的唯一方法是提交 mutation。Vuex 中的 mutation 非常类似于事件:每个 mutation 都有一个字符串的事件类型 (type)和一个回调函数 (handler)。这个回调函数就是我们实际进行状态更改的地方,并且它会接受 state 作为第一个参数:
在vuex中定义:
其中参数state参数是必须的,也可以自己传递一个参数,如下代码,进行计数器的加减操作,加法操作时可以根据所传递参数大小进行相加,减法操作没有传参每次减一
python
'注意:mutation必须是同步函数,不能是异步的,这是为了后期调试的方便。'
export default new Vuex.Store({
state: {
count:0,
},
//里面定义方法,操作state方法
mutations: {
//第一个参数是必须的,表示当前的state。在使用时不需要传入
//第二个参数是可选的,表示载荷,是可选的。在使用时要传入的数据
addCount(state,num){
state.count+=(state.count+num)
},
reduce(state){
state.count--
}
},
})
在组件中使用
定义两个按钮进行加减操作,组件中使用格式:
this.$store.commit('mutation名', 实参)
第二个参数可选的
python
<script>
export default {
name: 'StatesView',
methods: {
btnAdd(){
//注意:使用commit触发Mutation操作
this.$store.commit('addCount',10) //每次加10
console.log('执行了mutations给count+10了')
},
btnDel(){
console.log('执行了mutations给count-1了')
this.$store.commit('reduce')
}
}
}
}
</script>
<template>
<div>
<p>store中count数据值:{{$store.state.count}}</p>
<p><button @click="btnAdd">点击增加store中count数据值+10</button></p>
<p><button @click="btnDel">点击减少store中count数据值-1</button></p>
</div>
</template>
3.actions
Action 本质上是 JavaScript 函数,专门用来处理 Vuex 中的异步操作
actions是vuex的一个配置项
作用:
发异步请求获取数据,调用mutations来保存数据,将整个ajax操作封装到Vuex的内部要点:
- action 内部可以发异步请求操作
- action是间接修改state的:是通过调用 mutation来修改state
因为mutations中只能是同步操作,但是在实际的项目中,会有异步操作,那么action中提交mutation,然后在组件的methods中去提交action。只是提交actions的时候使用的是dispatch函数,而mutations则是用commit函数。
在vuex中定义:
将上面的减法操作改为异步操作
python
export default new Vuex.Store({
state: {
count: 0,
},
mutations: {
addCount(state, num) {
state.count += (state.count + num)
},
reduce(state) {
state.count--
}
},
actions: {
//action函数接受一个context函数,这个context具有与store实例相同的方法和属性
// context对象会自动传入,它与store实例具有相同的方法和属性
// 1. 异步操作
// 2. commit调用mutation来修改数据
asyncReduce(context){
setTimeout(()=>{
context.commit('reduce')
},2000)
}
//格式: context.commit('mutation名', 载荷)
},
})
在组件中使用:
python
<script>
export default {
name: 'StatesView',
methods: {
btnAdd(){
//注意:使用commit触发Mutation操作
this.$store.commit('addCount',10) //每次加10
console.log('执行了mutations给count+10了')
},
btnDel(){
//直接使用:在组件中通过this.$store.dispatch('actions的名字', 参数)来调用action
console.log('执行了actions的异步操作--等待2秒执行了')
this.$store.dispatch('asyncReduce')
}
},
}
</script>
<template>
<div>
<p>store中count数据值:{{$store.state.count}}</p>
<p><button @click="btnAdd">点击增加store中count数据值+10</button></p>
<p><button @click="btnDel">点击减少store中count数据值-1</button></p>
</div>
</template>
小结
action一般用来发异步请求,数据回来之后,在去调用mutations来保存数据
将ajax请求放在actions中有两个好处:
- 代码得到了进一步封装。将发ajax和保存数据到vuex绑定在一起。
- 逻辑更通顺。如果数据需要保存在Vuex的state中,那从接口处获取数据的操作就定义在Vuex的actions中。
4.Getter
类似于vue中的computed,进行缓存,对于Store中的数据进行加工处理形成新的数据
具体操作类似于前几种,这里不做具体说明
5.Modules
当遇见大型项目时,数据量大,store就会显得很臃肿
为了解决以上问题,Vuex 允许我们将 store 分割成模块(module)。每个模块拥有自己的 state、mutation、action、getter、甚至是嵌套子模块------从上至下进行同样方式的分割
二、Vue-router
三、LocalStorage与SessionStorage、cookie的使用
python
浏览器可以存数据
1.cookie中:有过期时间,一旦过期,就会清理掉
2.localStorage中:永久有效,即便浏览器重启也有效,只能手动或代码删除
3.sessionStorage中:当次有效,关闭浏览器,就清理掉了
python
<template>
<div>
<h1>localStorage的使用</h1>
<button @click="saveLocalStorage">写入数据</button>
<button @click="getLocalStorage">获取数据</button>
<button @click="delLocalStorage">删除数据</button>
<hr>
<h1>sessionStorage的使用</h1>
<button @click="saveSessionStorage">写入数据</button>
<button @click="getSessionStorage">获取数据</button>
<button @click="delSessionStorage">删除数据</button>
<hr>
<h1>cookies的使用---使用第三方vue-cookies</h1>
'需先安装cnpm install vue-cookies -S'
<button @click="saveCookie">写入数据</button>
<button @click="getCookie">获取数据</button>
<button @click="delCookie">删除数据</button>
<hr>
</div>
</template>
<script>
import cookie from 'vue-cookies' //cookies需要安装第三方,导入后使用
export default {
name:'IndexView',
methods:{
saveLocalStorage(){
localStorage.setItem('name','xxx')
},
getLocalStorage(){
console.log(localStorage.getItem('name'))
},
delLocalStorage(){
//localStorage.clear() //清空所有的localStorage数据
localStorage.removeItem('name') //指定清除
},
saveSessionStorage(){
sessionStorage.setItem('name','xxx')
},
getSessionStorage(){
console.log(sessionStorage.getItem('name'))
},
delSessionStorage(){
sessionStorage.removeItem('name') //同localStorage一样指定清除
},
saveCookie(){
cookie.set('name','xxx','7d') //按天算
},
getCookie(){
console.log(cookie.get('name'))
},
delCookie(){
cookie.remove('name')
},
}
}
</script>