React框架学习笔记

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发送给不同的服务器,而所有的服务器都会返回同样的结果;

5、redux-persist:实现登录持久化

  • 9
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值