[TOC]
# vuex
Vuex 是一个专为 Vue.js 应用程序开发的**状态管理模式**。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化
*****
```js
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
export default new Vuex.Store({
// state存放数据
state:{num:0,},
// getters对state中的数据做处理,相当于computed(getters是全局的)
getters :{},
// mutations做同步操作,(定时器,axios都不可使用),相当于组件中的methods
mutations :{},
// actions做异步操作,实际修改state状态值的还是mutations
actions :{},
// 主模块
modules: {
}
})
```
## 1.state
state存放Vuex的数据,相当于Vue中的data
>index.js
```
state:{num:0,}
```
>demo1目录 ,获取vuex中的state值
```HTML
<template>
<div>
//绑定,方法一
<h2>兄弟组件1 + {{this.$store.state.num}}</h2>
//方法二
<h2>兄弟组件1 + {{$store.state.num}} </h2>
</div>
</template>
```
## 2.getters
getters对state中的数据做处理,相当于computed(但getters是全局的)
>index.js目录
```js
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
export default new Vuex.Store({
// state存放数据
state:{num:0,},
// getters对state中的数据做处理,相当于computed(getters是全局的)
getters :{
// state作为实参传入
getNum(state){
return state.num;
},
},
// mutations做同步操作,(定时器,axios都不可使用),相当于组件中的methods
mutations :{},
// actions做异步操作,实际修改state状态值的还是mutations
actions :{},
// 主模块
modules: {
}
})
```
>demo2目录,获取getters中的值
```
<template>
<div>
//绑定
<h2>兄弟组件2 + {{getNum}}</h2>
//方法二
<h2>兄弟组件1 + {{$store.getters.getNum}}</h2>
</div>
</template>
<script>
export default {
// 可在store中的getters属性中写
computed:{
// 1.方法一
computed: {
getNum(){
return this.$store.getters.getNum;
}
};
</script>
```
## 3.mutations
更改 Vuex 的 store 中的状态的唯一方法是提交 mutation,每个 mutation 都有一个字符串的**事件类型 (type)**和 一个**回调函数 (handler)**。这个回调函数就是我们实际进行状态更改的地方,并且它会接受 state 作为第一个参数。**只能做同步操作**
```js
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
export default new Vuex.Store({
// state存放数据
state:{num:0,},
// getters对state中的数据做处理,相当于computed(getters是全局的)
getters :{
// state作为实参传入
getNum(state){
return state.num;
},
},
// mutations做同步操作,(定时器,axios都不可使用),相当于组件中的methods
mutations :{// 方法
// payload,形参,如果组件在commit时传参使用,组件不传参则为undefined,可写可不写
increase(state,payload){
state.num += payload ? payload : 1 ;
},
// 累减
decrease(state){
state.num--;
},},
// actions做异步操作,实际修改state状态值的还是mutations
actions :{},
// 主模块
modules: {
}
})
```
>btn目录,同步累加
```
<template>
<div>
<!-- <button @click="$store.state.num++">点击 + 1</button> -->
<!-- 以上写法看似页面值发生了改变,实际num的值一直为0,修改state值唯一方式是commit一个mutation方法 -->
<!-- 写法一 -->
<!-- <button @click="addFn">点击 + 1</button> -->
<!-- 写法二 -->
<button @click="$store.commit('increase',2)">点击 累加</button>
</div>
</template>
<script>
export defalut {
methods:{
addFn() {
// 使用commit调用mutations的中的increase方法
// 传参的话,使用payload,不传参数为undefined
// this.$store.commit('increase',2);
this.$store.commit("increase");
},
}
}
</script>
```
## 4.actions
Action 类似于 mutation,不同在于:
* Action 提交的是 mutation,而不是直接变更状态。
* Action 可以包含任意异步操作。Action 函数接受一个与 store 实例具有相同方法和属性的 context 对象,因此你可以调用`context.commit`提交一个 mutation,或者通过`context.state`和`context.getters`来获取 state 和 getters
```js
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
export default new Vuex.Store({
// state存放数据
state:{num:0,},
// getters对state中的数据做处理,相当于computed(getters是全局的)
getters :{
// state作为实参传入
getNum(state){
return state.num;
},
},
// mutations做同步操作,(定时器,axios都不可使用),相当于组件中的methods
mutations :{// 方法
// payload,形参,如果组件在commit时传参使用,组件不传参则为undefined,可写可不写
increase(state,payload){
state.num += payload ? payload : 1 ;
},
// 累减
decrease(state){
state.num--;
},},
// actions做异步操作,实际修改state状态值的还是mutations
actions :{
// 异步操作,1秒后再减1
decreaseAsync(context){
context.commit('decrease');
}
},
// 主模块
modules: {
}
})
```
>btn目录,延期一秒后 -1(异步操作)
```
<template>
<div>
<!-- 隔1秒后再进行减1 -->
<!-- 写法一 -->
<button @click="reduce" >点击-1</button>
<!-- 写法二 -->
<button @click='$store.dispatch("decreaseAsync")'> 点击 -1</button>
</div>
</template>
<script>
export defalut {
methods:{
reduce(){
// $store.dispatch触发store中的actions
this.$store.dispatch('decreaseAsync');
}
}
}
</script>
```
## 5.modules
由于使用单一状态树,应用的所有状态会集中到一个比较大的对象。当应用变得非常复杂时,store 对象就有可能变得相当臃肿。
为了解决以上问题,Vuex 允许我们将 store 分割成**模块(module)**。每个模块拥有自己的 state、mutation、action、getter、甚至是嵌套子模块——从上至下进行同样方式的分割。
*****
在子模块中要打开命名空间,这样便于可使用点语法获取到子模块的内容` namespace:true`
## 6.辅助函数
辅助函数有4个,分别是mapState,mapGetters,mapMutations,mapActions。需现在使用的组件中引入辅助函数,在component中使用的是mapState,mapGetters,在methods中使用的是mapMutations,mapActions。
>demo1目录
```
<template>
<div>
<h2>兄弟组件1 + {{num}}</h2>
<h2>兄弟组件1 + {{getNum}}</h2>
</div>
</template>
<script>
// 映射到store中
import {mapState,mapGetters} } from 'vuex'
export default {
//使用mapState方法
// 使用扩展运算符取出state中的参数对象
...mapState(['num']),
...mapGetters(["getNum"]),
},
};
</script>
```
>btn目录
```
<template>
<div>
<!-- 辅助函数写法-->
<button @click="increase(2)">点击 + 1</button>
<button @click="decreaseAsync()">点击延迟 - 1</button>
</template>
<script>
import {mapMutations , mapActions} from 'vuex'
export default {
methods: {
// 辅助函数写法
...mapMutations(['increase']),
...mapActions(['decreaseAsync']),
},
};
</script>
```
- Javascript
- 组成
- Web API
- 初步认识DOM
- 经典案例 (使用获取id的方法)
- 节点和元素
- 经典案例 (使用获取节点和元素的方法)
- 函数
- 作用域链
- Array对象的方法
- String对象的方法
- 绑定事件
- 事件委托
- 逻辑运算
- js高级(面向对象、)
- 基本知识
- 数据类型
- 基本包装类型的使用
- 定义变量的区别
- JavaScript对象的动态特性
- 关键字in
- 关键字delete
- 运算符
- 创建对象的方式
- 回调函数
- 高阶函数
- 构造器属性
- this指向
- hasOwnProperty属性
- 私有成员和特权方法
- 面向对象和面向过程的基础
- 异常捕获
- 构造函数和普通函数的区别
- 构造函数的补充
- 原型
- 原型图
- 获取原型对象的方法
- 原型对象的访问和设置
- 判断某个对象是否是指定实例对象的原型对象
- constructor
- isPrototypeOf
- instanceof
- 检测对象是公有还是私有
- 核心概念
- 继承
- 混入式继承
- 原型式继承
- 原型链继承
- 借用构造函数继承(call继承,经典继承)
- 组合式继承(推荐)
- class继承
- __ proto __属性
- call方法和apply方法
- Fuction相关知识
- 创建函数的方式
- eval函数
- 浅拷贝和深拷贝
- 浅拷贝
- 深拷贝
- Object相关知识
- Object原型属性和方法
- Object静态成员对象
- 案例
- 数组去重
- 闭包
- 语法
- DOM事件和闭包
- 定时器和闭包
- 即使对象初始化
- 闭包的变形
- 设计模式
- 单例模式
- 发布订阅模式(观察者模式)
- 工厂模式
- 命名空间模式
- 同步和异步
- 垃圾回收机制
- get和set
- JQuery
- 动画方法
- 事件
- 方法
- 节点
- 方法er
- HTML + CSS
- 经验
- flex布局
- px,em ,rem区别
- 清除浮动
- Less
- UI框架
- 一.Bootstrap框架
- 常用类名
- 二 .Animate.css
- 三.WOW.JS
- 四.scrollReveal.js
- 五.zepto框架
- zepto选择器
- 滑动事件
- tap触摸事件
- zepto动画
- 六,swipe框架
- 分页器
- 左右按钮和循环轮播
- 底部滚动和轮播方向
- 自动播放和切换效果
- 移入移除事件
- swipe结合animate.css
- 总结
- 滚滚屏
- 自动化构建工具
- 1.gulp
- 使用gulp编译less成css,并最终压缩css
- 压缩css
- 合并和压缩js
- 压缩图片
- 编写server服务
- 包管理器
- 介绍
- brew
- npm十全大补汤
- ES6
- class类
- class类的使用
- class类的继承结构
- let 和const
- 结构语法
- 模板字符串
- 化简写法
- 形参的默认值
- ...rest参数
- rest剩余参数
- 扩展参数
- 正则表达式
- 创建正则表达式的方式
- 构造函数
- 字面量的方式
- 其他(修饰符)
- 判断是否匹配成功
- 正则表达式案例
- 常见的匹配原则
- 验证密码长度
- 表单验证
- 正则提取
- 正则替换
- vue
- 插值操作
- Mustache语法
- 过滤器
- 绑定相关知识
- 绑定对象
- 单向绑定
- 双向绑定
- 绑定属性
- 动态绑定style
- 绑定事件
- 补充
- 绑定语法
- 基础
- vue介绍
- MVVM
- 计算属性
- 指令
- v-cloak
- 显示和隐藏
- 循环
- 自定义指令
- 本地缓存
- localStorage
- sessionStorage
- 对象劫持
- 组件
- 局部组件
- 父子组件
- 全局组件
- 组件访问实例数据
- 父传子
- 子传父
- 兄弟传兄弟
- 插槽
- methods,computed,watch的区别
- Vue.observable()
- vue.config.js配置
- 修饰符
- .sync修饰符
- $attrs和$listeners
- Node.js
- 使用Node执行js代码的两种方式
- 交互模式
- 解释js文件
- http模板
- request对象的使用
- express框架
- 安装
- post
- 获取请求参数
- post返回页面
- 重定向到别的接口
- get
- 返回页面
- get获取请求参数
- 请求静态资源
- 热重启
- Ajax
- 请求方式
- get请求
- post请求
- jQuery中的ajax方法
- JQuery中的get请求
- jQuery中的post请求
- 微信小程序
- 认识
- 引入样式的方式
- 绑定数据
- 小程序组件
- scroll - view 可滚动视图区域
- 发起请求
- template模板
- rich-text
- web-view
- open-data
- checkbox组件
- label组件
- radio组件
- picker组件
- swiper组件
- Git
- 跨域
- 左侧固定,右侧自适应
- vuex
- 如何解决vuex页面刷新数据丢失问题
- 数据结构
- 树
- 问题累积
- Axios
- 前端路由