vuex学习

简介

​ vuex是专门用来管理vue.js应用程序中状态的一个插件。他的作用是将应用中的所有状态都放在一起,集中式来管理。这里所说的状态指的是vue组件中data里面的属性。

vuex组成结构示意图

​ vuex的特点是把数据单独隔离,形成一棵树状图。单独隔离就是说它有自己的生态系统。输入和输出,其中action作为数据的输入,state作为数据的输出。还有就是修改state的数据一般是同步的,如果需要异步操作,就把它放在actions里,拿到数据再通过mutations同步处理。如下图:

img

核心概念

1、store

​ vuex 中最关键的是store对象,这是vuex的核心。可以说,vuex这个插件其实就是一个store对象,每个vue应用仅且仅有一个store对象。

2、创建store

const store = new Vuex.Store({…});

可见,store是Vuex.Store这个构造函数new出来的实例。在构造函数中可以传一个对 象参数。这个参数中可以包含5个对象:

(1)state – 存放状态

(2)getters – state的计算属性

(3)mutations – 更改状态的逻辑,同步操作

(4)actions – 提交mutation,异步操作

(5)mudules – 将store模块化

关于store,有两大特点

(1)store 中存储的状态是响应式的,当组件从store中读取状态时,如果store中的状态发生了改变,那么相应的组件也会得到更新;

(2)不能直接改变store中的状态。改变store中的状态的唯一途径是提交(commit)mutations。这样使得可以方便地跟踪每一个状态的变化。

3、完整的store的结构

const store = new Vuex.Store({
state: {
// 存放状态
},
getters: {
// state的计算属性
},
mutations: {
// 更改state中状态的逻辑,同步操作
},
actions: {
// 提交mutation,异步操作
},
// 如果将store分成一个个的模块的话,则需要用到modules。
//然后在每一个module中写state, getters, mutations, actions等。
modules: {
a: moduleA,
b: moduleB,
// …
}
});

4、state

​ state上存放的就是变量,也就是状态。没有使用 state 的时候,都是直接在 data 中进行初始化的,但是有了 state 之后,就把 data 上的数据转移到 state 上去了。另外有些状态是组件私有的状态,称为组件的局部状态,不需要把这部分状态放在store中去。

(1)获取vuex状态,在构建好vue项目后,用yarn add vuex或者其他添加vuex插件,在src文件下会新增一个store文件夹

img

然后初始化store文件夹下面index.js里面的内容

img

之后打开main.js,将store挂载到当前vue实例中

img

然后就可以在组件中使用vuex了,例如在App.vue中使用

img

img

img

5、修改state,Mutations使用

​ vuex中规定只能通过提交mutation的方式去更改store中的状态,包括action中的操作,也是通过提交mutation去修改。

​ ①现在index.js定义store.name的属性和相关方法。

在store.js的mutations中定义了两个方法,一个是不带参数更新 name,一个是带参数更新name。在示例组件的methods中,定义了两个方法,一个是调用无参的mutation方法,一个是调用带参的mutation方(包含两种方式【载荷】、【对象】)

img

然后在App.vue定义方法将name的属性传入到matutions进行修改

img

默认的store.name值

img

点击‘不带参数设置按钮’设置的默认修改值

img

在input框输入内容传到Mutation修改

img

6、anction–异步更改状态

​ mutation中规则上是不允许异步操作的,如果需要异步的进行更改就需要使用anction。

img

img

img

点击异步不带参数设置或者输入参数点击异步单参数设置按钮后,它会延迟1s才改变name值

img

img

action 与 mutation 除了使用了异步操作和调用mutation,其它使用并 无差别

总结如下:

✦.action中不能直接更改状态,它是通过提交mutation来实现操作

✦.它的参数是一个与 store 实例具有相同方法和属性的 context 对象,所以可以通过context.state来获取store中的状态,可以通过context.commit来提交更改等

✦.action的调用使用 $.store.dispatch

✦.action事件的定义分为有参和无参两种

✦.action事件的触发同样可以使用载荷和对象两种方式

7、getter–store中state的派生状态

​ getter,是对store中state的一些派生状态,也可以理解为一种计算属性,因为它像计算属性一样,返回值会根据它的依赖被缓存起来,且依赖对象发生改变的时候它才会被重新计算。

getter的使用就是将对store中某个属性相同的处理操作抽出出来,做了一个公共的处理

例如,使用store中name的时候,需要做一个判断:如果是hello,返回“world”,其它的原样返回。

总结如下:

✦.getter类似计算属性,是对store中state的一些派生状态,可以简化代码、便于维护

✦.getter的使用方法 $.store.getters.属性名

✦.getter的定义可以带参可以不带参

img

img

img

img

  • vue-axios的get请求个post请求

    vue-axios的get请求个post请求 Axios 是一个基于 promise 的 HTTP 库,可以用在浏览器和 node.js 中,能够拦截请求和响应,能转换请求与响应数据,能取消请求,自动转换Json格式,浏览器...

    vue-axios的get请求个post请求
  • antd输入文本域样式

    a-textarea文本域样式问题 当时开发遇到一个问题,使用antd的a-textarea的时候宽度定义不了,进一步排查发现a-textarea标签antd框架那边已经对这个样式做了约束,所以一般的加style改不了,转而...

    antd输入文本域样式
  • springboot连接mysql(Access)错误

    SpringBoot连接MySQL时遇到ERROR 1045 (28000): Access denied for user ‘root‘@’localhost’ (using password: YES) 在yml配置文件...

    springboot连接mysql(Access)错误
  • FirstLove

    FirstLove ​ ​ 你总有一天要跟所有的记忆相安无事握手言和,那里面有她也有你,有她的青春也有你的年华。那个人永远活在时间里了,你把她拉不出来,自己也回不去,就这样吧,让她安静的留在那里...

    FirstLove
  • 侠客行

    侠客行 赵客缦胡缨,吴钩霜月民。 银鞍照白马,飒沓如流星。 十步杀一人,千里不留行。 事了拂衣去,深藏功与名。 闲过信陵饮,脱剑膝前横。 将炙啖朱亥,持觞劝侯嬴。 三杯吐然诺,五岳倒为轻。 眼花耳热后,...

    侠客行
  • 毕业感想
  • 可爱的小马

    可爱的小马 小套路,感谢陈同学的配合,可惜陈同学好像不喜欢(无奈~ 要图片可以私信,哈哈哈!!!

    可爱的小马
  • 从ssr到v2ray

    从ssr到v2ray(ubuntu 18.04) ​ 事件起因是因为用shadowsocks被封得太平常了,记得那天晚上我改一个端口就被封一个,无奈之下转到v2ray。 其中要做好准备工作。 1、申请域名。因为...

    从ssr到v2ray
  • 山川异域,风月同天

    山川异域,风月同天 1一個國度的山川,不可能跑到另一個國度。而天上的風月,則不受此拘限,不同國度的人可以共見

    山川异域,风月同天
  • 突变

    突变 1突变是以闪电和雷鸣的方式入侵的,像一颗子弹撞到胸口上炸开,爆炸带来的瞬间的压力从心脏传到每一根毛细血管,全身的细胞都停止住代谢和思考,仔细的聆听这一刹那的震荡。没有任何力量可以挽留住心,它只向无底深渊的黑暗更深处下坠...

    突变