IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> JavaScript知识库 -> React+TypeScript如何使用Redux -> 正文阅读

[JavaScript知识库]React+TypeScript如何使用Redux

记录一下React+TypeScript如何使用redux

一、截至本篇文章发布依赖均为最新版本,版本号如下

"@types/react": "^17.0.37",
"@types/react-dom": "^17.0.11",
"@types/react-redux": "^7.1.20",
"react": "^17.0.2",
"react-dom": "^17.0.2",
"react-redux": "^7.2.6",
"react-router-dom": "^6.0.2",
"react-scripts": "4.0.3",
"redux": "^4.1.2",
"redux-devtools-extension": "^2.13.9",
"typescript": "^4.1.2",

二、初始化redux

本文主要记录redux使用react+ts环境搭建可参照其他文章

1、安装依赖

yarn add redux react-redux @types/react-redux redux-devtools-extension

2、新建目录结构如下

store目录结构

3、store代码如下

  • store入口文件 /store/index.ts
import { applyMiddleware, createStore } from "redux";
import { composeWithDevTools } from "redux-devtools-extension";  /*  使用redux调试工具  */
import reducers from "./reducers";

export type rootState = ReturnType<typeof reducers>;
const store = createStore(reducers, composeWithDevTools(applyMiddleware()));
export default store;

  • reducer入口文件 /store/reducers/index.ts
import { combineReducers } from "redux";
import user from "./user";
export default combineReducers({ user });
  • user模块reducer /store/reducers/user.ts
export interface IUser {
  id: string;
  name: string;
  role: string;
}

export interface IUserState {
  user: IUser;
}

const initUserState: IUserState = {
  /* state默认值 */
  user: {
    id: "default",
    name: "普通用户",
    role: "user",
  },
};

export enum IUserActionType {
  /* Actions */
  INIT,
  CHANGE,
}

const user = (
  state: IUserState = initUserState,
  action: { type: IUserActionType; payload: any }
) => {
  const { payload } = action;
  switch (action.type) {
    case IUserActionType.INIT:
      return state;
    case IUserActionType.CHANGE:
      return { ...state, user: { ...state.user, ...payload } };
    default:
      return state;
  }
};

export default user;

4、在项目入口文件index.tsx内注入store

import React from 'react';
import ReactDOM from 'react-dom';
import '@/assets/styles/default.less';
import App from './App';
import reportWebVitals from './reportWebVitals';

import { Provider } from 'react-redux';   /*  redux使用  */
import store from './store';  /*  redux使用  */

ReactDOM.render(
  <Provider store={store}>  /*  redux使用  */
    <React.StrictMode>
      <App />
    </React.StrictMode>
  </Provider>,
  document.getElementById('root')
);

reportWebVitals();

三、在组件中使用

  • action最好提取到统一文件内方便复用,本文为方便演示未提取

1、在类组件中使用

/* 类组件使用redux */

import React, { Component } from 'react'
import { connect } from 'react-redux'
import { Dispatch } from 'redux'
import { rootState } from '@/store'
import { IUser, IUserActionType } from '@/store/reducers/user'

interface IProps {
  user: IUser
  changeName?: (name: string) => void
}

class ClassComp extends Component<IProps> {
  protected handleChangeName(name: string) {
    this.props.changeName && this.props.changeName(name)
  }
  render() {
    const { name } = this.props.user
    return (
      <div>
        {name}
        <br />
        <button onClick={() => { this.handleChangeName("张三") }}>ClassComp改变名字</button>
      </div>
    )
  }
}

const mapStateToProps = (state: rootState) => {
  return { ...state.user }
}

const mapDispatchToProps = (dispatch: Dispatch) => ({
  changeName: (name: string) => {
    dispatch({
      type: IUserActionType.CHANGE,
      payload: { name }
    })
  }
})

export default connect(mapStateToProps, mapDispatchToProps)(ClassComp)

2、在函数式组件中使用

/* 函数式组件使用redux */

import React from 'react'
import { connect } from 'react-redux'
import { Dispatch } from 'redux'
import { rootState } from '@/store'
import { IUser, IUserActionType } from '@/store/reducers/user'

interface IProps {
  user: IUser
  changeName?: (name: string) => void
}

function FnComp(props: IProps) {
  const { user: { name }, changeName } = props
  const handleChangeName = (name: string) => {
    changeName && changeName(name)
  }
  return (
    <div>
      {name}
      <br />
      <button onClick={() => { handleChangeName("李四") }}>FnComp改变名字</button>
    </div>
  )
}

const mapStateToProps = (state: rootState) => {
  return { ...state.user }
}

const mapDispatchToProps = (dispatch: Dispatch) => ({
  changeName: (name: string) => {
    dispatch({
      type: IUserActionType.CHANGE,
      payload: { name }
    })
  }
})

export default connect(mapStateToProps, mapDispatchToProps)(FnComp)

3、配合Hook使用

/* Hook使用redux */

import React from 'react'
import { useDispatch, useSelector } from 'react-redux'
import { rootState } from '@/store/index'
import { IUserState, IUserActionType } from '@/store/reducers/user'

export default function HookComp() {
  const { user } = useSelector<rootState, IUserState>((state) => state.user)
  const dispatch = useDispatch()
  const handleChangeName = (name: string) => {
    dispatch({
      type: IUserActionType.CHANGE,
      payload: { name }
    })
  }
  return (
    <div>
      {user.name}
      <br />
      <button onClick={() => { handleChangeName("王五") }}>HookComp改变名字</button>
    </div>
  )
}

  JavaScript知识库 最新文章
ES6的相关知识点
react 函数式组件 & react其他一些总结
Vue基础超详细
前端JS也可以连点成线(Vue中运用 AntVG6)
Vue事件处理的基本使用
Vue后台项目的记录 (一)
前后端分离vue跨域,devServer配置proxy代理
TypeScript
初识vuex
vue项目安装包指令收集
上一篇文章      下一篇文章      查看所有文章
加:2021-12-05 11:57:28  更:2021-12-05 11:59:50 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 7:25:43-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码