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简单但功能足够




















暂无评论内容