【手撕Vuex】 - 手撕Vuex - 实现actions方法

发布于:2024-10-24 编辑:匿名 来源:网络

前言经过上一章的介绍,实现mutations的功能已经完成,那么本文将实现actions的功能。在这篇文章中,我将首先介绍actions的作用,然后介绍实现思路,最后实现代码。

actions的作用是异步修改共享数据。如何异步修改呢?这时候我们回到Vue的官方Vuex文档。

有一张图如下: 从图中可以看到,我们调用组件中的dispatch方法,然后dispatch方法会调用actions,然后actions中的方法可以通过commit调用mutations中的方法。最后,mutations中的方法会修改state中的数据。

这就是动作的作用。回顾动作这里我们首先回顾一下如何使用动作,然后再次实现它们。

发布官方Vuex注解,在store中定义age,在mutations中定义changeAge方法,在actions中定义asyncAddAge方法(页面通过dispatch调用actions中的方法,actions中的方法通过commit调用mutations中的方法) 。以上是我的原创首先,接下来我们来实现一下代码。

我这里直接贴代码了。代码中有详细的注释。

代码如下: 代码语言:text 复制 1.跳过 2.定义agestate: {age: 0} 3.在mutations/**中定义changeAge方法 * 通过dispatch调用 * @param state 仓库的状态 * @ param Payload load */addAge(state, Payload) { state.age += Payload;} 4.在actions/**中定义asyncAddAge方法 * 通过dispatch调用 * @param commit 提交 * @param Payload Payload */asyncAddAge({ commit}, Payload) { // 模拟异步操作 setTimeout(() => { // 通过commit调用mutations中的方法 commit('addAge', Payload); }, ); }通过组件中的dispatch调用actions中的方法(HelloWorld组件) 代码语言:文本复制 // 显示数据

{{ this.$store.state.age }}

// 调用actions中的方法 myFn() { this.$store.dispatch('asyncAddAge', 10);},npm runserve启动项目,点击按钮,后面会出现age 3秒 数值加10表示动作功能已实现。效果如下: 代码实现到此结束。

审核完成后,我们就可以开始实现actions的功能了。actions的实现思路和mutations是一样的。

首先,注释掉官方的Vuex并导入我们自己的Nuex: 代码语言:javascript copy import Vuex from './Nuex'// import Vuex from 'vuex' return 在我们的Nuex文件中,我们像以前一样将操作保存到Store中。我这里有一个单独的 initActions 方法。

代码如下: 代码语言:javascript copy // 将传递过来的action放到Store上 this.initActions(options ); initActions 方法的实现如下: 代码语言:javascript copy initActions(options) { // 1. 获取传入的动作 let actions = options.actions || {}; // 2. 向 Store 属性添加一个操作 this.actions = {}; // 3. 将传入的actions中的方法添加到当前Store的actions中 for (let key in actions) { this.actions[key] = (payload) => {//4. 执行actions中的方法,并且将当前 Store 实例传递给 actions[key](this, Payload);这里的实现思路和mutations是一样的,只不过将mutations替换为action,然后将传入的action中的方法添加到当前Store的action中。最后,执行actions中的方法并传递当前的Store实例。

测试是否已经添加到Store中,运行项目,测试结果如下:可以看到actions已经添加到Store中,然后页面通过dispatch调用actions中的方法,所以我们需要在Store Method上添加dispatch,代码如下: 代码语言:javascript copydispatch = (type, payload) => { this.actions[type](payload);} 这里的实现思路是一样的作为mutations,只不过commit换成了actions,然后传入的actions中的方法就会被执行,并且会传递当前的Store实例。运行项目,测试结果如下: Uncaught TypeError: Cannot readproperties of undefined (reading 'mutations') 这里报错。

其实我已经知道错误在哪里了。我先带大家看一下调用流程,然后再解决。

这个问题。在组件中调用dispatch方法时,我传递了'asyncAddAge', 10。

在dispatch方法中,我获取了传入的类型,为'asyncAddAge',payload为10,然后在actions中调用了该方法。在该方法中,我获取了传入的payload,即10。

在asyncAddAge方法中,我调用了commit方法,这意味着在mutations中调用该方法。在commit方法中,我拿到了传入的类型,即'addAge',payload为10,然后调用mutations中的方法,这里报错,因为在commit方法中,我拿到了传入的类型,即 'addAge',代码继续执行,直到 this.mutations[type](payload);这是未定义的,因此会报告错误。

正是因为在actions中的方法中,我调用了commit方法,也就是我调用了mutations中的方法。调用的时候没有告诉commit方法这是谁,所以就报错了。

那么如何解决这个问题呢?其实很简单。只需要将之前的commit方式改为箭头函数即可。

因为改成了箭头函数,所以this就是当前的Store实例(如果改成箭头函数当前定义的地方,this就是它)。代码如下: 代码语言:javascript copy commit = (type, payload) => { this.mutations[type](payload);} 运行项目,测试结果如下: 至此,actions的功能已实施。

接下来,我们来回顾一下实施情况。想法。

摘要:将传入的操作放在 Store 上。在 Store 上添加调度方法。

在dispatch方法中,调用actions中的方法。在actions的方法中,调用commit方法。

在commit方法中,调用mutations中的方法(来吧。

【手撕Vuex】 - 手撕Vuex - 实现actions方法

站长声明

版权声明:本文内容由互联网用户自发贡献,本站不拥有所有权,不承担相关法律责任。如果发现本站有涉嫌抄袭的内容,欢迎发送邮件 举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。

标签:

相关文章

  • “华辰芯光”完成过亿元A1轮融资,和创资本领投

    “华辰芯光”完成过亿元A1轮融资,和创资本领投

    据投资界(ID:pedaily)12月4日消息,据36氪无锡报道,光通信和激光雷达芯片提供商华辰芯??光半导体科技有限公司(以下简称“华辰芯光”)完成超亿元A1轮融资。 本轮融资由和创资本领投,赛智伯乐、富春资本等机构跟投。 融资资金将主要用于芯片产能扩张。 华辰芯光成立于今

    06-18

  • 优布科技获数千万Pre-A轮融资,深度向服装供应链上下游延伸

    优布科技获数千万Pre-A轮融资,深度向服装供应链上下游延伸

    投资圈(ID:pedaily)据5月9日消息,优布数字科技印花服装供应链科技公司,宣布完成Pre-A轮数千万元融资,本轮投资方为九合创投。 据介绍,本轮融资后,优布将进一步加大了一站式快速反应供应链的投入,并已开始下一轮融资。 据了解,优布今年10月宣布获得数千万天使轮融资。

    06-18

  • 微波速冻食品品牌“福迪宝”获数千万元天使轮融资

    微波速冻食品品牌“福迪宝”获数千万元天使轮融资

    投资圈(微信ID:pedaily)1月29日报道,微波速冻食品品牌“福迪宝”获数千万元天使轮融资人民币天使轮融资。 明镜创投独家投资。 本轮融资将用于品牌建设、团队建设、私域和渠道建设等。 福迪宝成立于今年6月,定位为微波速冻食品品牌。 以微波速冻饺子进入市场。 未来还将拓

    06-17

  • 7个要点,3步,过年回家给父母选一部好手机

    7个要点,3步,过年回家给父母选一部好手机

    每隔几年,给父母换手机就会提上日程,不卡顿,大屏,国产的,应该不会太贵,拿出来也应该有尊严……虽然我父母不像年轻人那么懂手机,但是他们对手机的需求还是很大的。 如何选择一款适合自己的手机,成为了孩子们头疼的问题。 懒人目录 亲爱的朋友们,您给父母选了什么手机

    06-21

  • 【融资24小时】2023年2月8日投融资事件汇总及详情

    【融资24小时】2023年2月8日投融资事件汇总及详情

    今日国内市场共发生24起投资披露事件,其中先进制造6起(温州航天动力、中芯热诚、广信科技) 、尊信智能、乐客VR、实德科技),医疗健康案例6个(宁丹新药、和美药业、九医医疗、华源再生医学、智速科技、星辰海医疗),企业服务5个案例(瑞迅电子、集兆嘉GCN、微电子)刷集

    06-18

  • 奥博资本新的亚洲基金已完成8亿美元的募资,诺辉、医渡、亘喜今年成功上市

    奥博资本新的亚洲基金已完成8亿美元的募资,诺辉、医渡、亘喜今年成功上市

    全球最大专注生物医药领域的投资机构奥博资本近日完成了新亚洲基金的募资规模为8亿美元。 值得一提的是,奥博资本今年3月向美国证券交易委员会(SEC)提交的文件显示,其拟募资规模为7.5亿美元。 换句话说,奥秘资本的新基金获得了比预期更多的承诺资本。 听,中小企业反馈平

    06-18

  • 西部资本在陕西推出新基金

    西部资本在陕西推出新基金

    投资界(ID:pedaily)消息,2020年4月25日,西部优势资本投资有限公司(简称“西部资本”)与陕西省政府投资引导基金、西安方元基金管理有限公司共同投资设立“陕西黄陵秦创原西征方圆投资基金合伙企业(有限合伙)”(以下简称“基金”或“本基金”)黄陵县国有资本投资运营

    06-17

  • 国雄资本有限公司设立区块链基金,初始规模5000万元人民币,

    国雄资本有限公司设立区块链基金,初始规模5000万元人民币,

    国雄资本有限公司宣布设立区块链基金,初始规模为1万元人民币。 该基金重点探索和投资区块链的理论和技术,以及数字资产交易、数字金融、网络安全、供应链等领域的相关初创和成长期企业,并为其提供资金、技术、资源等综合服务。 定向支持。

    06-18

  • 首次发布 -存储与计算一体化芯片公司智存科技获2亿元B1轮融资,领航新界领投

    首次发布 -存储与计算一体化芯片公司智存科技获2亿元B1轮融资,领航新界领投

    本轮融资由领航新界领投,天堂硅谷、瑞芯投资、老字号跟投股东科大讯飞、青岛港商、普华资本、科宇盛达基金将继续投资。

    06-17

  • 国金证券回复“京东将收购公司股权”

    国金证券回复“京东将收购公司股权”

    今天下午,有消息称,京东正在洽谈收购国金证券部分或全部股权,收购金额最高可达15亿美元。 对此,国金证券给予人士的回复是:“一切以公司公告为准”。 (每日经济新闻)听,中小企业反馈平台。 倾听用户需求,倾听创业者声音,解决中小企业痛点。 点击立即参与调查并获得礼

    06-18

  • 技术源于中科院、清华大学,梦之墨完成近亿元B1轮融资

    技术源于中科院、清华大学,梦之墨完成近亿元B1轮融资

    近日,液态金属电路3D打印机开发商梦之墨宣布完成B1轮融资近亿元,由中芯聚源领投。 Sunshine Fusion Capital也参与了投资。 据了解,本轮融资将主要用于市场复制拓展、人才队伍扩充、规模化生产线建设等,全力推进自主创新柔性电子增材制造技术的研发及产业化进程。 梦之墨技

    06-18

  • 天猫双11销售额15小时达到912亿,超过2015年全天

    天猫双11销售额15小时达到912亿,超过2015年全天

    10日晚,天猫双11销售额持续上涨。 截至11日下午3点19分左右,15小时19分后,销售额破亿,超过双11全天。 同时,根据支付宝公布的数据,009分39秒,支付宝支付峰值达到每秒12万笔,是去年的1.4倍。 支付宝移动支付量达到92%,支付方式从PC端向移动端发生了巨大变化。 此外,在

    06-18