flux react php,Vue的Flux框架之Vuex状态管理器

学习vue之前,最重要是弄懂两个概念,一是“what”,要理解vuex是什么;二是“why”,要清楚为什么要用vuex。

Vuex是什么?

Vuex 类似 React 里面的 Redux 的状态管理器,用来管理Vue的所有组件状态。

为什么使用Vuex?

当你打算开发大型单页应用(SPA),会出现多个视图组件依赖同一个状态,来自不同视图的行为需要变更同一个状态。

遇到以上情况时候,你就应该考虑使用Vuex了,它能把组件的共享状态抽取出来,当做一个全局单例模式进行管理。这样不管你在何处改变状态,都会通知使用该状态的组件做出相应修改。

下面讲解如何使用Vuex

一个简单的Vuex示例

本文就讲解安装Vuex,直接通过代码讲解Vuex使用。

import Vue from 'vue';

import Vuex from 'vuex';

Vue.use(Vuex);

const store = new Vuex.Store({

state: {

count: 0

},

mutations: {

increment (state) {

state.count++

}

}

})

上面就是一个简单的Vuex示例,每一个Vuex应用就是一个store,在store中包含组件中的共享状态state和改变状态的方法(暂且称作方法)mutations。

需要注意的是只能通过mutations改变store的state的状态,不能通过store.state.count = 5;直接更改(其实可以更改,不建议这么做,不通过mutations改变state,状态不会被同步)。

使用store.commit方法触发mutations改变state:

store.commit('increment');

console.log(store.state.count) // 1

一个简简单单的Vuex应用就实现了。

在Vue组件使用Vuex

如果希望Vuex状态更新的时候,组件数据得到相应的更新,那么可以用计算属性computed获取state的更新状态。

const Counter = {

template: `

{{ count }}
`,

computed: {

count () {

return store.state.count;

}

}

}

每一个store.state都是全局状态,在使用Vuex时候需要在根组件或(入口文件)注入。

// 根组件

import Vue from 'vue';

import Vuex from 'vuex';

Vue.use(Vuex);

const app = new Vue({

el: '#app',

store,

components: {

Counter

},

template: `

`

})

通过这种注入机制,就能在子组件Counter通过this.$store访问:

// Counter 组件

const Counter = {

template: `

{{ count }}
`,

computed: {

count () {

return this.$store.state.count

}

}

}

mapState函数

computed: {

count () {

return this.$store.state.count

}

}

上面通过count计算属性获取同名state.count属性,如何每一次获取都要写一个这样的方法,是不显得重复又麻烦?可以使用mapState函数简化这个过程。

import { mapState } from 'vuex';

export default {

computed: mapState ({

count: state => state.count,

countAlias: 'count', // 别名 `count` 等价于 state => state.count

})

}

还有更简单的使用方法:

computed: mapState([

'count'

// 映射 this.count 为 store.state.count

])

Getters对象

如果我们需要对state对象进行做处理计算,如下:

computed: {

doneTodosCount () {

return this.$store.state.todos.filter(todo => todo.done).length

}

}

如果多个组件都要进行这样的处理,那么就要在多个组件中复制该函数。这样是很没有效率的事情,当这个处理过程更改了,还有在多个组件中进行同样的更改,这就更加不易于维护。

Vuex中getters对象,可以方便我们在store中做集中的处理。Getters接受state作为第一个参数:

const store = new Vuex.Store({

state: {

todos: [

{ id: 1, text: '...', done: true },

{ id: 2, text: '...', done: false }

]

},

getters: {

doneTodos: state => {

return state.todos.filter(todo => todo.done)

}

}

})

在Vue中通过store.getters对象调用:

computed: {

doneTodos () {

return this.$store.getters.doneTodos

}

}

Getter也可以接受其他getters作为第二个参数:

getters: {

doneTodos: state => {

return state.todos.filter(todo => todo.done)

},

doneTodosCount: (state, getters) => {

return getters.doneTodos.length

}

}

mapGetters辅助函数

与mapState类似,都能达到简化代码的效果。mapGetters辅助函数仅仅是将store中的getters映射到局部计算属性:

import { mapGetters } from 'vuex'

export default {

// ...

computed: {

// 使用对象展开运算符将 getters 混入 computed 对象中

...mapGetters([

'doneTodosCount',

'anotherGetter',

// ...

])

}

}

