首页 > 其他分享 >Vuex与Redux比较

Vuex与Redux比较

时间:2024-11-15 17:07:38浏览次数:1  
标签:redux dispatch state action Redux Vuex 比较

由于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,dispatch,state,action,Redux,Vuex,比较
From: https://www.cnblogs.com/wpshan/p/18548327

相关文章

  • Redis 持久化方式详解:RDB 与 AOF 的比较与应用
    Redis作为一个高性能的内存数据库,为了确保在系统断电、重启等不可控情况下不丢失数据,提供了多种持久化方式。Redis持久化的主要目的是将内存中的数据保存到磁盘中,保证即使服务发生故障,数据也可以通过持久化文件恢复。Redis提供了两种主要的持久化机制:RDB(RedisDatabase)和......
  • 快速排序和归并排序的比较
    基本原理比较快速排序:基于分治策略。它选择一个基准元素(pivot),通过一趟排序将待排序序列分割成两部分,其中左边部分的元素都小于等于基准元素,右边部分的元素都大于等于基准元素。然后对这两部分分别进行快速排序,递归地重复这个过程,直到整个序列有序。例如,对于序列[4,7,......
  • 比较器-Comparable和Comparator
    Comparable是排序接口;若一个类实现了Comparable接口,就意味着“该类支持排序”。可以使用Arrays.sort()对改类进行排序1.Comparable接口使用场景:假如说我们有这样一个需求,需要设计一个Person类,有两个属性:姓名(name)、年龄(age),按照年龄的大小进行排序,那么实现可以这样注意:publiccl......
  • 电线、硬铜线和铜丝线是常见的电气连接和传导材料,它们在结构、用途、性能等方面有所不
    硬铜线与铜丝线的对比表格:特点硬铜线铜丝线材质纯铜(未经过退火处理)由多根细铜丝编织而成柔韧性较差,硬且不容易弯曲较好,具有较好的弯曲能力导电性良好,铜的导电性优异良好,铜的导电性优异抗拉强度高,适合高负载和长距离传输较低,柔性较好但抗拉强度差耐......
  • 探索jQuery与原生JavaScript:事件绑定的比较
    探索jQuery与原生JavaScript:事件绑定的比较在现代网页开发中,事件处理是实现用户交互的关键部分。开发者可以选择使用原生JavaScript或jQuery来绑定事件。本文将通过一个简单的示例,比较这两种方法在事件绑定上的不同,并探讨它们的优缺点。事件绑定基础事件绑定是将事件监听......
  • Java中2个Integer比较相同的4种方式
    Java中2个Integer比较相同的4种方式概要使用前切记Integer的范围是【-128~127】例如:Integera=128;Integerb=128;1,使用==比较【-128~127】区间内返回true,否则返回false//==比较if(a==b){System.out.println("a,b使用==比较返回结果:true");......
  • excel 字符比较函数
    ‌在Excel中,用于字符比较的函数主要有以下几种‌:‌EXACT函数‌:用于比较两个文本字符串是否完全相同,包括大小写。如果两个字符串完全相同(包括大小写),则返回TRUE;否则返回FALSE。例如,=EXACT("ABC","abc")的结果为FALSE,而=EXACT("ABC","ABC")的结果为TRUE‌12。‌FIND函数‌:用......
  • 2024年CRM系统全球排名:国内外十大品牌深度比较
    当前,国内外CRM系统市场呈现出百花齐放的景象。种类繁多的CRM系统满足了不同企业的多样化需求。在国外,CRM系统发展较早且较为成熟。其发展历程经历了数据库营销时代、联系管理软件时代、自动化销售力支持系统时代、全方位CRM系统时代以及云计算和移动技术时代。国外市场上的......
  • 如何系统的从0到1学习大模型?相关书籍及课程那些比较好?非常详细收藏我这一篇就够了!
    大模型这个概念我是从去年这时候才了解到的,在不知道大模型之前,我甚至以为chatGPT和大模型就是同一个东西,是可以划等号的。直到国内的AI产品一茬又一茬的冒出来,我才在使用的过程中逐渐对大模型这个概念有了认识。而大模型是一个广泛的概念,涵盖了所有参数众多、能够执行复杂任......
  • 【MQTT】代理服务比较RabbitMQ、Mosquitto 和 EMQX
    前言目前要处理大量设备同时频繁发送数据的情况,MQTT协议确实是一个更优的选择,因为它特别适合需要低带宽和高效能的物联网应用,下面是对目前主流协议的对比数据截止日期:2024年11月10日基础设施后端:springcloud项目设备端:IOT设备,每秒上报数据对比项特性RabbitMQMosqui......