React系列知识点
一、项目初始化
1、react-script
通过react-script来帮我们配置好一切与typescript相关的配置。
tsconfig.json配置文件:
2、TSX
tsx就是jsx的typescript版本,要在react中使用tsx:
- 文件扩展名.tsx
- 在配置文件中tsconfig.json启用jsx选项,jsx选项只在代码生成阶段起作用:
preserve:生成的代码将会保留jsx,以供后续的转换操作,也就是会输出jsx后缀的文件;
react:生成原生JavaScript,输出js文件; react-native:生成的代码将会保留jsx,但是输出的文件名扩展是js;
react-jsx、react-jsxdev:新版本出来的
3、【组件化】配置React的CSS模组
(1)使用React最大的优势是模组化(CSS module):
- 每个jsx或者tsx文件就被视为一个独立存在的原件;
- 原件所包含的所有内容也同样都应该是独立存在的;
- import ‘./index.css’ ----> import style from ‘./index.css’
(2)TS的定义声明
- *.d.ts:typescript专用的类型声明文件,会自动被typescript所识别
- 这个文件只包含类型声明,不包含逻辑
- 不会被编译,也不会被webpack打包
(3)css类型声明
表示只要我们import以css为文件后缀时,都会遵循以下的约定:这个约定的内容就是将会导出key所在的对象,
而原始的类名和相应的值都将会被转化为这个对象;
(4)CSS in JS
- 这里的className实际上就是通过import模块生成了JavaScript对象,最后由JavaScript对象动态注入了css样式,这种css注入的方式叫做CSS
in JS(JSS); - 从本质上隔离了全局冲突,但是配置起来略显麻烦
- 另外className的名称是由js动态生成的,所以会对之后的调试有一定的麻烦
- JSS更贴合React组件独立化的原则
(5)把css转化为了js对象,那么typescript也可以实现css的类型
(1)安装插件:typescript-plugin-css-modules(只参与开发),这个插件可以解析css文件,并且生成typescript对应的引用类型;
(2)vscode文件夹的settings.json文件中配置:
{
"typescript.tsdk": "node_modules/typescript/lib",
"typescript.enablePromptUseWorkspaceTsdk": true
}
(3)在tsconfig.json文件中,启用这个插件,就可以出来类名提示:
"plugins": [
{
"name": "typescript-plugin-css-modules"
}
]
3、Ant Design(UI框架)
- 安装依赖:antd (ant design本身)
- 安装依赖:@ant-design/icons:图标项目
二、 react-router-dom
1、什么是SPA(单页网站应用)?
如果使用的是React,vue框架,那么前端服务将会提供一个SPA文件,会把所有的css,html,js全部一次性发送到用户的浏览器中,然后由SPA劫持浏览器的路由,从而控制页面之间的切换。而后端服务器,则不会提供任何路由支持,它只会访问数据库,取得数据,传递到浏览器,由UI去渲染这些数据。
- 简单来说,就是我们每次打开网站的时候,服务器都会把网站中js,css,html打包为一个超级大的文件,一次性丢给浏览器;
- js劫持浏览器路由,生成虚拟路由来动态渲染dom元素。
- 单页网站应用非常符合现在前后端分离的趋势,服务器不负责UI输出,而专注于数据支持。
- 同时支持桌面App,手机App,网站App
React网站使用的路由系统都是虚拟的:
- 与后端服务器没有半毛钱关系,与实际文件也没有一一对应关系
- 主页,http://localhost:3000
- 搜索页面,http://localhost:3000/search
- 旅游路线详情页面,http://localhost:3000/touristRoutes/{id}
注意:React本身只是一个渲染UI的框架,它并不包含处理网站路由的能力,所以,当我们需要处理url的时候,我们还需要给react项目安装拓展的插件。实现原理:就是通过读取url,定向渲染jsx代码,动态更新虚拟dom元素,不过,除了对url的解析以外,我们还需要考虑更复杂的情况,比如说,路由的缓存,浏览器的历史记录,路由的状态等等;React-router是目前最主流、也是最完整的React路由解决方案。它可以保持UI和url的同步,而且具有代码缓存加载,路由动态匹配等等的功能,除此以外,React-router也可以在所有的浏览器中运行。
2、什么是路由,什么是虚拟路由?
针对不同的url进行渲染,就需要借助路由系统了。路由的框架使用react-router
(1) React-router
- react-router-dom 用于浏览器,处理Web App的路由
- react-router-native用于React Native,处理手机app的路由
- react-router-redux提供了路由中间件,处理redux的集成
- react-router-config用来配置静态的路由
- react-router并没有提供原生typescript的支持,所以还需要给项目安装react-router的类型定义
- 如果一个第三方框架没有原生支持一个typescript,那么一般来说,比较出名的框架都会有官方或者半官方提供的type支持,可以在npm
install @type(s)/XXXX中找到 - 可以把所有@types定义放在dev依赖下
(2) React-router-dom
- 安装react-router-dom的时候,会自动安装react-router核心框架
- react-router-dom使用HTML的dom元素组件化的扩展,它加入了浏览器运行环境的功能,比如在jsx代码中,用
<Link />
组件可以渲染出<a />
标签 <BrowserRouter />
组件利用H5 API实现路由切换<HashRouter />
组件则利用原生JS中的window.location.hash来实现路由切换
3、如何在Typescript中配置react-router?
- 安装react-router-dom的时候,会自动安装react-router核心框架
4、如何进行页面切换?
<BrowserRouter />
组件利用H5 API实现路由切换<HashRouter />
组件则利用原生JS中的window.location.hash来实现路由切换
注意:根据react组件化的理念,默认情况下,它并不在乎你路径的唯一性,只要你的路径可以被route组件所截获,可以被局部匹配,那么不管有多少个页面,它都会被同时显示出来。
为了实现页面切换,而不是页面堆叠,我们需要针对route组件做一些短路处理。当给一个Route组件加上exact属性以后,就是在告诉这个Route组件,有且仅当url的路径一模一样的时候,才会做匹配。
虽然加上exact属性会起作用,但是治标不治本,为了从源头上解决页面堆叠的问题,我们还需要使用重要的组件Switch,它可以自动帮我们对路径做短路处理,每次只渲染单独的路径,消除页面堆叠的影响。
5、使用react-router来处理路由需要满足哪些要求?(网站路由系统的要求)
- 路由导航与原生浏览器操作行为一致(比方说:路径可以记录,可以缓存,可以按下浏览器的后退回到上一页):
<BrowerRouter />
来利用H5的API进行路由 - 路由的路径解析原理与原生浏览器一致,可以自动识别url路径:
<Route />
组件来对url字符串进行路径匹配- 路径的切换以页面为单位,不要页面堆叠:
<Switch />
组件来对页面进行切换
总结:使用<BrowerRouter />
+ <Route />
+ <Switch />
来构建基础的路由
6、使用react-router进行路由搭建
(1)注意:
- 当我们在Route组件中使用component传递组件的时候,react-route会默认向下传递3个Props数据:history,location,match;
- 通过match我们可以读取到url中的参数;
(2)如何在url中添加参数:
- 第一种是最常见的使用“?”来引导参数:http://localhost/path?name1=value1&name2=value2
- 第二种,分段路由Segments。RESTful的思维方式,参数作为URL片段的一部分,使用斜杆“/”;比如,http://localhost:3000/products/1111
7、如何跨组件传递路由数据?WithRouter vs UseRouter
- react-router中不同组件间路由数据传递的方法。
- history是整个路由系统的核心。
- HOC高阶组件withRouter : 把路由数据传递到孙组件
- Hooks钩子:useHistory, useParams, useLocation, useRouteMatch
8、react-router在两个页面之间有两种导航方式
- 使用history.push的方式进行页面的切换
- 还有另外一种,它更加抽象,以组件化的思路封装,这种方式需要我们使用react-route中的
<Link />
组件:
<Link />
组件可以在dom元素中生成一个超链接来进行导航
<Link />
组件的原理就是一个<a>
标签加上herf=history.push()
三、redux
1、redux有什么用
管理全局状态,设计模式,也是架构方案。
(1) React实际上只是一个UI框架:
- 通过jsx生成动态dom渲染UI
- 没有架构、没有模版、没有设计模式、没有路由、也没有数据管理
(2) 设计模式与数据管理缺一不可:
只使用React是没办法开发大型应用的
(3) 设计模式:
- MVC、MVVM、MV*
- 针对React项目,我们有redux,redux是一种设计模式,同时也是项目的架构方案,它不依赖任何库或者框架
- redux不仅可以在React中使用,同时也可以在Angular(ng-redux)、Vue(vuejs-redux)中使用
(4) redux架构:
- 通过redux架构,剥离组件数据(state)
- 数据统一存放在store中
- 组件订阅store获得数据
- store同步推送数据更新
总结:redux统一保存数据,在隔离了数据与UI的同时,负责处理数据的绑定。
(4)什么时候需要使用redux:
- 组件需要共享数据(或者叫做状态state)的时候
- 某个状态需要在任何地方都可以被随时访问的时候
- 某个组件需要改变另一个组件的状态的时候
- 语言切换、黑暗模式切换、用户登陆全局数据共享…
- 使用redux最终目的就是让状态state的变化可控可预测
2、如何创建一个具有订阅与推送功能的数据仓库?
整个reducer函数就是一个以旧换新的过程:使用旧的state,通过action,返回一个newState。
3、什么是store?什么是action?什么是reducer?
4、如何理解redux的工作流程?
5、i8n是什么?
Internationalization:i18n国际化 能根据不同的语言及地区显示相应的界面。
(1)原理:
- 语言包作为静态资源单独保存:xml,json
- 每种语言对应一个文件
- 切换语言设置时,语言文件也会随之切换
- 彻底分离字符串和ui
(2)i18n工具:
- i18next:目前最主流的框架
- react-i18next:i18next的React插件
(3)react-i18next配置:
- 文档:https://react.i18next.com/guides/quick-start
- npm install react-i18next i18next --save
- 无论是react-i18next ,还是i18next本身,它们都支持了原生typescript,所以不需要再安装额外的ts类型声明文件
react本身已经自带了xss攻击的机制
6、工厂模式是什么?
7、如何在redux中使用typescript定义强类型?
8、redux和react-redux有什么关系?
redux的插件:react-redux,通过语法糖,减少项目中的模板代码;
-
第一步:安装https://react-redux.js.org/introduction/getting-started
-
第二步:Provider
React Redux includes a component, which makes the Redux store available to the rest of your app -
第三步:connect(),连接store(connect其实就是一个高阶函数)
这个函数作用相当于订阅store步骤的封装,然后我们可以使用高阶组件或者Hooks来获得store中的数据。
9、connect() vs useDispatch() vs useSelector()
四、异步AJax与Redux中间件
1、什么是RESTful?对前端来说RESTful意味着什么?
- 语义明确、轻量级,而且结构简单
- REST和RESRTful是名词和形容词的关系
- RESTful的基本特点:(1)无状态;(2)面向“资源”;(3)使用HTTP的动词;(4)HATOAS超媒体即应用状态引擎
- RESTful只是指导性的原则,只是一种代码风格,一种代码架构,不是标准
2、什么是redux中间件?
(1)为什么需要中间件:
- redux的核心,就是控制和管理所有的数据输入输出
- 因此有了store、reducer以及action的dispatch
(2)redux中间件机制:
- 提供了一个分类处理action的机会
(3)redux的异步处理插件: - redux-thunk
- redux-promise
- redux-saga
3、Ajax异步获取数据
(1)这里异步请求数据使用了axios,安装axios :npm install axios;
(2)这个axios自带typescript类型定义,所以安装之后可以直接使用;
组件在初始化的第一步,就是启动构造函数,首先productList被设置为空数组,第二步,UI就会被挂载,虚拟dom开始被渲染,也就是说render函数在这个时候就已经被执行了,componentDidMount会等待UI组件全部挂载完毕才会调用。所以在使用数组时要注意。也就是要对空数据进行处理:
- a : 可以加loading,error进行判断处理;
- b: 可以在数组长度大于0的时候让这个组件再渲染
五、JWT
JWT的原理:https://jwt.io/
1、JWT是干什么用的?
- JSON Web Token
- JWT的作用是用户授权,而不是用户的身份认证
2、授权 vs 认证
- 用户认证指的是使用用户名、密码来验证当前用户的身份,简单来说,就是用户登录
- 用户授权指当前用户有足够的权限访问特定的资源
3、传统的session登录
- 用户登录后,服务器会保存登录的session信息
- session id 会通过cookie传递给前端
- http请求会附带cookie
- 称这种为有状态登录
4、JWT彻底改变了用户授权与认证的过程
- 替换cookie
- JWT信息只需要保存在客户端,而不需要保存在服务器上
- 无状态登录
无状态登录最大的优势就是能完美支持分布式部署,你可以使用一个token发送给不同的服务器,而所有的服务器都会返回同样的结果;