上面也可以写作:

computed: mapGetters([

'doneTodosCount',

'anotherGetter',

// ...

])

所以在Vue的computed计算属性中会存在两种辅助函数:

import { mapState, mapGetters } from 'vuex';

export default {

// ...

computed: {

...mapGetters([ ... ]),

...mapState([ ... ])

}

}

Mutations

之前也说过了,更改Vuex的store中的状态的唯一方法就是mutations。

每一个mutation都有一个事件类型type和一个回调函数handler。

调用mutation,需要通过store.commit方法调用mutation type:

store.commit('increment')

Payload 提交载荷

也可以向store.commit传入第二参数,也就是mutation的payload:

mutaion: {

increment (state, n) {

state.count += n;

}

}

store.commit('increment', 10);

单单传入一个n,可能并不能满足我们的业务需要,这时候我们可以选择传入一个payload对象:

mutation: {

increment (state, payload) {

state.totalPrice += payload.price + payload.count;

}

}

store.commit({

type: 'increment',

price: 10,

count: 8

})

mapMutations函数

不例外,mutations也有映射函数mapMutations,帮助我们简化代码,使用mapMutations辅助函数将组件中的methods映射为store.commit调用。

import { mapMutations } from 'vuex'

export default {

// ...

methods: {

...mapMutations([

'increment' // 映射 this.increment() 为 this.$store.commit('increment')

]),

...mapMutations({

add: 'increment' // 映射 this.add() 为 this.$store.commit('increment')

})

}

}

Actions

注 Mutations必须是同步函数。

如果我们需要异步操作和提交多个Mutations,Mutations就不能满足我们需求了,这时候我们就需要Actions了。

Actions

Action 类似于 mutation,不同在于:

Action 提交的是 mutation,而不是直接变更状态。

Action 可以包含任意异步操作。

让我们来注册一个简单的 action:

var store = new Vuex.Store({

state: {

count: 0

},

mutations: {

increment: function(state) {

state.count++;

}

},

actions: {

increment: function(store) {

store.commit('increment');

}

}

});

分发 Action

Action 函数接受一个与 store 实例具有相同方法和属性的 context 对象,因此你可以调用 context.commit 提交一个 mutation,或者通过 context.state 和 context.getters 来获取 state 和 getters。

分发 Action

Action 通过 store.dispatch 方法触发:

乍一眼看上去感觉多此一举,我们直接分发 mutation 岂不更方便?实际上并非如此,还记得 mutation必须同步执行这个限制么?Action就不受约束! 我们可以在 action 内部执行异步操作:

actions: {

incrementAsync ({ commit }) {

setTimeout(() => {

commit('increment')

}, 1000)

}

}

Actions 支持同样的载荷方式和对象方式进行分发:

// 以载荷形式分发

store.dispatch('incrementAsync', {

amount: 10

})

// 以对象形式分发

store.dispatch({

type: 'incrementAsync',

amount: 10

})

mapActions

同样地,action也有相对应的mapActions 辅助函数

mapActions

mapActions 辅助函数跟mapMutations一样都是组件的 methods 调用:

import { mapActions } from 'vuex'

export default {

// ...

methods: {

...mapActions([

'increment' // 映射 this.increment() 为 this.$store.dispatch('increment')

]),

...mapActions({

add: 'increment' // 映射 this.add() 为 this.$store.dispatch('increment')

})

}

}

mutation-types

关于mutation-types方面的讲解官方文档很少说明,但在实际的中大项目中,对==mutation-types==的配置是必不可少的,Vuex的文档只讲解了state,getters,mutation,actions四个核心概念,下面我简单补充下mutation-types的使用。

顾名思义,==mutation-types==其实就是mutation实例中各个方法的设定,一般要mutation方法前先在mutation-types用大写写法设定,再在mutation里引入使用,下面看看项目实际使用:

项目组织结构

0ecfa46bc8a3e54b692ac47e2c9dc5c5.png

在mutation-types定义好mutation的方法结构:

//SET_SINGER,SET_SONG 为mutation中要使用的方法名

export const SET_SINGER = 'SET_SINGER'

export const SET_SONG = 'SET_SONG'

在mutation中导入使用:

import * as types from ',/mutation-types.js'

