Redux入门与小案例

这篇博客详细介绍了Redux的基础知识,包括Redux的工作流程、安装步骤和如何在React项目中集成Redux。通过一个实际的案例,展示了创建Action、Reducer、Store的过程,以及如何使用Provider和connect方法连接React组件。此外,还讲解了在Redux中使用装饰器的方法,并提到了Redux调试工具的安装和使用。
摘要由CSDN通过智能技术生成

目录

Redux基础

Redux介绍

Redux工作流

Redux安装

Redux集成(React)

案例应用

1.创建相应的文件夹

2. Action模块内容

3. Reducer内容

4. store内容

5.使用Provider作为项目根组件 index.tsx

6. 将react组件与redux连接

redux中使用装饰器

Redux调试工具


Redux基础

Redux介绍

  • 单向数据流:从父组件流向子组件,兄弟组件无法共享数据
  • State:React中的状态,是只读对象(Redux中),不可直接修改
  • Reducer:基本函数,用于对State的业务处理
  • Action:普通对象,用于描述事件行为,改变State

Redux工作流

Component(UI)被触发 --> Action --dispatch>Reducer(数据的处理和封装返回新的状态) --->store(数据源存储状态)  --->更新 Component(UI)

Redux安装

   redux  --save

   react-redux --save

Redux集成(React)

  •  创建 Action模块
  •  创建Reducer模块
  •  创建Store模块
  • 通过connect方法将React组件和Redux连接起来
  • 通过Provider作为项目的跟组件,用于数据的存储

案例应用

    场景,切换导航条后将相应的导航名,显示到内容区

1.创建相应的文件夹

2. Action模块内容

// Action类型

//存放Action类型
export const type={
    SWITCH_MENU:'SWITCH_MENU'
}
//Action创建函数
export const switchMenu=(menuName:string)=>{
    return{
        type:type.SWITCH_MENU,
        menuName
    }
}

3. Reducer内容

/**
 * Reducer 描述如何更新state
 */
import {type} from './../action'
const initalState={
    menuName:'首页'
}
export default (state=initalState,action:any)=>{
 switch(action){
     case type.SWITCH_MENU:
        return{
            ...state,
            menuName:action.menuName
        }
        break;
    default:
        return state
 }
}

4. store内容

import { createStore } from 'redux';

import reducer from './../reducer'

//redux 调试工具
import {composeWithDevTools} from 'redux-devtools-extension'

export default ()=>createStore(reducer,composeWithDevTools());

5.使用Provider作为项目根组件 index.tsx

import { Provider } from 'react-redux';
import configStore from './redux/store'
import * as serviceWorker from './serviceWorker';

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

6. 将react组件与redux连接

         6.1 dispatch(派发)

//你的组件
const NavLeft=()=>{
   ... 省略
  const handleMenuClick=(obj:any)=>{
    const {item}=obj
    const {dispatch}=props;
    //派发
    dispatch(switchMenu(item.props.title));
  
  }
 return (
    <>
      <div className="logo">
        <img src={logo} alt="logo" />
        <h1>playground</h1>
      </div>
      <Menu
      onClick={(item)=>handleMenuClick(item)}
      selectedKeys={selectedkeys}
      mode="vertical" theme="dark">
        {menu}
      </Menu>
    </>   
}

//将组件和redux连接
export default connect()(NavLeft);

         6.2 接受改变的props

const Header = (props:any) => {
  return (
    <div className="header">
     {props.menuName}
    </div>
  )
}

//取出status
const mapStateToProps = (state: any) => {
  console.log('state',state);
  return { menuName: state.menuName }
}
//关联
export default connect(mapStateToProps)(Header)

redux中装饰器

     1. 弹出配置

                     npm run eject

     2. 安装 插件

 安装babel插件  npm install @babel/plugin-proposal-decorators

     3. 配置插件 (package.json中)

"babel": {
  "presets": [
    "react-app"
  ],
  "plugins": [
    [
      "@babel/plugin-proposal-decorators"
    ]
  ]
},

     4. 修改代码

@connect(
//属性放到props中
state=>({menuName: state.menuName}),
//方法放到props中 
)
const Header = (props:any) => {
  return (
    <div className="header">
     {props.menuName}
    </div>
  )
}

export default Header

Redux调试工具

 1. 谷歌开发者工具  安装 Redux Devtools扩展(通过安装谷歌访问助手或者爬墙)

 2. 项目中安装: yarn add redux-devtools-extension

源码地址:https://github.com/cc7gs/shared-ofo  查看日志 redux nav 可以看到本章所有源码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值