react+ts开启旅游电商项目(项目初期准备,引入craco,antd,配置别名,usehooks适配,resetful,引入redux,redux-thunk,immutable,)

项目第一步 确认业务

在这里插入图片描述
旅游电商电商四套主线业务:展示旅游路线,网站登录,购物车结果,下单购买
二级业务:主页推荐,关键词搜索,登陆注册,购物车操作,订单历史记录
所以可以分成四个模块,产品模块,用户模块,购物模块,订单模块
产品模块:主页推荐,关键词搜索, 展示旅游路线
用户模块: 登陆注册
购物模块: 购物车操作
订单模块: 订单历史记录

流程规划

在这里插入图片描述

安装ts的css模块化

cnpm isntall typescript-plugin-css-modules --save

组件库使用antd,

考虑一个问题,antd是否会将没有用的代码引入,造成包很大?
答案是不会的,antd官网有提示,antd的js代码是支持基于ES module 的 tree shaking,对于js部分,直接引入import {} form './.xx/,就会有按需加载的效果
什么是tree shaking,摇晃树,最直接的就是果子成熟了,要不断摇晃下来,对树没有帮助了。比如我定义一个函数,却不曾调用过。所以我们就要把这个函数去掉不打包。tree shaking就是做这种事情。对没有用的代码摇下去。

craco

安装craco,这个可以在不暴露webpack的情况下增加额外的配置信息。而且在我们引入antd的时候,antd的主题是蓝色的,但我们不想要蓝色的,也可以通过craco来配置
在这里插入图片描述

yarn add @craco/craco
然后修改配置文件,我们要以craco来启动项目在这里插入图片描述
现在是以craco启动。craco启动的时候会多做一件事情,就是读取根目录下的craco.config.js文件去合并配置文件。

配置antd主题

在这里插入图片描述
按他要求安装craco-less
在这里插入图片描述
在这里插入图片描述
再次yarn start启动
在这里插入图片描述
就会发现已经改了。

配置别名

在这里插入图片描述
在里面对webpack进行配置,alias是配置别名的意思。然后我们是ts项目,所以要
在这里插入图片描述
在这里插入图片描述
这样你在ts文件里才能使用@。在这里插入图片描述
在这里插入图片描述
编译成功。
别名配置结束
我们还可以在这个文件配置其他更多的东西。具体看需要引入。

配置i18n

npm install react-i18next i18next --save
在这里插入图片描述

import i18n from 'i18next';
import { initReactI18next } from 'react-i18next';


import zh_hans from './zhans';
import zh_hant from './zhant';
import en from './en';

let lang = localStorage.getItem('language');
if (!lang) {
	lang = 'zh_hans';
	localStorage.setItem('language', 'zh_hans');
}

i18n
	.use(initReactI18next) // passes i18n down to react-i18next
	.init({
		resources: {
			en: {
				translation: en
			},
			zh_hans: {
				translation: zh_hans
			},
			zh_hant: {
				translation: zh_hant
			}
		},
		fallbackLng: lang,
		debug: false,
		interpolation: {
			escapeValue: false
		},
		cleanCode: true,
		lowerCaseLng: true
	});

export default i18n;
export const t = ( num: string, desc?: any ) => {
	return i18n.t(num, desc)
}

然后在每个文件导出
在这里插入图片描述
在主文件引入
在这里插入图片描述

使用的时候在这里插入图片描述
在这里插入图片描述

可以看到配置成功了。语言切换,在reudx配置
在这里插入图片描述
只要调用了i18n.changeLanguage就可以修改语言。

在这里插入图片描述
在这里插入图片描述
但这个只要一刷新就会没有。所以可以使用保存在本地存储的方式
自定义一个hooks
在这里插入图片描述
在这里插入图片描述
当改变类型就传入LocalStorage,然后调用history在这里插入图片描述
强制刷新一下,这样就能保证以后刷新都能通过本地存储的数据去获取语言类型。

认识RESTful

