首页 > 其他分享 >跨框架探索:React Redux 和 Vuex 对比分析快速掌握React Redux

跨框架探索:React Redux 和 Vuex 对比分析快速掌握React Redux

时间:2024-04-09 17:58:34浏览次数:16  
标签:count React state Redux Vuex store

React Redux 和 Vuex 都是前端状态管理库,分别用于 React 和 Vue.js 框架。
redux运行过程图
在这里插入图片描述

它们都提供了一套规范的状态管理机制,帮助开发者更好地组织和管理应用状态。下面是它们的一些异同点:

相同点:

  1. 中心化状态管理:两者都提供了一个全局的存储中心,使得组件间状态共享变得简单。
  2. 响应式:状态变更时,依赖于这些状态的所有组件都会自动更新。
  3. 调试工具:React Redux 和 Vuex 都有专门的开发者工具,方便调试。
  4. 社区和生态:两者都有强大的社区支持,提供了大量的中间件和插件。

不同点:

  1. 设计理念
    • React Redux 遵循 Flux 架构,强调单一数据源和单向数据流。
    • Vuex 更倾向于 Vue.js 的响应式特性和组件化思想,提供了更灵活的状态变更方式。
  2. API 使用
    • React Redux 需要使用 connect 函数将组件连接到 Redux store,同时使用 mapStateToPropsmapDispatchToProps 来指定组件如何从 store 中读取状态和分发动作。
    • Vuex 使用 store 实例直接在组件中分发动作和获取状态,通过 this.$store 在 Vue 组件中访问。
  3. 状态变更方式
    • React Redux 通过 dispatch 方法发送一个动作(action)到 store,由 reducer 根据动作类型更新状态。
    • Vuex 提供了 commitdispatch 两个方法,commit 用于提交一个变更(mutation),而 dispatch 用于分发一个动作(action)。Vuex 的 mutation 必须是同步的,而 action 可以包含任意异步操作。
  4. 模块化
    • React Redux 通过 combineReducers 将多个 reducer 合并成一个根 reducer,从而实现模块化。
    • Vuex 允许将 store 分割成模块(module),每个模块拥有自己的 state、mutation、action 和 getter。
  5. 辅助函数和中间件
    • React Redux 常用 redux-thunk 等中间件来处理异步逻辑。
    • Vuex 自身就支持异步操作的处理,并且有 mapStatemapGettersmapActionsmapMutations 等辅助函数简化模板代码。
  6. 与框架的集成度
    • React Redux 更像是 React 生态系统的一部分,与 React 的 Context API 紧密集成。
    • Vuex 深度集成到 Vue.js 中,例如使用 Vue 的响应式系统来跟踪状态变化。
      为了快速掌握 React Redux,你可以遵循以下步骤:
  7. 理解 Redux 基础概念:熟悉 Redux 的三个核心概念:store、action 和 reducer。
  8. 学习 React Redux API:掌握 connectProvidermapStateToPropsmapDispatchToProps 的使用。
  9. 实践:通过小项目来实践 React Redux 的使用,例如一个简单的 TODO 应用。
  10. 了解异步处理:学习如何使用 redux-thunkredux-saga 等中间件处理异步逻辑。
  11. 阅读文档和社区资源:官方文档是学习的好地方,同时也可以查看社区提供的教程和最佳实践。

React Redux 和 Vuex 各有特点,理解它们的设计理念和 API 使用方式,可以帮助你更好地应用它们于实际项目中。

下面是 React Redux 和 Vuex 的简单示例代码,用于展示如何在各自的框架中管理状态。

在这里插入图片描述

React Redux 示例(class组件)

首先,我们定义一个简单的 Redux store,包括一个 reducer 和一个 action。

// Redux 的 reducer
const counterReducer = (state = { count: 0 }, action) => {
  switch (action.type) {
    case 'INCREMENT':
      return { count: state.count + 1 };
    case 'DECREMENT':
      return { count: state.count - 1 };
    default:
      return state;
  }
};
// Redux 的 action creator
const increment = () => {
  return { type: 'INCREMENT' };
};
const decrement = () => {
  return { type: 'DECREMENT' };
};
// 创建 Redux store
const store = Redux.createStore(counterReducer);

