React+Typescript项目环境中搭建并使用redux环境

2023-09-17 22:53:33

前几篇文章 我们的项目已经开始功能渐渐完善了
那么 我们来说最后一个点 redux
这个并不需要我们多努力 其实官方文档给到已经算是很全面了

我们可以直接访问地址 TypeScript 中文手册中文手册和官方是一样的 而且对我们非常友好
我们会在左侧导航栏中找到一个 React 点进去
在这里插入图片描述
进入之后 一直往下翻 我们就可以看到 Redux 部分
在这里插入图片描述
我们直接 用他这个命令去项目终端安装就好了 下面也讲述了为什么不需要单独再去导入Redux了
在这里插入图片描述
我们这里在项目终端去引入
在这里插入图片描述
这里需要注意一下版本哦 反正 我发现 react开发 除了文档不是特别健全之外 每个版本改动都还是不小的 经常出现 一个版本提升 就写法完全不一样了的事
在这里插入图片描述
我们在项目src目录下创建一个文件夹 叫 types
下面创建一个 index.tsx
参考代码如下

export interface IStoreState {
    languageName: string;
    enthusiasmLevel: number;
}

就是简单导出了一个接口 接口限制要有两个字段 languageName 字符串类型 enthusiasmlevel 数字类型

我们在项目src目录创建一个文件夹 叫 constants
下面创建一个 index.tsx文件
参考代码如下

export const INCREMENT_ENTHUSIASM = 'INCREMENT_ENTHUSIASM';
export type INCREMENT_ENTHUSIASM = typeof INCREMENT_ENTHUSIASM;
export const DECREMENT_ENTHUSIASM = 'DECREMENT_ENTHUSIASM';
export type DECREMENT_ENTHUSIASM = typeof DECREMENT_ENTHUSIASM;

这里声明了两个常量 至于type的写法 大家可以去看一下 ts命名空间的内容
我们简单说 通过type 声明一个自己的字符串字面量类型

然后 我们再在项目src目录创建一个目录 叫 actions
目录下依旧创建一个 叫 index.tsx 的文件
参考代码如下

import * as constants from '../constants'

export interface IIncrementEnthusiasm {
    type: constants.INCREMENT_ENTHUSIASM;
}

export interface IDecrementEnthusiasm {
    type: constants.DECREMENT_ENTHUSIASM;
}

export type EnthusiasmAction = IIncrementEnthusiasm | IDecrementEnthusiasm;

export function incrementEnthusiasm(): IIncrementEnthusiasm {
    return {
        type: constants.INCREMENT_ENTHUSIASM
    }
}

export function decrementEnthusiasm(): IDecrementEnthusiasm {
    return {
        type: constants.DECREMENT_ENTHUSIASM
    }
}

然后 我们再在src目录下创建 reducer 文件夹
下面还是一个index.tsx
参考代码如下

import { EnthusiasmAction } from '../actions';
import { IStoreState } from '../types/index';
import { INCREMENT_ENTHUSIASM, DECREMENT_ENTHUSIASM } from '../constants/index';

export function enthusiasm(state: IStoreState, action: EnthusiasmAction): IStoreState {
  switch (action.type) {
    case INCREMENT_ENTHUSIASM:
      return { ...state, enthusiasmLevel: state.enthusiasmLevel + 1 };
    case DECREMENT_ENTHUSIASM:
      return { ...state, enthusiasmLevel: Math.max(1, state.enthusiasmLevel - 1) };
    default:
      return state;
  }
}

这就相当于是我们之前 全局处理 接受/返回 的一个地方
我们分别写了两个事件 对应 将 enthusiasmLevel 加一 和 减一
事件名就对应我们上面定义的两个变量值 DECREMENT_ENTHUSIASM与INCREMENT_ENTHUSIASM

然后 我们再在src目录下创建一个文件夹 store
然后下面再创建一个 文件 叫 index.tsx

import { createStore, Reducer } from 'redux';
import { enthusiasm } from '../reducer/index';
import { EnthusiasmAction } from '../actions/index';
import { IStoreState } from '../types/index';

const initialState: IStoreState = {
  enthusiasmLevel: 1,
  languageName: 'TypeScript'
};

const store = createStore<IStoreState, EnthusiasmAction, {}, {}>(enthusiasm as Reducer<IStoreState, EnthusiasmAction>, initialState);

export default store;

这个 initialState 就是我们的数据来源了 里面有两个值 分别是 enthusiasmLevel和languageName
接下来 我们重点就是关联了

我们打开 src下的 index.tsx
引入

import { Provider } from "react-redux";
import store from "./store";

然后 在标签上 用上 Provider store 属性 就用我们写的 store
在这里插入图片描述
然后 这里 我也有点懒 直接就给代码写到 App.tsx里吧
App.tsx编写代码如下

import * as React from "react";
import * as actions from './actions/index';
import { IStoreState } from './types/index';
import { connect } from 'react-redux';
export interface IProps {
  name: string;
  enthusiasmLevel?: number;
  onIncrement?: () => void;
  onDecrement?: () => void;
}
class App extends React.Component<IProps,any> {
  public render() {
    const { name,enthusiasmLevel,onIncrement,onDecrement } = this.props;
    return (
      <div className="App">
        <p>{ name }</p>
        <p>{ enthusiasmLevel }</p>
        <button onClick={ onIncrement }>+</button>
        <button onClick={ onDecrement }>-</button>
       
      </div>
    );
  }
}
export function mapStateToProps({ enthusiasmLevel, languageName }: IStoreState) {
  return {
    enthusiasmLevel,
    name: languageName,
  }
}