const mutations = {

[types.SET_SINGER](state, singer) {

....

},

[types.SET_SONG](state, song) {

....

}

}

结语

看完上面对vuex的讲解相信你已经入门了,现在可以看看具体的项目加深理解,可以参考我的github一个购物车例子: https://github.com/osjj/vue-shopCart

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

本条技术文章来源于互联网,如果无意侵犯您的权益请点击此处反馈版权投诉

本文系统来源:php中文网

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/443201.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

php config(),php config

PHP 的安装由于php是一个zip文件(非install版),安装较为基本解压就行。把解压的 php5.2.1-Win32重命名为 php5。并复制到安装盘目录下。例如安装路径为 c:\php51 找到php目录下的 php.ini-dist或 php.ini.recommended文件,重命名为 php.ini,并复制到系统…

functions.php 在哪,functions.php常用函数

在设计WordPress主题时,在functions.php文件里添加一套通用的自定义函数将会大大提高开发效率,这样就不必每次开发主题时都需先查找然后复制同样的函数。这里记录一些常用的函数,方便以后使用!给头部添加feed链接WordPress2.8以后…

java基本数据类型存储,JAVA - 基本数据类型的存储空间长度

1.整型类型 存储需求 bit数 取值范围 备注byte 1字节 1*8 -128~127short 2字节 2*8 -32768~32767int 4字节 4*8 (-2的31次方到2的31次方-1)long 8字节 8*8 (-2的63次方到2的63次方-1) 长整型数值后缀为LJAVA 没有无符号类型JAVA中…

matlab回调函数,matlabGUI回调函数介绍.pptx

matlabGUI回调函数介绍GUI开发环境的常用工具与回调函数和GUI程序文件GUI开发常用工具1、控件面板2、对象对齐工具3、对象浏览器4、tab顺序编辑器5、属性编辑器6、菜单编辑器7、M文件编辑器回调函数回调函数是控件接收到用户的操作时调用的特定函数,每个回调函数都是…

余额交易查询 php,深圳通余额查询的API

深圳通余额查询的API,可以通过深圳通号码查询到余额及卡有效期等信息。 用到Domxpath和Curl两方面的知识。 源码已托管到github,另外要加载个类:myclass 项目地址:https://github.com/skiy/dev 演示:http://api.oupag.…

食饵捕食者模matlab,几类食饵-捕食者模型的定性分析和数值模拟

摘要:生态问题一直是人们普遍关注的问题,特别是生态问题中的食饵-捕食者模型,则处于举足轻重的位置。如何更有效的控制、调节生物种群,使之保持良性发展,则具有非常重要的生态意义和应用价值。解决这类问题的主要工具是种群动力学模型,解决的依据是数学的理论和方法…

数组填充php,php数组入门教程之数组填充

本文介绍下,有关php数组之数组填充的一个例子,有需要的朋友参考下。在php编程中,对数组元素进行填充,可以使用array_fill()函数。来看下面的例子,array_fill()函数——填充数组函数:";print_r ($array…

php在类定义一个我静态变量,php中静态类与静态变量用法的区别分析_PHP教程

php中静态类与静态变量用法的区别分析static是定义一个静态对象或静态变量,关于static 定义的变量或类方法有什么特性我们看完本文章的相关实例后就见分晓了.1. 创建对象$object new Class(),然后使用”->”调用:$object->attribute/function&…

matlab 排序点,matlab如何进行排序?

来自SORT的MATLAB文档&#xff1a;If A has complex entries r and s,sort orders them according to thefollowing rule: r appears before s insort(A) if either of the followinghold:abs(r) < abs(s)abs(r) abs(s) and angle(r) < angle(s)换言之&#xff0c;具有复…

matlab不同调制方式下性能比较,用不同调制方式实现跳/扩频混合通信的抗干扰性能...

论文写作指导&#xff1a;请加QQ229366758摘要&#xff1a;介绍了BPSK&#xff0c;QPSK&#xff0c;16PSK&#xff0c;FSK&#xff0c;MSK及GMSK 6种数字调制方式的特点&#xff0c;采用Matlab中的Simulink建立了各种调制方式实现DS/FH混合扩频系统的仿真模型。重点研究了跳/扩…

matlab cd参数,MATLAB变量参数列表​

