redux

redux是什么

中文文档

  • redux是一个专门用于做状态管理的JS库(不是react 插件库)。
  • 可以用在react,angular,vue等项目中,但是基本与react配合使用。
  • 作用:集中式管理react应用中多个组件共享的状态。

    redux工作流流程

    怎么用:view 调用 store 的 dispatch 接收 action 传入 store,reducer 进行 state 操作,view 通过 store 提供的 getState 获取最新的数据
    缺点: state必须由父组件传过来,子组件相关数据更新,父组件会强渲
    image.png

image.png

案例:

安装:

yarn add redux react-redux redux-thunk

redux 构建redux架构
react-redux react自己的插件,简化react应用中使用redux(用户数据划分 数据—> 用户|商品|管理等)
redux-thunk 异步数据交互[处理前后端交互]

打造redux中的store

项目目录/src/创建store/index.ts

  1. // 文件名或者叫models。 用于打造redux构成之一:store
  2. import { createStore, applyMiddleware } from 'redux'
  3. import rootReducer from '../reducers'
  4. import thunk from 'redux-thunk'
  5. // const store=createStore(rootReducer,中件件执行函数)
  6. const store = createStore(rootReducer, applyMiddleware(thunk))
  7. export default store
  • createstore()
    • 作用:创建包含指定 reducerstore 对象
  • applyMiddleware()
    • 作用:应用上基于redux的中间件(插件库)

打造rootReducer

项目目录/src/创建reducers/index.ts

  1. // 打造rootReducer
  2. import{combineReducers} from 'redux'
  3. import homeReducer from './homeReducer'
  4. // 作用:合并多个reducer函数
  5. // rootReducer 统一一处管理项目中的所有reducer
  6. const rootReducer=combineReducers({
  7. // 数据名:reducer
  8. home:homeReducer
  9. })
  10. export default rootReducer
  • combineReducers()
    • 作用:合并多个reducer函数

项目目录/src/reducers/homeReducer.ts

  1. // homeReducer 就是home相关的所有数据都在这里
  2. // 作用:初始化状态,加工状态
  3. // todo、1初始话数据
  4. const initState = {
  5. hotList: [],
  6. classicList:[]
  7. }
  8. // reducer本质是一个函数,接受State,action,返回加工后的状态
  9. // reducer被第一调用时,是store自动触发的,传递的State是undefined
  10. const homeReducer = (state = initState, action: {
  11. type: string,
  12. payload: {
  13. [key: string]: any
  14. }
  15. }) => {
  16. /*
  17. state就是状态,也就是数据
  18. action是一个对象,是由actionCreators发送过来的动作
  19. reducer 一定有返回值 返回一个新的state,因为state不可更改,所以返回新状态一定是state的拷贝
  20. */
  21. switch (action.type) {
  22. case 'GET_HOT_LIST':
  23. // 获取hot的数据
  24. return { ...state, hotList: action.payload.data.content }
  25. case 'GET_CLASSIC':
  26. return{...state,classicList:action.payload.data.content}
  27. default:
  28. return { ...state }
  29. }
  30. }
  31. export default homeReducer

链接通信

项目目录index.tsx

  1. import。。。
  2. // 使用跨组件通信的方法将store中的数据通信给所有的组件
  3. import { Provider } from 'react-redux'
  4. import store from './store'
  5. ReactDOM.render(
  6. <Provider store={store}>
  7. <App />
  8. </Provider>,
  9. document.getElementById('root')
  10. 。。。
  • Provider让所有组件都可以得到state数据

组件中使用

  1. import React,{useEffect} from 'react'
  2. // 组件需要通过调用一个叫做connect的函数,他的返回值是一个的高阶组件来获取store中的数据
  3. // 用于包装 UI 组件生成容器组件
  4. import { connect } from 'react-redux'
  5. // 激活方法
  6. import homeActions from '../../actions/homeActions'
  7. import {bindActionCreators} from 'redux'
  8. interface P{
  9. hotList:{[key:string]:any}[]
  10. getHotList:(params:{cid:number})=>any
  11. }
  12. function Hot(props:P) {
  13. console.log(props)
  14. const {hotList, getHotList}=props;
  15. useEffect(()=>{
  16. getHotList({
  17. cid:17
  18. })
  19. },[])
  20. return (
  21. <>
  22. Hot <hr />
  23. <ul>
  24. {
  25. hotList && hotList.map(item=><li key={item.id}>
  26. <p>{item.title}</p>
  27. </li>)
  28. }
  29. </ul>
  30. </>
  31. )
  32. }
  33. export default connect((state:{home:{ }}) => {
  34. console.log('state', state) // state是整个应用的所以数据,里面的home指的是划分出来的home数据
  35. return state.home
  36. }, (dispatch) => {
  37. return bindActionCreators(homeActions,dispatch)
  38. })(Hot)
  39. /*
  40. connect 有两个参数,
  41. 第一个参数用于获取store中的state的
  42. 将外部的数据(即state对象)转换为UI组件的标签属性
  43. 第二个参数用于获取redux中的actionCreators中创建动作的方法
  44. 将分发action的函数转换为UI组件的标签属性
  45. */
  • connect
    • 用于包装UI组件生成容器组件

Line34打印结果
image.png
react-redux的connect用法详解
image.png

  • bindActionCreators()
    • 作用是将单个或多个ActionCreator转化为dispatch(action)的函数集合形式。

开发者不用再手动dispatch(actionCreator(type)),而是可以直接调用方法.
可以实现简化书写,减轻开发的负担。

发送请求

项目目录/src/service/index.ts

  1. // 提前书写数据请求
  2. export const fetchHotListReq = (params: { cid: number }) => {
  3. return new Promise((resolve, reject) => {
  4. fetch(`http://59.110.226.77:3000/api/list/hot?cid=${params.cid}`)
  5. .then(data => data.json())
  6. .then(res => {
  7. resolve(res)
  8. })
  9. .catch(error => reject(error))
  10. })
  11. }
  12. export const fetchClassicReq =(params:{cid:number})=>{
  13. return new Promise((resolve,reject)=>{
  14. fetch(`http://59.110.226.77:3000/api/list/sell?cid=${params.cid}`)
  15. .then(data=>data.json())
  16. .then(res=>{
  17. resolve(res)
  18. })
  19. .catch(error=>reject(error))
  20. })
  21. }

创建动作对象Actioncreates

项目目录/src/actions/homeActions.ts

  1. // 书写home的所有action create
  2. import { Dispatch } from 'redux' // 类型声明
  3. import * as service from '../service'
  4. const homeActions = {
  5. getHotList(params: { cid: number }) {
  6. // 发送异步数据请求
  7. return async (dispatch: Dispatch) => {
  8. // result就是数据请求结果
  9. const result = await service.fetchHotListReq(params)
  10. // 将result发送给reducer
  11. dispatch({
  12. type: 'GET_HOT_LIST', //动作类型,用产量表示,我们将方法名大写
  13. payload: result
  14. })
  15. }
  16. },
  17. getClassic(params: { cid: number }) {
  18. return async (dispatch: Dispatch) => {
  19. const result = await service.fetchClassicReq(params)
  20. dispatch({
  21. type: 'GET_CLASSIC',
  22. payload: result
  23. })
  24. }
  25. }
  26. }
  27. export default homeActions