Vuex与Redux比较

news/2024/11/15 17:22:29/文章来源:https://www.cnblogs.com/wpshan/p/18548327

由于Vuex和Redux都是从Flux中衍生出来,同时Vuex对Redux部分思想也有一些借鉴,所以Vuex和Redux有很多相同点。很多资料也有介绍两者的对比,但大部分讲解的比较抽象,较难理解。笔者整理两者异同点,同时配有标准案例进行说明。注意本文不是科普vuex和redux相关概念,相关知识内容可以在官方文档中查看。Vuex (opens new window)Redux(opens new window)

  1. 异同点

    • 相同点

      • state 共享数据
      • 流程一致:定义全局state,触发,修改state
      • 原理相似,通过全局注入store。
    • 不同点

      • 从实现原理上来说:
        • Redux 使用的是不可变数据,而Vuex的数据是可变的。Redux每次都是用新的state替换旧的state,而Vuex是直接修改
        • Redux 在检测数据变化的时候,是通过 diff 的方式比较差异的,而Vuex其实和Vue的原理一样,是通过 getter/setter来比较的
      • 从表现层来说:
        • vuex定义了state、getter、mutation、action四个对象;redux定义了state、reducer、action
          • vuexstate统一存放,方便理解;reduxstate依赖所有reducer的初始值
          • vuexgetter,目的是快捷得到state;redux没有这层,react-redux mapStateToProps参数做了这个工作。
          • vuexmutation只是单纯赋值(很浅的一层);reduxreducer只是单纯设置新state(很浅的一层)。他俩作用类似,但书写方式不同
          • vuexaction有较为复杂的异步ajax请求;redux中action中可简单可复杂,简单就直接发送数据对象({type:xxx, your-data}),复杂需要调用异步ajax(依赖redux-thunk插件)。
        • vuex触发方式有两种commit同步和dispatch异步;redux同步和异步都使用dispatch

    详细解释

    • Vuex

      • 类型
        • state: 共享数据
        • getter: 快捷state
        • mutation: 同步更新,只是简单都赋值
        • action: 异步更新,可以调用commit来触发同步mutation
      • 触发
        • commit 触发mutation同步操作
        • dispatch 触发action异步操作
      • 库结合(自带)
        • mapState
        • mapGetters
        • mapMutations
        • mapActions
      • 其他
        • UI跟state、action/dispatch相关
        • mutations 同步修改state。UI触发使用commit指令
        • action 内可以commit同步state或dispatch异步另外一个action。UI触发使用dispatch指令
    • Redux

      • 类型
        • store: 合并所有reducer,共享数据
        • reducer: 两个作用:1. 初始值合并获得state 2. 简单的赋值,获取新的state代替老的state
        • action: 触发函数。是唯一可以带上数据修改state的触发对象。接下逻辑就转移到reducer中

        注:也可以反过来理解:Vuex的每一次this.$store.commit('type', data) === action(data){ return { type, data}})

      • 触发 (依赖react-redux)
        • dispatch触发同步或异步。使用mapDispatchToProps参数
      • 库结合(依赖react-redux)
        • mapStateToProps
        • mapDispatchToProps

    简单理解,reducer承担了state和mutations功能。 Vuex中commit-mutations是唯一修改state的方式;Redux中dispatch-reducer是唯一修改state方式

    Vuex典型案例

    // vuex非常简单易懂,而且整理到1个文件即可
    const state: IState = {login: false,option: {_id: '',sub_title: '',title: '',keyword: '',descript: '',url: '',email: '',icp: ''}
    }const actions: ActionTree<IState, any> = {// 登录async login ({ commit }, user: StoreState.Login): Promise<Ajax.AjaxResponse> {commit('USER_LOGINING')const res: Ajax.AjaxResponse = await service.login({ ...user })commit('USER_LOGINING_FINAL')return res},
    }const mutations: MutationTree<IState> = {'USER_LOGINING' (state: IState): void {state.login = true},'USER_LOGINING_FINAL' (state: IState): void {state.login = false},
    }export default new Vuex.Store({state,actions,mutations,modules
    })
    

    Redux典型案例

    // store.js
    import { createStore, combineReducers, applyMiddleware } from 'redux'
    import home from './home/reducer'
    import demo from './demo/reducer'
    import thunk from 'redux-thunk'// reducers获得初始state
    let store = createStore(combineReducers({ home, demo }), applyMiddleware(thunk))export default store
    
    // reducer.js
    let defaultState = {demoList: []
    }export default (state = defaultState, action) => {switch (action.type) {case 'setDemoList':return { ...state, demoList: action.list }default:return state}
    }
    
    // action.js
    // 同步action
    export const setDemoList = list => ({type: 'setDemoList',list
    })// 异步action
    export const setAsyncList = () => {return async dispatch => {let result = await API.getXXX()dispatch({type: 'setAsyncList', result})}
    }
    
    // ui
    const mapStateToProps = (state) => {return {list: state.demo.demoList}
    }// const mapDispatchToProps = (dispatch) => {
    //     return {
    //         setDemoList: list => dispatch(setDemoList(list))
    //     }
    // }
    // or
    const mapDispatchToProps = {setDemoList}export default connect(mapStateToProps, mapDispatchToProps)(Demo)
    

    总结

    • vuex的流向:
      1. view——>commit——>mutations——>state变化——>view变化(同步操作)
      2. view——>dispatch——>actions——>mutations——>state变化——>view变化(异步操作)
    • redux的流向:view——>actions——>reducer——>state变化——>view变化(同步异步一样)

    参考文章

    • Redux vs. Vuex(opens new window)
    • How Vuex compares to redux for Managing State Object(opens new window)
    • Redux & 与vuex的对比

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

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