REST(表征性状态转移)
restful基本特点:无状态,面向资源 ,使用http的动词
无状态:一次连接,返回结果。不存在依赖于上次调用的情况,像webStocket不属于restful范畴
面向资源:在url种,只会出现名词,不会出现动词。面向资源,HATOAS超媒体即应用状态引擎
使用http的动词。如 get post put delete patch(部分更新) 对资源的操作
相同的url可以根据不同的http请求做对应的操作
那restful api好用不,面向对象,资源,如增删改查很方便。面向过程,如登录,不太好用。

px适配自定义Hooks

import { useLifecycles } from 'react-use';

interface IPx2RemProps {
  pWidth: number; //草稿宽度
  cWidth: number; //屏幕实际宽度
  pRem: number; //转换倍数
}

//定义一个类,实现改写html的字体大小功能
class Px2Rem implements IPx2RemProps {
  pWidth: number = 1285;
  cWidth: number = 1285;
  pRem: number = 100;
  constructor(pWidth: number, pRem: number) {
    this.pWidth = pWidth;
    this.pRem = pRem;
  }

  setRem = (): void => {
    const html = document.documentElement;
    let realCwidth = document.body.clientWidth || html.clientWidth; //获取真正的宽度
    this.cWidth =
      realCwidth > 1285 ? 1285 : realCwidth < 800 ? 800 : realCwidth;
    let realFontSize = (this.cWidth / this.pWidth) * this.pRem; //换算 当页面=1280时,1rem = 100px 随着页面缩小, 1rem会越来越小
    html.style.fontSize = realFontSize + 'px'; // html的font-size就等于1rem
  };

  getRemToPx = (rem: number): number => {
    return (this.cWidth / this.pWidth) * this.pRem * rem; //返回 x rem的值
  };
}

const px2rem = new Px2Rem(1285, 100);

const setRem = () => {
  px2rem.setRem();
};

export const useSetRem = () => {
  useLifecycles(
    () => {
      //相当于componentDidMount
      setRem();
      window.addEventListener('resize', setRem);
    },
    () => {
      //相当于 componentWillUnMount
      window.removeEventListener('resize', setRem);
    }
  );
};

然后root组件引入
在这里插入图片描述
这样只要我们写的时候引入插件,转换成rem,就可以自动适配了。

引入redux 并且使用immutable优化

cnpm install redux react-redux redux-immutable redux-thunk immutable
cnpm install @types/react-redux @types/redux-immutable -D

创reducer函数

在这里插入图片描述

创store,合并reducer

在这里插入图片描述

注入store

在这里插入图片描述

函数组件中使用react-redux在这里插入图片描述

后面的shallowEqual是为了优化,因为不加的话,每次redux数据一改变,返回的都是新的对象,所以会导致组件进行不必要的渲染。而shallowEqual是会对前后的state进行一个浅层比较,若值不变则返回的都是老值,不会更新组件。
在这里插入图片描述
正常拿到redux的数据了。

actions配合typescript

在这里插入图片描述
不同的接口对应不同的事情,然乎导出
在这里插入图片描述
在这里插入图片描述
可以看到提示什么的都有了,这也就是ts的强大之处。

配置路由react-router

cnpm install react-router-dom @types/react-router-dom
路由配置用react-router-dom第六版
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
配置成功

路由参数获取

import { useNavigate, useLocation, useParams } from ‘react-router-dom’
在这里插入图片描述
在这里插入图片描述
useHistory用useNavigate代替了,
用法:
在这里插入图片描述

封装axios

在这里插入图片描述

配置中间件redux-thunk

这个的原理其实很简单,劫持actions,判断是函数还是对象,对象的话直接dispatch,函数的话则运行并且传入store.dispatch,store.getState()给他。
配置也很简单
在这里插入图片描述
使用的时候
在这里插入图片描述
在这里插入图片描述
可以看到ThunkActions需要传入四个参数,分别是函数的返回值,store的类型,函数参数,Actions的类型。及返回的对象的类型,然后返回一个函数,里面有两个参数,dispatch,state的值。可以在这里面发送网络请求。