然后,我们创建一个 React 组件,并通过 connect 函数将其连接到 Redux store。

// React 组件
class Counter extends React.Component {
  render() {
    const { count, increment, decrement } = this.props;
    return (
      <div>
        <button onClick={increment}>+</button>
        <span>{count}</span>
        <button onClick={decrement}>-</button>
      </div>
    );
  }
}
// 将 Redux state 和 action 映射到组件的 props
const mapStateToProps = (state) => {
  return {
    count: state.count
  };
};
const mapDispatchToProps = (dispatch) => {
  return {
    increment: () => dispatch(increment()),
    decrement: () => dispatch(decrement())
  };
};
// 连接 React 组件和 Redux store
const ConnectedCounter = connect(mapStateToProps, mapDispatchToProps)(Counter);

最后,我们使用 Provider 组件将 store 传递给整个应用程序。

ReactDOM.render(
  <Provider store={store}>
    <ConnectedCounter />
  </Provider>,
  document.getElementById('root')
);

React Redux 示例(函数式组件)

通常使用 Hooks 来与 Redux 进行交互。下面是一个使用 React Redux 的函数式组件示例,它展示了如何使用 useSelectoruseDispatch Hooks 来读取 Redux store 中的状态和分发 actions。
首先,我们定义一个简单的 Redux store,包括一个 reducer 和一些 actions。

// Redux 的 reducer
const counterReducer = (state = { count: 0 }, action) => {
  switch (action.type) {
    case 'INCREMENT':
      return { count: state.count + 1 };
    case 'DECREMENT':
      return { count: state.count - 1 };
    default:
      return state;
  }
};
// Redux 的 action creator
const increment = () => {
  return { type: 'INCREMENT' };
};
const decrement = () => {
  return { type: 'DECREMENT' };
};
// 创建 Redux store
const store = Redux.createStore(counterReducer);

然后,我们创建一个函数式组件,并使用 useSelectoruseDispatch Hooks。

// React 函数式组件
const Counter = () => {
  // 使用 useSelector Hook 来访问 Redux store 中的状态
  const count = useSelector(state => state.count);
  // 使用 useDispatch Hook 来获取 dispatch 函数
  const dispatch = useDispatch();
  // 组件渲染的内容
  return (
    <div>
      <button onClick={() => dispatch(increment())}>+</button>
      <span>{count}</span>
      <button onClick={() => dispatch(decrement())}>-</button>
    </div>
  );
};

最后,我们使用 Provider 组件将 store 传递给整个应用程序。

import { Provider } from 'react-redux';
ReactDOM.render(
  <Provider store={store}>
    <Counter />
  </Provider>,
  document.getElementById('root')
);

在这个示例中,useSelector Hook 用于从 Redux store 中选择出我们需要的部分状态,而 useDispatch Hook 用于获取 dispatch 函数,以便我们可以在组件中分发 actions。这样的函数式组件更加简洁,并且易于理解和使用。

Vuex 示例

首先,我们定义一个 Vuex store,包括 state、mutation 和 action。

// Vuex 的 store
const store = new Vuex.Store({
  state: {
    count: 0
  },
  mutations: {
    INCREMENT(state) {
      state.count++;
    },
    DECREMENT(state) {
      state.count--;
    }
  },
  actions: {
    increment({ commit }) {
      commit('INCREMENT');
    },
    decrement({ commit }) {
      commit('DECREMENT');
    }
  }
});

然后,我们创建一个 Vue 组件,并通过 this.$store 访问 Vuex store。

// Vue 组件
const Counter = {
  template: `
    <div>
      <button @click="increment">+</button>
      {{ count }}
      <button @click="decrement">-</button>
    </div>
  `,
  computed: {
    count() {
      return this.$store.state.count;
    }
  },
  methods: {
    increment() {
      this.$store.dispatch('increment');
    },
    decrement() {
      this.$store.dispatch('decrement');
    }
  }
};

