Redux vs Vuex

Redux与Vuex原理及区别比较

⭐ 核心原理对比

Redux原理

// Redux核心实现原理简化版
function createStore(reducer, initialState) {
            
  let state = initialState;
  const listeners = [];
  
  function getState() {
            
    return state;
  }
  
  function dispatch(action) {
            
    state = reducer(state, action);
    listeners.forEach(listener => listener());
    return action;
  }
  
  function subscribe(listener) {
            
    listeners.push(listener);
    return function unsubscribe() {
            
      const index = listeners.indexOf(listener);
      listeners.splice(index, 1);
    };
  }
  
  // 初始化state树
  dispatch({
             type: '@@redux/INIT' });
  
  return {
             getState, dispatch, subscribe };
}

Vuex原理

// Vuex核心实现原理简化版
class Store {
            
  constructor(options) {
            
    this.state = reactive(options.state || {
            });
    this.mutations = options.mutations || {
            };
    this.actions = options.actions || {
            };
    this.getters = {
            };
    
    // 初始化getters
    if (options.getters) {
            
      Object.keys(options.getters).forEach(key => {
            
        Object.defineProperty(this.getters, key, {
            
          get: () => options.getters[key](this.state)
        });
      });
    }
  }
  
  commit(type, payload) {
            
    if (!this.mutations[type]) {
            
      console.warn(`Unknown mutation type: ${
              type}`);
      return;
    }
    this.mutations[type](this.state, payload);
  }
  
  dispatch(type, payload) {
            
    if (!this.actions[type]) {
            
      console.warn(`Unknown action type: ${
              type}`);
      return Promise.resolve();
    }
    return this.actions[type](
      {
             state: this.state, commit: this.commit.bind(this) },
      payload
    );
  }
}

🌟 核心概念对比表

特性 Redux Vuex
状态存储 单一store 单一store
状态修改 通过reducer纯函数 通过mutation方法
核心原则 不可变数据 可变数据(Vue响应式)
异步处理 中间件(如redux-thunk) Actions内置支持
组织结构 扁平结构+combineReducers 模块化内置支持
工作流程 action → reducer → state action → mutation → state
与框架绑定 框架无关 与Vue紧密绑定
数据响应原理 手动订阅机制 Vue响应式系统

数据流向对比

💡 代码示例对比

Redux代码示例

// 定义reducer
const counterReducer = (state = {
              count: 0 }, action) => {
            
  switch (action.type) {
            
    case 'INCREMENT':
      return {
             ...state, count: state.count + 1 };
    case 'DECREMENT':
      return {
             ...state, count: state.count - 1 };
    default:
      return state;
  }
};

// 创建store
const store = createStore(counterReducer);

// 定义action creator
const increment = () => ({
             type: 'INCREMENT' });
const decrement = () => ({
             type: 'DECREMENT' });

// 使用
store.dispatch(increment());
console.log(store.getState()); // { count: 1 }

// 组件中使用 (以React为例)
function Counter() {
            
  const count = useSelector(state => state.count);
  const dispatch = useDispatch();
  
  return (
    <div>
      <span>{
            count}</span>
      <button onClick={
            () => dispatch(increment())}>+</button>
      <button onClick={
            () => dispatch(decrement())}>-</button>
    </div>
  );
}

Vuex代码示例

// 创建store
const store = new Vuex.Store({
            
  state: {
            
    count: 0
  },
  mutations: {
            
    increment(state) {
            
      state.count++;
    },
    decrement(state) {
            
      state.count--;
    }
  },
  actions: {
            
    increment({
              commit }) {
            
      commit('increment');
    },
    asyncIncrement({
              commit }) {
            
      setTimeout(() => {
            
        commit('increment');
      }, 1000);
    }
  }
});

// 组件中使用
export default {
            
  computed: {
            
    count() {
            
      return this.$store.state.count;
    }
  },
  methods: {
            
    increment() {
            
      this.$store.commit('increment');
    },
    asyncIncrement() {
            
      this.$store.dispatch('asyncIncrement');
    }
  }
};

🔍 工作原理深度对比

Redux工作原理

Redux基于Flux架构思想,采用严格的单向数据流,通过纯函数reducer处理action,返回全新的state对象。它使用不可变数据(Immutability)作为核心原则,每次更新都创建新的状态树。

Vuex工作原理

Vuex利用Vue的响应式系统,当mutation修改state时,Vue能检测到这些变化并高效更新视图。Vuex中的state是可变的,直接修改属性即可触发视图更新。

📊 区别分析

1. 设计理念与哲学

Redux: 基于函数式编程理念,强调不可变性(Immutability)、纯函数和单一数据源
Vuex: 基于Vue响应式系统设计,强调易用性和与Vue深度集成

2. 状态更新机制

Redux: 每次更新返回全新状态(state),不直接修改原状态
Vuex: 直接修改状态(state),依赖Vue的响应式系统跟踪变化

3. 中间件与插件系统

Redux: 强大的中间件系统,可以控制action和reducer之间的数据流
Vuex: 插件系统相对简单,主要用于响应状态变化和持久化

4. 异步处理方式

Redux: 需要额外中间件(redux-thunk, redux-saga等)处理异步
Vuex: 内置actions概念,自然支持异步操作

5. 模块化支持

Redux: 通过combineReducers组合多个reducer
Vuex: 内置命名空间模块系统,支持嵌套模块

适用场景比较

📚 总结

Redux 强调不可变数据和纯函数,提供严格的数据流控制,适合大型React应用和跨框架使用

Vuex 依赖Vue响应式系统,更易用且与Vue深度集成,有更简洁的API和内置的异步支持

核心区别:

数据处理: Redux用新对象替换旧状态,Vuex直接修改状态
框架耦合: Redux框架无关,Vuex专为Vue设计
复杂度: Redux概念更”纯粹”但使用复杂,Vuex更易学易用
扩展性: Redux中间件生态更丰富,Vuex简单但功能足够

© 版权声明
THE END
如果内容对您有所帮助,就支持一下吧!
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容