vuex知识点

Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式;集中存储管理应用的所有组件状态

  • 状态:什么是状态,我们可以通俗的理解为数据。Vue只关心视图层,那么视图的状态如何来确定?我们知道是通过数据驱动,这里的状态管理可以简单理解为管理数据。

  • 集中存储Vue只关心视图,那么我们需要一个仓库(Store)来存储数据,而且是所有的数据集中存储,视图和数据就可以分析。

  • 管理:除了存储,还可以管理数据,也就是计算、处理数据。

  • 所有组件状态:所用的组件共用一个仓库Store),也就是一个项目只有一个数据源(区分模块modules)。

  • 总结Vuex就是在一个项目中,提供唯一的管理数据源的仓库

Vuex将组件公用数据抽离,在一个公共仓库管理,使得各个组件容易获取(getter)数据,也容易设置数据(setter

Store
Store仓库里面放了很多对象。其中state就是数据源存放地,对应于与一般Vue对象里面的data(后面讲到的actionsmutations对应于methods)。
  • 在使用Vuex的时候通常会创建Store实例new Vuex.store({state,getters,mutations,actions})有很多子模块的时候还会使用到modules

  • 总结,Store类就是存储数据和管理数据方法的仓库,实现方式是将数据和方法以对象形式传入其实例中。要注意一个应用或是项目中只能存在一个Store实例!!

state
响应式存储state里面存放的数据是响应式的,Vue组件从store中读取数据,若是store中的数据发生改变,依赖这个数据的组件也会发生更新。(这里“状态”=“数据”),也就是是说数据和视图是同步的
  • 获取:在Vue组件中获取数据,最直接的可以通过计算属性中获取

  • 组件仍然可以保存局部状态:虽然说VuexStore仓库让我们同一管理数据变得更加方便,但是代码一多也会变得冗长,有些组件的数据是自己严格自用,我们可以将state放在组件自身,作为局部数据,专供此组件使用,其他的组件不能用。

  • mapState的作用是把全局的 state 和 getters 映射到当前组件的 computed 计算属性中,this.$store.state

  • 使用示例

 import {mapState} from 'vuex' export default {computer :mapState({count: state => state.count,'count' // 映射 this.count 为 store.state.count})
}

getters
Store仓库里,state就是用来存放数据,若是对数据进行处理输出,比如数据要过滤,一般我们可以写到computed中。但是如果很多组件都
使用这个过滤后的数据,比如饼状图组件和曲线图组件,我们是否可以把这个数据抽提出来共享?这就是getters存在的意义。
我们可以认为,【getters】是store的计算属性。
  • 定义:我们可以在store中定义getters,第一个参数是state

    const getters = {style:state => state.style}
  • 传参:定义的Getters会暴露为store.getters对象,也可以接受其他的getters作为第二个参数;

  • 使用:

    computed: {
    doneTodosCount () {return this.$store.getters.doneTodosCount}

mapGetters辅助函数仅仅是将store中的getters映射到局部计算属性中,用法和mapState类似


import { mapGetters } from 'vuex'
computed: {// 使用对象展开运算符将 getters 混入 computed 对象中...mapGetters(['doneTodosCount','anotherGetter',])}//给getter属性换名字mapGetters({// 映射 this.doneCount 为 store.getters.doneTodosCountdoneCount: 'doneTodosCount'
})

Mutations

  • getters是为了初步获取和简单处理state里面的数据(这里的简单处理不能改变 state里面的数据),Vue的视图是由数据驱动的,也就是说state里面的数据是动态变化的,那么怎么改变呢,切记在Vuexstore数据改变的唯一方法就是mutation

  • 通俗的理解mutations,里面装着一些改变数据方法的集合,这是Veux设计很重要的一点,就是把处理数据逻辑方法全部放在mutations里面,使得数据和视图分离。

使用方法如下
  • mutation结构:每一个mutation都有一个字符串类型事件类型(type)和回调函数(handler),也可以理解为{type:handler()},这和订阅发布有点类似。先注册事件,当触发响应类型的时候调用handker(),调用type的时候需要用到store.commit方法。

     const store = new Vuex.Store({state: {count: 1},mutations: {increment (state) {      //注册事件,type:increment,handler第一个参数是state;// 变更状态state.count++}}})store.commit('increment')   //调用type,触发handler(state
  • 载荷(payload):简单的理解就是往handler(stage)中传参handler(stage,pryload);一般是个对象。

      mutations: {increment (state, n) {state.count += n}}store.commit('increment', 10)
  • mutation-types:将常量放在单独的文件中,方便协作开发。

        // mutation-types.jsexport const SOME_MUTATION = 'SOME_MUTATION'// store.js
    import Vuex from 'vuex'
    import { SOME_MUTATION } from './mutation-types'const store = new Vuex.Store({state: { ... },mutations: {// 我们可以使用 ES2015 风格的计算属性命名功能来使用一个常量作为函数名[SOME_MUTATION] (state) {// mutate state}
    }
    })
  • commit:提交可以在组件中使用 this.$store.commit('xxx') 提交 mutation,或者使用 mapMutations 辅助函数将组件中的 methods 映射为 store.commit 调用(需要在根节点注入 store)。

    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

  • 背景:mutation中我们讲到,mutation中是存放处理数据的方法的集合,我们使用的时候需要commit。但是commit是同步函数,而且只能是同步执行。那我们想一步操作怎么办?

  • 作用:actions中提交mutation,并且可以包含任何的异步操作。actions可以理解为通过将mutations里面处里数据的方法变成可异步的处理数据的方法,简单的说就是异步操作数据(但是还是通过mutation来操作,因为只有它能操作)

怎么用actions:
  • 定义actions

    const store = new Vuex.Store({//创建store实例state: {count: 0},mutations: {                increment (state) {state.count++}},actions: {         //只是提交`commit`了`mutations`里面的方法。increment (context) {context.commit('increment')}}})一般我们会简写成这样actions: {increment ({ commit }) {commit('increment')}}
  • 分发actions

    store.dispatch('increment')
  • MapActions和MapState一级MapMutations类似。

Modules

  • 背景:VueState使用是单一状态树结构,应该的所有的状态都放在state里面,如果项目比较复杂,那state是一个很大的对象,store对象也将对变得非常大,难于管理。

  • module可以让每一个模块拥有自己的statemutationactiongetters,使得结构非常清晰,方便管理。

  • 一般结构

    const moduleA = {
      state: { ... },
      mutations: { ... },
      actions: { ... },
      getters: { ... }}
    const moduleB = {
      state: { ... },
      mutations: { ... },
      actions: { ... }}const store = new Vuex.Store({
      modules: {
        a: moduleA,
        b: moduleB})
  • 模块内部的数据:①内部state,模块内部的state是局部的,也就是模块私有的,比如是car.js模块state中的list数据,我们要通过this.$store.state.car.list获取;②内部gettermutationaction,仍然注册在全局命名空间内,这是为了多模块可以同时响应同一mutationthis.$store.state.car.carGetter的结果是undefined,而通过this.$store.state.carGetter则可以拿到。

  • 传参:getters====({state(局部状态),getters(全局getters对象),roosState(根状态)});actions====({state(局部状态),commit,roosState(根状态)}).



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

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

相关文章

[论文笔记]CVPR2017_Joint Detection and Identification Feature Learning for Person Search

Title: Joint Detection and Identification Feature Learning for Person Search; aXiv上该论文的第一个版本题目是 End-to-End Deep Learning for Person SearchAuthors: Tong Xiao1* ; Shuang Li1* ; Bochao Wang2 ; Liang Lin2; Xiaogang Wang1 Affilations: 1.The Chines…

.NetCore如何使用ImageSharp进行图片的生成

ImageSharp是对NetCore平台扩展的一个图像处理方案,以往网上的案例多以生成文字及画出简单图形、验证码等方式进行探讨和实践。 今天我分享一下所在公司项目的实际应用案例,导出微信二维码图片,圆形头像等等。 一、源码获取 Git项目地址&…

vue2工程

vue当然可以使用script标签引入,不需任何依赖即可按照vue的语法进行使用。但中大型商用项目中,还是建议使用工程化方式使用vue,vue提供了官方脚手架vue-cli,可以快速构建vue项目,脚手架会帮助开发者创建好建议的工程目…

【GamePlay】入门篇

【GamePlay】入门篇 游戏性编程是指通过一系列游戏系统将游戏想法变成现实的过程。 本次的简例以NPC设计为主。 通常在进行脚本设计前,对NPC的属性进行基本的添加和设定,诸如动画系统、物理系统等等。 1.动画系统 添加Animator组件,绑定骨骼。…

HttpHttps

http协议与https Http 客户端发送一个HTTP请求到服务器的请求消息包括以下格式: **请求行(request line)、请求头部(header)、空行 和请求数据四个部分组成。** Get请求例子,使用Charles抓取的request&…

vue2使用axios post跳坑,封装成模块

终于将vue-resource替换成axios了,其中像application/x-www-form-urlencoded发送的头信息以及返回的response结果这两点都需要注意一下。 其实https://github.com/mzabriskie/axios也有说明的。因为我在vue-resource中使用了Vue.http.options.emulateJSON true;&am…

并发与多线程

并发 并发(concurrency)是指CPU在某个时间段内交替处理多任务的能力。每个CPU不可能只顾着执行某个进程,而让其他进程一直等待被执行。所以,CPU把可执行时间均分成若干份,每个进程执行一份或多份时间后,记录…

synchronize原理

synchronized的三种应用方式 一. 修饰实例方法,作用于当前实例加锁,进入同步代码前要获得当前实例的锁。 二. 修饰静态方法,作用于当前类对象加锁,进入同步代码前要获得当前类对象的锁。 三. 修饰代码块,指定加锁对象&…

不能修改“System Roots”钥匙串

iOS mac添加证书 不能修改“System Roots”钥匙串错误 如图: 解决方式: 打开钥匙串---登录---,直接把证书拖过来 然后,查看--我的证书,里面,找到证书,即可

未来产品的设计

Donald A. Norman继《情感化设计》之后,又一设计精品力作: 未来产品的设计样章试读及本书预定:http://www.china-pub.com/195642市场价 :¥39.00 会员价 : ¥29.25(75折) 【作  者】(美)Donald…

css之字体图标

SVG与字体图标 SVG图片是矢量图片,不会随着图片的伸缩而影响质量,通常把只有一种颜色的图标做成SVG,通过SVG生成字体图标,放到项目中使用。 https://icomoon.io/是一个比较快捷的生成字体图标的线上工具,进入主页后&…

研发阶段模拟接口数据

因为在vue-cli工程中需要创建很多.vue文件,我们希望创建vue文件和创建html、css、js文件一样右键即可选择创建,并且创建的文件中可预先写好模板代码。 webstorm-Preferences打开选项界面 选择File and Code Templates,点击绿色加号 填…

真实项目中 ThreadLocal 的妙用

一、什么是 ThreadLocal ThreadLocal 提供了线程的局部变量,每个线程都可以通过 set() 和 get() 来对这个局部变量进行操作,但不会和其他线程的局部变量冲突,实现了线程间的据隔离。 简单讲:一个获取用户的请求线程 A,…

css之flex布局

flex布局是css3中的重要布局方式,称为“弹性布局”,每次想到它主要是遇到元素垂直居中、元素宽高自适应的问题,这些问题在flex中都能过简单设置就解决,它更像是原生APP中的布局操作,布局不必写N多的盒模型代码来实现&a…

javascript对URL中的参数进行简单加密处理

javascript的api本来就支持Base64,因此我们可以很方便的来进行编码和解码。 var encodeData window.btoa("namexiaoming&age10")//编码 var decodeData window.atob(encodeData)//解码。 下面来个具体的例子来说明如何对url中参数进行转码&#xff…

HTML元素title里面如何换行

在调试代码的时候我就遇到一个问题,HTML元素title里面通常只显示一行,那我想要他换行,就是多行显示,如何实现?JS代码里面比如Alert里面又该如何换行? 经过我的一番实验 要实现这种效果有几种方法&#xff0…

div内图片和文字水平垂直居中

大小不固定的图片、多行文字的水平垂直居中 本文综述 想必写css的都知道如何让单行文字在高度固定的容器内垂直居中,但是您知道或者想过让行数不固定的文字在高度固定的容器内垂直居中呢?本文将会告诉你如何实现多行文字的垂直居中显示。 关于图片垂直居…

敏友的【敏捷个人】有感(3): 有感于“敏捷个人”讨论与练习

2010年我对个人管理进行了自己的一些思考,在2011年提出敏捷个人概念,并且在线上、线下进行了多次交流,在一些大会上也做过分享。现在,已经有很 多IT和非IT的敏友们知道并在践行敏捷个人,帮助自己更快的成长。我收到大家…

jQuery编写插件

引言: 在项目中不同页面经常要用到已经写好的交互,比如弹窗,比如下拉菜单,比如选项卡,比如删除... 此时如果每次都把代码copy一份无疑是一件比较麻烦并且无趣的事情,而且个人认为有些low了,我们…

webstorm中nodejs代码提示

preferences->languages&frameworks->Node.js and Npm中选择一个本地的node版本 preferences->languages&frameworks->JavaScript->Libraries 勾选node.js Core 回到代码