相关文章

第6篇 Scrum 冲刺博客

作业要求这个作业属于哪个课程 计科34班这个作业的要求在哪里 团队作业4——项目冲刺这个作业的目标 1.站立式会议2.发布项目燃尽图3.每人的代码/文档签入记录4.适当的项目程序/模块的最新(运行)截图5.每日每人总结会议照片昨日已完成的工作/今天计划完成的工作成员 昨天已完…

RabbitMQ 五种模式

RabbitMQ是一种常用的消息队列服务,它提供了五种消息模型:简单模型、工作队列模型、发布/订阅模型、路由模型、主题模型。1. 简单模型(Simple Message Queue,简称SQS):一个生产者,一个消费者,一个队列。 2. 工作队列模型(Work Queue):多个消费者共同处理一个队列中的…

如何防止手机被远程控制,安全远控推荐ToDesk

随着电子设备及各样应用的兴起,手机可以为人们带来的便利已越来越多,从二十年前的联络通话,到现如今的社交娱乐、导航、缴费等;通过智能手机中的软件均可轻松实现。 然而虽然手机的妙用有很多,但对于一些不太善用电子设备的中老年亲友来说,在使用中却也存在一定的被诈骗风…

Docker不再神秘 ------Ubuntu20.04 安装Docker 及实用技巧,建议收藏

Dockerdocker是一种容器,简而言之就是别人把一堆环境配置好了,你可以下载下来直接拿来使用(我的个人理解),有点像虚拟机你知道吧。比如下面这样,我直接打开了一个小电脑(docker),里面桌面啊、root啊全都有,跟你ubuntu系统类似,单说细节还不完全一样,毕竟它轻便哈哈…

SELF-REFINE: Iterative Refinement with Self-Feedback

1. 概述 基于给定的Prompt,大语言模型生成的Reponse可能不是最好的(这一点我认为当前的LLM大部分都是Decoder架构,基于已生成的结果产生下一个Token,一旦之前生成结果出错,也不容易及时改正。)。 本文为原始的生成添加了额外的反思重写步骤,过程如下:对于给定的\(Input…

基于stm32的bacnet协议

bacnet协议对于国内网站来说,几乎可以说资料为零,通俗大论一遍,具体操作方法屁都没说 先从工具说起 开发工具 BACnetScan:(讯绕提供)(工具1) 链接:https://pan.baidu.com/s/1TJxc0xaEsCT3lJOlG78B7w 提取码:t7bw Yabe:(工具2) 链接:https://pan.baidu.com/s/1jfs…

未能加载文件或程序集 “项目名称对应的程序集,Version=1.0.0.0.culture=neutral.PublicKeyToken=null或它的某一个依赖项。系统找不到指定的文件。

Visual Studio 2022, AutoCAD开发, wpf项目, 因viewmodel中代码出现问题, 造成窗体设计器中无法预览(这个问题通过修改viewmodel代码解决), 删除项目路径下的obj及bin文件夹后, 重新生成项目, 出现新的错误:窗体能够显示了, 但个别控件无法正常显示, 以为是visual …

.Net Core关于项目引用和命名空间导入的一个小坑

.Net Core关于项目引用和命名空间导入的一个小坑 一、.Net Core项目嵌套引用的情况 经笔者测试验证,发现对于一个.Net Core项目Root,其引用另一个.Net Core项目Root.SubA后,Root项目会自动将Root.SubA项目引用的子项目,也纳入其引用项目池中,而无需再手动引用这些子项目。…

考研打卡(18)

开局(18) 开始时间 2024-11-15 16:36:35 结束时间 2024-11-15 16:53:39等会去打剧本杀数据结构1 以下________排序算法的最坏时间复杂度可以做到O(nlog(n))(暨南大学 2010年) A 归并排序 B 快速排序 C 冒泡排序 D 插入排序A 答案归并排序:基于分治的思想,其时间…

前端Git规范

AI前端Git规范 Git分支命名master:主分支,负责记录上线版本的迭代,该分支代码与线上代码是完全一致的。 develop:开发分支,该分支记录相对稳定的版本,所有的feature分支和bugfix分支都从该分支创建。其它分支为短期分支,其完成功能开发之后需要删除 feature/*:特性(功…

DNS批量解析管理软件有什么用

在复杂的网络环境中,DNS批量解析管理软件犹如一把功能强大的钥匙,开启了高效网络管理的大门,为网络运营和维护带来了诸多便利。 1、对于网络服务提供商而言,DNS批量解析管理软件极大地提高了工作效率 传统的DNS解析管理方式在处理大量域名时,往往需要逐个进行设置和调整,…

163邮箱发送邮件通知异常 org.springframework.mail.MailAuthenticationException: Authentication failed

从腾讯企业邮箱切换成163邮箱,邮箱配置经过检查未作调整,网络检查均是正常,但发送邮件时一直报错org.springframework.mail.MailAuthenticationException: Authentication failed。 解决办法: 1.检查smtp服务是否打开(若未打开需要开启)2.客户端授权码需打开3.检查邮箱配…