export function mapDispatchToProps(dispatch: any) {
  return {
    onDecrement: () => dispatch(actions.decrementEnthusiasm()),
    onIncrement: () => dispatch(actions.incrementEnthusiasm())
  }
}

export default connect(mapStateToProps, mapDispatchToProps)(App);

这样 我们运行起项目 会看到 name 和 enthusiasmLevel 的展示是正常的
在这里插入图片描述
然后 我们操作 decrementEnthusiasm 和 incrementEnthusiasm 加减事件 我们会发现

虽然能够正常执行 但实际上 , 也是非常的好用啊
在这里插入图片描述

更多推荐

阿里云产品试用系列-云桌面电脑

无影云电脑(WUYINGWorkspace),是一种易用、安全、高效的云上桌面服务。它支持快速便捷的桌面环境创建、部署、统一管控与运维。无需前期传统硬件投资,帮您快速构建安全、高性能、低成本的企业桌面办公体系。可广泛应用于具有高数据安全管控、高性能计算等要求的安全办公、金融、设计、影视、教育等领域。如上所示,在阿里云官

使用 vue + vant 开发移动端网页

使用vue+vant开发移动端移动端开发的时候我们通常需要进行适配,比如设计图宽度是750px我们为了适应不同的设备,需要将我们设计图上的px转为视口单位vw这里我们采用postcss-px-to-viewport安装:npminstallpostcss-px-to-viewportvant-S新建postcss.co

Rasa:使用大语言模型进行意图分类

Rasa:使用大语言模型进行意图分类在Rasa的最新版本(3.x)中,引入了一种新的意图分类方法,即使用大型语言模型(LLM)和一种称为检索增强生成(RAG)的方法进行意图分类。LLM意图分类器是一种全新的意图分类器,利用大型语言模型(LLM)来对意图进行分类。LLM意图分类器依赖于检索增强生成(RAG)方法,结合了基

爬虫入门基础:深入解析HTTP协议的工作过程

在网络爬虫的学习中,了解HTTP协议的工作过程是非常重要的。HTTP(HypertextTransferProtocol)是一种用于在Web浏览器和服务器之间传输数据的协议,它负责客户端请求和服务器响应之间的通信。本文将详细介绍HTTP协议的工作过程,帮助你深入理解网络爬取的基础知识。让我们一起探索吧!一、HTTP协议

OpenResty使用漏桶算法实现限流

前言其它项目组需要调用接口,添加接口限流,防止项目被狂掉宕机。生产用了openresty,所以在openresty上添加按接口限流,同时,需按照不同接口有不同的限流规则,使用openresty中内置的漏桶算法方式限流。漏桶算法漏桶算法思路简单,水(请求)先进入到漏桶里,漏桶以一定的速度出水,当水流入速度过大会直接溢出,

BENTLY 350015 127610-01数字量输入模块

数字输入功能:BENTLY350015127610-01模块通常用于监测和采集数字输入信号,例如开关状态、传感器状态等。多通道:这些模块通常具有多个输入通道,允许同时监测多个数字输入信号。高精度:BENTLY350015127610-01模块提供高精度的信号采集,以确保准确的数据记录和分析。实时监测:具备实时监测功能,

pdf怎么压缩的小一点?pdf文件压缩方法汇总

在日常生活中,我们常常需要处理大量的PDF文件。有时候,这些PDF文件可能因为内容丰富、结构复杂而体积庞大,给我们的存储和传输带来了不便。那么,如何将这些PDF文件压缩得小一点,以便更方便地使用呢?一、嗨格式压缩大师嗨格式压缩大师是一款专业的文件压缩工具,支持图片、视频和PDF等各类文件的压缩,使用它压缩PDF文件,可

机器学习——pca降维/交叉验证/网格交叉验证

1、pca降维:目的是提升模型训练速度定义:使用方法:给训练数据或者测试数据进行降维处理给训练数据降维给测试数据降维:这里1就要用transform,而不是fit_transform,因为之前训练数据降维时特征已经确定,测试数据提取的特征要和训练数据保持一致。2、交叉验证:目的是保证模型的测试数据和训练数据划分清楚,从

[2023.09.12]: Yew应用开发的第一个hook--use_state

Yew的SSR模式推荐使用function_component组件,并且在function_component中使用hooks。其中,我使用到的第一个hook是use_state。use_state的设计意图与React中的useState非常相似,都是为了保存并修改当前的状态。然而,由于Yew是用Rust语言实现的,

算法leetcode|83. 删除排序链表中的重复元素(rust重拳出击)

文章目录83.删除排序链表中的重复元素:样例1:样例2:提示:分析:题解:rust:go:c++:python:java:83.删除排序链表中的重复元素:给定一个已排序的链表的头head,删除所有重复的元素,使每个元素只出现一次。返回已排序的链表。样例1:输入:head=[1,1,2]输出:[1,2]样例2:输入:he

汽车三高试验离不开的远程试验管理平台-TFM

随着信息技术的高速发展,企业对远程试验实时监控与数据管理的需求日益增强。而利用远程试验信息协同技术,可突破部门与地域的限制,并把试验现场的车辆状态信息、试验数据和分析结果实时传输给数据分析部门和设计部门等,从而缩短时间与空间的距离,让技术人员与现场试验人员实现实时远程交互、协同分析和技术协调,同时还有利于提高试验效率、

热文推荐