默认值default value对于用户没有传递参数值时给函数进行自动赋给该参数的值​比如上述的例子中&#xff0c;阻尼系数&#xff0c;用户通常不清楚&#xff0c;可以由系统给出更为合适。怎么做到呢&#xff1f;​可以结合MATLAB的一个函数nargin&#xff0c;它能给出函数输入参数…

java 旋转方向,Java 2d方向鼠标点旋转

使用Graphics2D旋转方法确实是最简单的方法.这是一个简单的实现&#xff1a;int centerX width / 2;int centerY height / 2;double angle Math.atan2(centerY - mouseY, centerX - mouseX) - Math.PI / 2;((Graphics2D)g).rotate(angle, centerX, centerY);g.fillRect(...)…

基于matlab 的燃油喷雾图像处理方法,基于MATLAB的燃油喷雾图像处理方法.doc

基于MATLAB的燃油喷雾图像处理方法基于MATLAB的燃油喷雾图像处理方法摘要:提出了基于MATLAB的燃油喷雾图像处理方法。通过对喷雾图像的采集, 分割和滤波处理, 将多幅图像转换融合为一幅比较清楚的二值图像, 对拍摄的喷雾图像进行了去噪及二值化等初步处理, 并提取其轮廓图, 求取…

matlab声音信号时域频域转换,关于处理用采集卡采集到的声音时域信号转化成频域信号........

求助各位大神&#xff0c;我用麦克风通过采集卡采集到了一段声音数据&#xff0c;数据在附件里&#xff0c;矩阵中第一列为时间&#xff0c;第二列为采集到的声音的电压信号&#xff0c;采样频率为1万Hz&#xff0c;做出时域图和频域图的程序如下所示&#xff1a;clear;clc;loa…

win7和mysql乱码,windows本地mysql数据库存入中文乱码

windows本地mysql数据库存入中文乱码作者:PHPYuan 时间:2018-07-23 03:41:20出现的问题&#xff1a; 我这页面存中文到数据库会乱码 我打了断点 中文是传到后台dao层的 然后我试了下 把我本地项目连服务器数据库 保存不会乱码 我就怀疑是本地数据库有问题 然后我用navicat写了个…

毕业设计matlab在误差处理中的应用,毕业设计MATLAB在误差处理中的应用要点分析.doc...

毕业论文任务书院(系) 机械工程学院 专业班级 测控082级 学生姓名 马 魁一、毕业论文题目 MATLAB在误差理论中的应用二、毕业论文工作自______ ___年____ _月___ __日 起至____ _____年 月_____日止三、毕业论文进行地点: 陕西理工学院四、毕业论文内容要求&#xff1a;传统的数…

帝国cms 未审核 showinfo.php,帝国CMS批量修改文章未审核状态及批量修改上线时间...

帝国CMS批量修改审核文章未审核状态&#xff0c;批量自定义指定文件上线时间&#xff01;用法&#xff1a;后台增加自定义页面 PHP CODE:$infouptimeto_time(2016-06-12 10:50:19); //上线时间$sql$empire->query("select * from {$dbtbpre}ecms_".$class_r[2][…

php 完美防sql注入,PHP 完美的防XSS 防SQL注入的代码

PHP "完美"的防XSS 防SQL注入的代码function gjj($str){$farr array("/s/","/]*?)>/isU","/(]*)on[a-zA-Z]s*([^>]*>)/isU",);$str preg_replace($farr,"",$str);return addslashes($str);}function hg_input_b…

oracle 并行执行 杀掉会话,oracle – 为什么即使我禁用并行DML和并行DDL也会创建并行会话...

READ和WRITE并行性并不总是捆绑在一起.alter session disable parallel dml;仅禁用语句的WRITE部分的并行性. READ部分可能仍然并行运行.由于这是MERGE操作,因此并行提示请求读写并行写入.此外,并行提示覆盖alter session disable parallel query;,即使它不覆盖alter session d…

oracle临时表空间占用率过高,ORACLE 临时表空间使用率过高的原因及临时解决方案...

数据库temp临时表空间增大&#xff0c;一般在数据安装时设置临时表空间大小&#xff0c;默认的情况下都是设置为自动增长。这样会引起一个问题&#xff1a;在数据库使用中temp表空间会自动扩展的越来越大&#xff0c;造成磁盘空间使用不足。引起临时表空间增大主要使用在以下几…