iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >vuex的实现原理是什么
  • 843
分享到

vuex的实现原理是什么

2023-07-05 14:07:54 843人浏览 薄情痞子
摘要

本篇内容主要讲解“Vuex的实现原理是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“vuex的实现原理是什么”吧!关于vuex就不再赘述,简单回顾一下:当应用碰到多个组件共享状态时,简单的单

本篇内容主要讲解“Vuex的实现原理是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“vuex的实现原理是什么”吧!

关于vuex就不再赘述,简单回顾一下:当应用碰到多个组件共享状态时,简单的单向数据流很容易被破坏:第一,多个视图依赖于同一状态;第二,来自不同视图的行为需要变更同一状态。若解决前者使用传参的方式,则不适用于多层嵌套的组件以及兄弟组件;若解决后者使用父子组件直接引用或事件变更和同步状态的多份拷贝,则不利于代码维护。

所以,最好的办法是:把组件的共享状态抽取出,以一个全局单例模式管理!这也正是vuex背后的基本思想。

vuex的实现原理是什么

所以,vuex的大致框架如下:

class Store {    constructor() {        // state        // getters          // mutations        // actions    }    // commit    // dipatch}

接下来,就写写看。

一、创建vue项目

vue create vue2-vuex//创建vue2项目yarn add vuex@next --save//安装vuexyarn serve//启动项目

二、实现原理

1、State

(1)使用

//store.js// 仓库import Vue from 'vue'import Vuex from 'vuex'import extra from './extra.js'Vue.use(Vuex) //引入vuex的方式,说明Store需要install方法export default new Vuex.Store({    // 仓库数据源    state: {        count: 1,        dowhat: 'addCount'    },}
//app.vue<template>    <div class="testState">        <p>{{mycount}}</p>        <p>{{dowhat}}:{{count}}</p>    </div></template><script>export default {    import {        mapState    } from 'vuex'    // 推荐方式    computed: mapState()({        mycount: state => state.count    }),    // 推荐方式的简写方式    computed: {        // 解构的是getters        ...mapState(['count', 'dowhat'])    },  }</script>

(2)注意

由于 Vuex 的状态存储是响应式的,从 store 实例中读取状态最简单的方法就是在计算属性 中返回某个状态,这种模式导致组件依赖全局状态单例。在模块化的构建系统中,在每个需要使用 state 的组件中需要频繁地导入,并且在测试组件时需要模拟状态

Vuex 通过 store 选项,提供了一种机制将状态从根组件“注入”到每一个子组件中(需调用 Vue.use(Vuex)

(3)实现

所以除了Store内部的五大属性以外,还需要考虑插件的一个install方法,所以大致框架如下:

class Store {    constructor() {        // state        // getters          // mutations        // actions        //modules    }    // commit    // dipatch}let Vuex = {    Store,    Install}export default Vuex

所以,接下来就可以具体实现了,

class Store {    constructor(options) {        // state        this.state = options.state    }}let install = function(_Vue) {    _Vue.mixin({        beforeCreate() { //在组件创建之前自动调用,每个组件都有这个钩子            if (this.$options && this.$options.store) { //this.$options读取根组件                this.$store = this.$options.store            } else {                this.$store = this.$parent && this.$parent.$store            }        }    })}

然而,上述的state的实现有一个缺点:当改变数据的时候,state的数据不能动态的渲染。所以如何把state里的数据成为响应式成为关键问题?实际上,类似vue里的data,也可以通过这种方式让其成为响应式。那么就得从install方法中传入Vue,所以改变后:

let Vue=nullclass Store {    constructor(options) {        // state        this.vm = new _Vue({          data: {            state: options.state//data中的数据才是响应式          }        })    }      get state() {        return this.vm.state    }}let install = function(_Vue) {//用于Vue.use(plugin)    Vue=_Vue    _Vue.mixin({        onBeforeCreate() { //在组件创建之前自动调用,每个组件都有这个钩子            if (this.$options && this.$options.store) { //this.$options读取根组件                this.$store = this.$options.store            } else {                this.$store = this.$parent && this.$parent.$store            }        }    })}

2、getters

(1)使用

//store.jsexport default new Vuex.Store({    // 计算属性    getters: {        // 这里的函数不需要调用,可以直接使用,官方默认前面有get        getCount(state) {//接受 state 作为其第一个参数            return state.count * 100;        }    },}

(2)注意

有时候我们需要从 store 中的 state 中派生出一些状态(比如增加,删除,过滤等等),Vuex 允许我们在 store 中定义“getter”(可以认为是 store 的计算属性)。就像计算属性一样,getter 的返回值会根据它的依赖被缓存起来,且只有当它的依赖值发生了改变才会被重新计算,Getter 接受 state 作为其第一个参数,getter 在通过方法访问时,每次都会去进行调用,而不会缓存结果

(3)实现

 // getters    let getters = options.getters || {}    this.getters = {}    Object.keys(getters).forEach(getterName => {      Object.defineProperty(this.getters, getterName, {        get: () => {          return getters[getterName](this.state)        }      })    })

3、mutations

(1)使用

//store.jsexport default new Vuex.Store({        // 相当于methods    mutations: {        // mutations内部的函数,天生具备一个形参        add(state, n) {            state.count += n;        },        decrease(state, n) {            state.count -= n;        }    },}
methods: {            submit() {                console.log('success');            },            // 解构仓库mutations里面的方法,要啥解构啥            ...mapMutations(['add', 'decrease']),            // this.$store.commit('add'),                            ...mapActions(['addAction', 'decreaseAction']),            // this.addAction()调用actions里面的方法            // this.$store.dispatch('add'),}

(2)注意

更改 Vuex 的 store 中的状态的唯一方法是提交 mutation。Vuex 中的 mutation 类似于事件:每个 mutation 都有一个字符串事件类型 (type) 和 一个 回调函数 (handler) 。这个回调函数就是进行状态更改的地方,并且它会接受 state 作为第一个参数,不能直接调用一个 mutation handler。这个选项更像是事件注册:“当触发一个类型为 increment 的 mutation 时,调用此函数。”要唤醒一个 mutation handler,你需要以相应的 type 调用 store.commit 方法

可以向 store.commit 传入额外的参数,即 mutation 的 载荷(payload) ,在大多数情况下,载荷应该是一个对象,这样可以包含多个字段并且记录的 mutation 会更易读

(3)实现

   // mutations    let mutations = options.mutations || {}    this.mutations = {}    Object.keys(mutations).forEach(mutationName => {      this.mutations[mutationName] = (arg) => {//保证多个(第二个)参数的传入        mutations[mutationName](this.state, arg)      }    })        commit = (method, arg) => {//使用箭头函数改变被调用的this的指向        // console.log(this);        this.mutations[method](arg)  }

4、actions

(1)使用

//store.jsexport default new Vuex.Store({    actions: {        addAction(context) {            // 在这里调用add方法            context.commit('add', 10);        },        decreaseAction({            commit        }) {            commit('decreaseAction', 5)        }    },}

(2)注意

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

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

  • Action 函数接受一个与 store 实例具有相同方法和属性的 context 对象

  • Action 通过 store.dispatch 方法触发

  • Action 通常是异步的,store.dispatch 可以处理被触发的 action 的处理函数返回的 Promise,并且 store.dispatch 仍旧返回 Promise

  • 一个 store.dispatch 在不同模块中可以触发多个 action 函数。在这种情况下,只有当所有触发函数完成后,返回的 Promise 才会执行

(3)实现

    // actions    let actions = options.actions || {}    this.actions = {}    Object.keys(actions).forEach(actionName => {      this.actions[actionName] = (arg) => {        actions[actionName](this, arg)      }    })       dispatch=(method, arg) =>{    this.actions[method](arg)  }

5、modules

(1)使用

    // actions    let actions = options.actions || {}    this.actions = {}    Object.keys(actions).forEach(actionName => {      this.actions[actionName] = (arg) => {        actions[actionName](this, arg)      }    })       dispatch=(method, arg) =>{    this.actions[method](arg)  }
    //store.js    modules: {        extra: extra    }

(2)注意

  • 由于使用单一状态树,应用的所有状态会集中到一个比较大的对象。当应用变得非常复杂时,store 对象就有可能变得相当臃肿,Vuex 允许我们将 store 分割成模块(module) 。每个模块拥有自己的 state、mutation、action、getter、甚至是嵌套子模块——从上至下进行同样方式的分割

  • 对于模块内部的 mutation 和 getter,接收的第一个参数是模块的局部状态对象

  • 对于模块内部的 action,局部状态通过 context.state 暴露出来,根节点状态则为 context.rootState

  • 对于模块内部的 getter,根节点状态(rootState)会作为第三个参数暴露出来

三、整体代码

let Vue = null//全局的_Vueclass Store {  constructor (options) {    // state    //this.state = options.state 写法不完美,当改变数据的时候,不能动态的渲染,所以需要把data中的数据做成响应式的    this.vm = new _Vue({      data: {        state: options.state//data中的数据才是响应式      }    })    // getters    let getters = options.getters || {}    this.getters = {}    Object.keys(getters).forEach(getterName => {      Object.defineProperty(this.getters, getterName, {        get: () => {          return getters[getterName](this.state)        }      })    })    // mutations    let mutations = options.mutations || {}    this.mutations = {}    Object.keys(mutations).forEach(mutationName => {      this.mutations[mutationName] = (arg) => {//保证多个(第二个)参数的传入        mutations[mutationName](this.state, arg)      }    })    // actions    let actions = options.actions || {}    this.actions = {}    Object.keys(actions).forEach(actionName => {      this.actions[actionName] = (arg) => {        actions[actionName](this, arg)      }    })  }  dispatch=(method, arg) =>{    this.actions[method](arg)  }  commit = (method, arg) => {    // console.log(this);    this.mutations[method](arg)  }  get state() {    return this.vm.state  }}let install = function(_Vue) {  Vue = _Vue  Vue.mixin({    beforeCreate() {//在组件创建之前自动调用,每个组件都有这个钩子      if (this.$options && this.$options.store) {  // this.$options读取到根组件        this.$store = this.$options.store      } else { // //如果不是根组件的话,也把$store挂到上面,因为是树状组件        this.$store = this.$parent && this.$parent.$store      }    }  })}let Vuex = {  Store,  install}export default Vuex

到此,相信大家对“vuex的实现原理是什么”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

--结束END--

本文标题: vuex的实现原理是什么

本文链接: https://www.lsjlt.com/news/352255.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • vuex的实现原理是什么
    本篇内容主要讲解“vuex的实现原理是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“vuex的实现原理是什么”吧!关于vuex就不再赘述,简单回顾一下:当应用碰到多个组件共享状态时,简单的单...
    99+
    2023-07-05
  • vuex数据持久化的原理是什么
    Vuex数据持久化的原理是将Vuex存储在本地存储(localStorage)中,以便在页面刷新或关闭后仍能保留Vuex的状态。具体...
    99+
    2023-05-14
    vuex数据持久化 vuex
  • 深入了解vuex的实现原理
    当面试被问vuex的实现原理,你要怎么回答?下面本篇文章就来带大家深入了解一下vuex的实现原理,希望对大家有所帮助!关于vuex就不再赘述,简单回顾一下:当应用碰到多个组件共享状态时,简单的单向数据流很容易被破坏:第一,多个视图依赖于同一...
    99+
    2023-05-14
    javascript vuex
  • SSH的实现原理是什么
    本篇内容介绍了“SSH的实现原理是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!SSH是一种协议标准,它的主要目的是实现远程登录和提供安...
    99+
    2023-06-17
  • chatgpt的实现原理是什么
    本文小编为大家详细介绍“chatgpt的实现原理是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“chatgpt的实现原理是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。...
    99+
    2023-02-21
    chatgpt
  • CountDownLatch的实现原理是什么
    这篇文章主要讲解了“CountDownLatch的实现原理是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“CountDownLatch的实现原理是什么”吧! 前言CountDo...
    99+
    2023-06-15
  • Linux的实现原理是什么
    本篇内容主要讲解“Linux的实现原理是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Linux的实现原理是什么”吧!1 引言90年代以来,数控技术发展的一个重要趋势是数控系统的开放化。目前...
    99+
    2023-06-16
  • sync.Pool的实现原理是什么
    本篇内容主要讲解“sync.Pool的实现原理是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“sync.Pool的实现原理是什么”吧!sync.Pool实现原理对象的创建和销毁会消耗一定的系...
    99+
    2023-06-19
  • CAS的实现原理是什么
    本篇内容主要讲解“CAS的实现原理是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“CAS的实现原理是什么”吧!悲观锁与乐观锁悲观锁总是假设最坏的情况,线程a...
    99+
    2024-04-02
  • LongAdder的实现原理是什么
    LongAdder的实现原理是什么,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。AtomicLong的实现原理图:LongAdder是JDK8...
    99+
    2024-04-02
  • hooks的实现原理是什么
    Hooks是React 16.8版本引入的一种新特性,它可以让我们在不编写class的情况下使用state和其他React的特性。H...
    99+
    2023-10-10
    hooks
  • ConcurrentHashMap的实现原理是什么
    这篇文章将为大家详细讲解有关ConcurrentHashMap的实现原理是什么,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。1.HashTable与ConcurrentHashMap的对比H...
    99+
    2023-06-19
  • java原子类实现的原理是什么
    Java原子类的实现原理是利用了底层的CAS(Compare and Swap)操作。CAS是一种乐观锁机制,它包含三个参数:内存位...
    99+
    2023-10-18
    java
  • Docker exec的实现原理是什么
    本篇内容主要讲解“Docker exec的实现原理是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Docker exec的实现原理是什么”吧!我使用了 docker ex...
    99+
    2023-06-29
  • mysql driver的实现原理是什么
    MySQL驱动的实现原理是通过与MySQL数据库进行通信来实现与数据库的连接和操作。 具体来说,MySQL驱动使用Socket来与M...
    99+
    2024-04-09
    mysql
  • redis的hash实现原理是什么
    Redis的Hash实现原理是使用哈希表(Hash Table)来存储数据。哈希表是一种数据结构,可以快速、高效地查找和存储键值对。...
    99+
    2024-04-03
    redis
  • Java AQS的实现原理是什么
    这篇文章主要介绍“Java AQS的实现原理是什么”,在日常操作中,相信很多人在Java AQS的实现原理是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java AQS的实...
    99+
    2023-07-05
  • golang select的实现原理是什么
    在Go语言中,`select`语句用于从多个通道中接收数据,并且只有当其中一个通道可以接收数据时,`select`语句才会执行相应的...
    99+
    2023-10-27
    golang
  • java lock的实现原理是什么
    Java中的锁(Lock)是一种同步机制,用于控制多个线程对共享资源的访问。锁的主要作用是确保在同一时刻只有一个线程能够访问某个共享...
    99+
    2023-10-20
    java
  • NotificationCenter类的实现原理是什么
    这篇文章主要讲解了“NotificationCenter类的实现原理是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“NotificationCenter类的实现原理是什么”吧!正文Not...
    99+
    2023-07-05
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作