vue---vuex
vuex是一个专为vue.js应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。
一、npm安装
npm install vuex --save
二、配置:全局配置
当我们使用vue脚手架来搭配vue开发环境时,vuex全局该如何配置呢?
(1)首先我们在项目的src文件下创建一个store文件夹,在store文件夹下新建一个store.js文件,来创建我们的store
(2) 在全局main.js文件下来全局配置
// The Vue build version to load with the `import` command // (runtime-only or standalone) has been set in webpack.base.conf with an alias. import Vue from 'vue' import App from './App' import router from './router' import store from './store/store.js' //引入store Vue.config.productionTip = false /* eslint-disable no-new */ new Vue({ el: '#app', router, store, //把store实例注册到根组件中,这样所有的子组件都可以用 components: { App }, template: '<App/>;' })
三、来简单讲一下vuex的一些比较常用到的4个核心概念:state、getter、mutation、action
(1)state
每个vuex应用的核心就是store(仓库)。说白了,‘store’它就像一个仓库、一个容器,用它来存储应用中的态状(state)。即此,它包含着你的应用中大部分的状态。
下面介绍一下vuex与单纯的全局对象有以下两点不同:
1.vuex的状态存储是响应式的,当vue组件从store中读取状态的时候,若store 中的状态发生变化,那么相应的组件也会相应地得到高效更新。
2.我们不能直接去改变 store中的状态(改变store中的状态,其实就是改变store中的值)。想要改变store中的状态的唯一途径就是显式地提交(commit)mutation。
接下来,我们去创建一个简单的state
store.js 文件中:
import Vue from 'vue'; import Vuex from 'vuex'; Vue.use(Vuex); const store = new Vuex.Store({ state: { count: 0, numbers: 99 } }) export default store;
在各个组件中我们该怎么去访问呢?例如,
HelloWorld.vue:
<template> <div class="hello"> <button @click="onClick">点击</button> </div> </template> <script> export default { name: 'HelloWorld', data() { return { } }, methods: { onClick(){ console.log(this.$store.state.count);//我们可以通过this.$store.state来访问 } } } </script> <!-- Add "scoped" attribute to limit CSS to this component only --> <style scoped> </style>
(2)getter
vuex允许我们在store中定义'getter'(getter可以认为是store的计算属性),就像计算属性一样,getter的返回值会根据它的依赖被缓存起来,且只有当它的依赖值发生了改变才会被重新计算。
下面我们创建一个getter:
getter它会接收state作为第一个参数
import Vue from 'vue'; import Vuex from 'vuex'; Vue.use(Vuex); const store = new Vuex.Store({ state: { count: 0, numbers: 99 }, getters: { doneTodos(state) { 传入的state参数,其就是store中的state,也就是我们存储的状态(state) return state.count; } } }) export default store;
getter会暴露为store.getters对象,所以我们可以通过它(store.getters)以属性的形式来访问这些值:
<template> <div class="hello"> <button @click="onClick">点击</button> </div> </template> <script> export default { name: 'HelloWorld', data() { return { } }, methods: { onClick(){ console.log('mm',this.$store.getters.doneTodos); // 0 } } } </script> <!-- Add "scoped" attribute to limit CSS to this component only --> <style scoped> </style>
getter还可以接收其他的getter作为第二个参数:
import Vue from 'vue'; import Vuex from 'vuex'; Vue.use(Vuex); const store = new Vuex.Store({ state: { count: 10, numbers: 99 }, getters: { num(state) {//其他的getter return state.numbers; }, doneTodos(state, num) {//接收其他的getter作为第二个参数 return state.count; } } }) export default store;
3.mutation
之前我们说过,不能直接去更改store中的状态,也就是不能直接去更改state中的值,更改vuex的store中的状态的唯一方法就是提交mutation;
vuex中的mutation,它非常类似于事件:每个mutation都有一个字符串的事件类型(type)和一个回调函数(handler),这个回调函数就是我们实际进行状态更改的地方,并且它会接受state作为第一个参数。
import Vue from 'vue'; import Vuex from 'vuex'; Vue.use(Vuex); const store = new Vuex.Store({ state: { count: 10, numbers: 99 }, getters: { num(state) { return state.numbers; }, doneTodos(state, num) { return state.count; } }, mutations: { increment(state) { state.count ++; } } }) export default store;
现在我们去触发mutation handler,来改变store中的状态,但是我们又不能直接去调用一个mutation handler。这个选项更像是事件注册:‘当触发一个类型为increment的mutation时,调用此函数’,所以,要触发一个mutation handler,你需要以相应的type调用store.commit方法:
<template> <div class="hello"> <button @click="onClick">点击</button> </div> </template> <script> export default { name: 'HelloWorld', data() { return { } }, methods: { onClick(){ this.$store.commit('increment'); } } } </script> <!-- Add "scoped" attribute to limit CSS to this component only --> <style scoped> </style>
同时mutation除了接收state作为第一个参数外,它还可以额外的参数,
import Vue from 'vue'; import Vuex from 'vuex'; Vue.use(Vuex); const store = new Vuex.Store({ state: { count: 10, numbers: 99 }, getters: { num(state) { return state.numbers; }, doneTodos(state, num) { return state.count; } }, mutations: { increment(state, m) { //m为传入的第二个参数 state.count += m; } } }) export default store;
怎么去调用呢,其实和之前的一样,同样调用store.commit()方法
<template> <div class="hello"> <button @click="onClick">点击</button> </div> </template> <script> export default { name: 'HelloWorld', data() { return { } }, methods: { onClick(){ this.$store.commit('increment',80);//第二个参数80其实就是参数m的值 } } } </script> <!-- Add "scoped" attribute to limit CSS to this component only --> <style scoped> </style>
⚠️mutation必须是同步的
4.action
我们知道mutation是同步的,所以在mutation中混合异步调用会导致你的程序很难调试,所以action可以帮助我们处理异步操作。
action类似于mutation,不同在于:
(1)action提交的mutation,而不是直接去改变状态。
(2)action可以包含任意异步操作
下面我们来注册一个简单的action:
import Vue from 'vue'; import Vuex from 'vuex'; Vue.use(Vuex); const store = new Vuex.Store({ state: { count: 10, numbers: 99 }, getters: { num(state) { return state.numbers; }, doneTodos(state, num) { return state.count; } }, mutations: { increment(state, m) { state.count += m; } }, actions: { textClick(context) { context.commit('increment'); } } }) export default store;
action函数会接受一个与store实例具有相同方法和属性的context对象(并非一定是context,可以是任意参数),context类似于store,你可以把context当作store,但两者还是有区别的。
这样的话你就可以调用context.commit来提交mutation,或者也可以通过context.state和context.getters来获取state和getters。
我们通过前面可以知道,mutation通过store.commit()来触发回调函数,那么action又是通过什么呢?
action通过store.dispatch方法触发:
<template> <div class="hello"> <button @click="onClick">点击</button> </div> </template> <script> export default { name: 'HelloWorld', data() { return { } }, methods: { onClick(){ this.$store.dispatch('textClick'); } } } </script> <!-- Add "scoped" attribute to limit CSS to this component only --> <style scoped> </style>
先更新到这吧,回头继续补充!!!!
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
以太坊和Metamask开发web应用不需要再使用密码
我在ConsenSys为各种客户构建了大量的概念证明,通常他们想要利用以太坊区块链来解决某些业务用例。奇怪的是,这些系统通常设计有标准的网络登录(即用户名和密码)。我总是问自己为什么我还在这样做设计,毕竟,这是今天以太网目前可以解决每个烦人的Web应用程序的一个方面。所以我决定停下脚步,设计一下这个解决方案。 JSON Web token 登录标准Web系统(和/或使用其API)的一种非常流行的方法是将密码(经过哈希的客户端)提交给认证端点并接收token作为回报。这通常称为JSON Web Token,通常在一段有限的时间内(几分钟到几天)有效。这是一个关于标准实现的很好的教程。 JSON Web Token很好,我开始认为在区块链上验证自己很容易。事实上,当你使用以太坊时,你需要不断地去改进。 如果你将以太网地址(这只是公钥的sha3哈希)视为网站上的帐户,则可以通过使用私钥对一段数据进行签名来证明你拥有该帐户,这非常容易。此数据是任意的,可以是网站API提供的任意随机字符串。因此,我们可以使用地址作为用户名并绕过密码的需要。事实上,我们甚至不需要使用区块链来做到这一点。 这是使用...
- 下一篇
基于python+unittest +requests接口测试
谈到接口测试,大家都不会感到陌生。接口测试的工具和实现方式也有很多,比如ant+jmeter+jemkins、postman.....等都可以去实现,但是今天我要介绍的是基于python+unittest +requests的接口测试,至于接口测试前的准备工作、原理....等其他的需要掌握的知识点,大家自己可以下去查找资料学习。 1、环境介绍: 采用python3+unittest+requests 2、工程目录结构介绍: 整个工程分为5个目录:程序入口、测试报告、测试用例、测试数据(包括Http请求默认值等),工具目录(主要是放置一些公共调用函数,比如请求类、json解析) 3、接口请求 接口请求封装成单独类,用例直接调用请求类即可。之所以单独出来,因为请求的方式有很多种,如果后续需要添加其他的请求方式只用修改此类就可以了,其他的有点就不多说了 4、接口用例 每一个接口单独一个类,每个接口会有多种场景,然后根据情况去初始化,具体去实现。说到接口case,我得说一下参数化,参数化的方式有很多,比如excel、xml、database....这些都可以,但是我这里沿用的testng的数据...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS7,8上快速安装Gitea,搭建Git服务器
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- Linux系统CentOS6、CentOS7手动修改IP地址
- Docker安装Oracle12C,快速搭建Oracle学习环境
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- CentOS6,CentOS7官方镜像安装Oracle11G
- CentOS7安装Docker,走上虚拟化容器引擎之路
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- 设置Eclipse缩进为4个空格,增强代码规范
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长