最后,我们创建一个 Vue 实例,并将 Vuex store 作为选项传递。

new Vue({
  el: '#app',
  store,
  components: { Counter },
  template: `<Counter />`
});

这两个示例展示了如何在 React Redux 和 Vuex 中创建一个简单的计数器应用程序。在 React Redux 中,我们使用 connect 函数将 Redux store 的状态和分发动作映射到 React 组件的 props。而在 Vuex 中,我们直接在 Vue 组件中使用 this.$store 来访问状态和分发动作。

标签:count,React,state,Redux,Vuex,store
From: https://blog.csdn.net/sky6862/article/details/137557578

相关文章

  • react-redux 持久化
    1.安装 redux-persistnpminstallredux-persist 2.store/index.js文件import{configureStore,combineReducers}from"@reduxjs/toolkit";import{persistStore,persistReducer}from'redux-persist';importstoragefrom'redux-persis......
  • react 配置@别名
    1.安装craco工具npmi-D@craco/cracocraco是一个用于扩展CreateReactApp(CRA)的工具,CRA是一个用于快速搭建React应用的脚手架工具。CRA提供了一个简单的项目结构和配置,使得开发者可以快速开始一个React项目的开发。然而CRA的配置是被隐藏的,开发者无法对其进行自定......
  • JSX.Element 和 React.ElementType的区别是什么?
    在React和TypeScript中,JSX.Element和React.ElementType代表了两种不同的概念:JSX.Element:JSX.Element是一个类型,表示由JSX编译后生成的实际React元素对象。当你在React应用中使用JSX编写组件时,每一个JSX表达式都会编译为一个JSX.Element对象。例如:constMyComponent:React.......
  • react路由使用
    在介绍ReactRouter的概念以前,需要先区分两个概念:react-router:为React应用提供了路由的核心功能;react-router-dom:基于react-router,加入了在浏览器运行环境下的一些功能。1.安装(本文6.22.3版本)npmi react-router-dom -S2.创建router/index.jsimportGoo......
  • 前端【Vuex】【使用介绍】
    1、组件下载vue与vuex的版本对应关系: Vue2匹配的Vuex3 Vue3匹配的Vuex4Vuex是一个专为Vue.js应用程序开发的状态管理模式+库。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。官方网......
  • react ref和context
    ref获取domcontext类似provider和injected,用于嵌套很深的爷孙组件传值子组件使用父组件创建的context对象,不能自己创建context创建在函数组件和class组件都是一样的exportletContext1=React.createContext('')<Context1.Providervalue='Contextvalue函数组件'>......
  • react 函数组件和hook
    函数组件1.函数组件没有生命周期2.函数组件没有this3.函数组件通过hook完成各种操作4.函数组件本身就是render函数5.props在函数第一个参数解释useState参考https://www.cnblogs.com/ssszjh/p/14581014.htmlprops参考https://www.cnblogs.com/ssszjh/p/18118746生命周期......
  • react 性能问题和优化
    某个组件更新,子组件也会一起更新react更新采用时间切片,vue则是依赖收集执行更新操作为16ms,如果操过16ms,先暂停更新,让浏览器先渲染时间切片时间是16ms,因为人眼刷新率约60帧,60hz为16ms1.避免state改为同样的值(class用PureComponent,函数组件默认已经处理了)2.处理子组......
  • react 生命周期
    1.class组件初次挂载1.constructor2.getDerivedStateFromProps3.render4.componentDidMount 更新数据1.getDerivedStateFromProps2.shouldComponentUpdate3.render4.componentDidUpdate备注:1.PureComponent里不能写shouldComponentUpdate2.优化性能一般在shoul......
  • react中redux基本使用二
    1.action传参,用payload属性接收  <buttononClick={()=>dispatch(addNum(2))}>+2</button> 2.redux中异步操作,与同步类似,需要比同步多封装一个函数//使用RTK创建store,createSlice创建reducer的切片//使用RTK创建store,createSlice创建reducer的切片import......