中间件概念

在这里插入图片描述
中间件公式
在这里插入图片描述
为什么是嵌套三层呢?因为react调用中间件就是这么调用的。
在这里插入图片描述
接下来我们自定义一个中间件
在这里插入图片描述
在这里插入图片描述
中间件在我们处理副作用的时候非常好用,

认识redux-toolkit

在这里插入图片描述
这是RKT依赖的四个库。最重要是这个immer库,通过它可以直接修改redux中的state。
在这里插入图片描述
他的思路就是创建slice,在slice初始化state,然后reducer与action结合在一起了,可以通过赋值的方式直接修改state,表面上看似违背了immer的原则,实则不是,他这个的底层是重新创建了state,然后替代原来的state,只是允许我们使用这种方式来修改state。
看基本使用
在这里插入图片描述
在这里插入图片描述
使用的时候直接dispatch(languageSlice.actions.checkouLanguage())
redux-toolkit默认内置了redux-thunk,
在这里插入图片描述
在这里插入图片描述
这种是完全自动流控制数据,中间件会返回一个pormise,在对应的extraReducers上面写上对应的状态,toolkit会在对应的的时刻执行这个函数,如果想要手动控制也行,中间件的函数中的第二个参数thunkApi里面提供了各种api,包括thunkApi.dispatch,允许我们手动dispatch自定义的actions,从而达到控制数据的目的。
使用的时候也是直接dispatch这个中间件,这个粤安action的一种。
这个的确很方便,也减少了代码量,我几乎不用再写action。

解决取出中文url乱码问题,

使用encodeURI(‘我是中文Url’)进行编码,使用decodeURl()进行解码
也可试试直接使用
在这里插入图片描述
在这里插入图片描述
上面是解码的,下面是没解码。

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
作为前端使用React、TypeScript、React Router、Redux、Axios、Ant Design和Sass开发ERP软件项目的职责描述,主要包括以下几个方面: 1. 分析需求和设计界面:与产品经理、设计师等团队成员合作,分析用户需求和产品设计,设计符合用户需求的界面,并提供良好的用户体验。 2. 使用React和TypeScript开发组件:根据设计稿或需求文档,使用React和TypeScript开发可复用的组件,利用类型检查提高代码的可靠性和可维护性。 3. 使用React Router实现路由管理:使用React Router进行页面之间的导航和路由管理,确保页面之间的跳转和参数传递的正常。 4. 使用Redux进行状态管理:使用Redux进行全局状态的管理,包括定义和处理数据流、异步操作、状态持久化等,确保数据的一致性和可控性。 5. 使用Axios进行网络请求:使用Axios库发送HTTP请求与后端API进行数据交互,并处理请求的错误和异常情况。 6. 使用Ant Design进行UI开发:使用Ant Design提供的组件库进行界面开发,保证界面的一致性和美观性,并根据需求进行自定义样式。 7. 使用Sass进行样式管理:使用Sass预处理器编写可复用的样式代码,提高样式开发效率,并保持样式的可维护性。 8. 优化性能和用户体验:通过前端优化技术(如代码分割、懒加载、缓存等),提升ERP软件的性能和用户体验,确保页面加载速度快、操作流畅。 9. 跨浏览器兼容性测试:测试并确保ERP软件在各种主流浏览器(如Chrome、Firefox、Safari等)下的正常运行,并解决兼容性问题。 10. 代码版本管理和团队协作:使用版本管理工具(如Git)管理代码,与团队成员协作开发,参与代码评审和项目迭代。 11. 系统维护和故障排除:及时响应用户反馈并解决软件中出现的前端问题,修复bug,确保ERP软件的稳定运行。 总的来说,前端使用React、TypeScript、React Router、Redux、Axios、Ant Design和Sass开发ERP软件项目的职责是负责开发和维护ERP软件的前端界面和功能,与后端进行数据交互,优化性能和用户体验,并与团队成员协作推动项目的成功交付。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

coderlin_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值