10 【初始化脚手架】
1.什么是 React 脚手架?
Section titled “1.什么是 React 脚手架?”在我们的现实生活中,脚手架最常用的使用场景是在工地,它是为了保证施工顺利的、方便的进行而搭建的,在工地上搭建的脚手架可以帮助工人们高校的去完成工作,同时在大楼建设完成后,拆除脚手架并不会有任何的影响。
在我们的 React 项目中,脚手架的作用与之有异曲同工之妙
React 脚手架其实是一个工具帮我们快速的生成项目的工程化结构,每个项目的结构其实大致都是相同的,所以 React 给我提前的搭建好了,这也是脚手架强大之处之一,也是用 React 创建 SPA 应用的最佳方式
2.为什么要用脚手架?
Section titled “2.为什么要用脚手架?”在前面的介绍中,我们也有了一定的认知,脚手架可以帮助我们快速的搭建一个项目结构
在我之前学习 webpack 的过程中,每次都需要配置 webpack.config.js 文件,用于配置我们项目的相关 loader 、plugin,这些操作比较复杂,但是它的重复性很高,而且在项目打包时又很有必要,那 React 脚手架就帮助我们做了这些,它不需要我们人为的去编写 webpack 配置文件,它将这些配置文件全部都已经提前的配置好了。
3.怎么用 React 脚手架?
Section titled “3.怎么用 React 脚手架?”这也是这篇文章的重点,如何去安装 React 脚手架,并且理解它其中的相关文件作用
首先介绍如何安装脚手架
3.1 安装 React 脚手架
Section titled “3.1 安装 React 脚手架”首先确保安装了 npm 和Node,版本不要太古老,具体是多少不大清楚,建议还是用 npm update 更新一下
然后打开 cmd 命令行工具,全局安装 create-react-app
然后可以新建 一个文件夹用于存放项目
在当前的文件夹下执行
快速搭建项目
再在生成好的 hello-react 文件夹中执行
启动项目
接下来我们看看这些文件都有什么作用
3.2 使用vite创建react项目
Section titled “3.2 使用vite创建react项目”vite官网:https://vitejs.cn
- 什么是vite?—— 新一代前端构建工具。
- 优势如下:
- 开发环境中,无需打包操作,可快速的冷启动。
- 轻量快速的热重载(HMR)。
- 真正的按需编译,不再等待整个应用编译完成。
3.3 脚手架项目结构
Section titled “3.3 脚手架项目结构”再介绍一下public目录下的 index.html 文件中的代码意思
以上是删除代码注释后的全部代码
第5行
指定浏览器图标的路径,这里直接采用 %PUBLIC_URL% 原因是 webpack 配置好了,它代表的意思就是 public 文件夹
第6行
用于做移动端网页适配
第七行
用于配置安卓手机浏览器顶部颜色,兼容性不大好
8到11行
用于描述网站信息
第12行
苹果手机触摸版应用图标
第13行
应用加壳时的配置文件
这里面其实最主要的就是App.js以及index.js,一个是组件,一个是将组件渲染到页面中的。
4.第一个脚手架应用
Section titled “4.第一个脚手架应用”-
我们保持public中的Index.html不变
-
修改src下面的APP.js以及index.js文件
index.js: 【主要的作用其实就是将App这个组件渲染到页面上】
这样在重新启动应用,就成功了。

我们也不建议这样直接将内容放入App组件中,尽量还是用内部组件。
我们在顶一个Hello组件:
在App组件中,进行使用
这样的结果和前面是一样的。
推荐使用这种目录结构去使用组件

5.1 组件基本概念
Section titled “5.1 组件基本概念”在React中网页被拆分为了一个一个组件,组件是独立可复用的代码片段。具体来说,组件可能是页面中的一个按钮,一个对话框,一个弹出层等。React中定义组件的方式有两种:基于函数的组件和基于类的组件。本节我们先看看基于函数的组件。
基于函数的组件其实就是一个会返回JSX(React元素)的普通的JS函数,你可以这样定义:
函数式组件主要有两个注意点:
- 函数名首字母大写
- 返回值是一个JSX(React元素)
为了使得项目结构更加的清晰,更易于维护,每个组件通常会存储到一个单独的文件中,比如上例中的App组件,可以存储到App.js中,并通过export导出。
或者使用箭头函数
在其他文件中使用时,需要先通过import进行引入:
引入后通过<组件名/>或<组件名></组件名>即可引入组件。
5.2 组件化编码流程
Section titled “5.2 组件化编码流程”1.拆分组件:拆分界面,抽取组件
2.实现静态组件
3.实现动态组件
- 动态的显示初始化数据
- 数据类型
- 数据名称
- 保存在哪个组件
- 交互
注意事项:
1.拆分组件、实现静态组件。注意className、style的写法
2.动态初始化列表,如何确定将数据放在哪个组件的state中?
- 某个组件使用:放在自身的state中
- 某些组件使用:放在他们共同的父组件中【状态提升】
3.关于父子组件之间的通信
- 父组件给子组件传递数据:通过props传递
- 子组件给父组件传递数据:通过props传递,要求父组件提前给子组件传递一个函数
4.注意defaultChecked 和checked区别,defalutChecked只是在初始化的时候执行一次,checked没有这个限制,但是必须添加onChange方法类似的还有:defaultValue 和value
5.状态在哪里,操作状态的方法就在哪里
6.CSS样式
Section titled “6.CSS样式”6.1 内联样式
Section titled “6.1 内联样式”在React中可以直接通过标签的style属性来为元素设置样式。style属性需要的是一个对象作为值,来为元素设置样式。
传递样式时,需要注意如果样式名不符合驼峰命名法,需要将其修改为符合驼峰命名法的名字。比如:background-color改为backgroundColor。
如果内联样式编写过多,会导致JSX变得异常混乱,此时也可以将样式对象定义到JSX外,然后通过变量引入。
样式过多,JSX会比较混乱:
可以这样修改:
相比第一段代码来说,第二段代码中JSX结构更加简洁。
6.2 在内联样式中使用State
Section titled “6.2 在内联样式中使用State”设置样式时,可以根据不同的state值应用不同的样式,比如我们可以在组件中添加一个按钮,并希望通过点击按钮可以切换div的边框,代码可以这样写:
上例中添加一个新的state,命名为showBorder,代码是这样的const [showBorder, setShowBorder] = useState(false);当该值为true时,我们希望div可以显示一条2像素的红色边框,当为false时,我们希望div没有边框。默认值为false。
divStyle的最后一个属性是这样设置的border: showBorder?'2px red solid':'none',这里我们根据showBorder的值来设置border样式的值,如果值为true,则设置边框,否则边框设置为none。
toggleBorderHandler 是负责修改showBorder的响应函数,当我们点击按钮后函数会对showBorder进行取反,这样我们的样式就可以根据state的不同值而呈现出不同的效果了。
6.3 外部样式表
Section titled “6.3 外部样式表”那么如何为React组件引入样式呢?很简单直接在组件中import即可。例如:我们打算为Button组件编写一组样式,并将其存储到Button.css中。我们只需要直接在Button.js中引入Button.css就能轻易完成样式的设置。
Button.css:
Button.js:
使用这种方式引入的样式,需要注意以下几点:
- CSS就是标准的CSS语法,各种选择器、样式、媒体查询之类正常写即可。
- 尽量将js文件和css文件的文件名设置为相同的文件名。
- 引入样式时直接import,无需指定名字,且引入样式必须以./或../开头。
- 这种形式引入的样式是全局样式,有可能会被其他样式覆盖。
6.4 css模块化
Section titled “6.4 css模块化”当组件逐渐增多起来的时候,我们发现,组件的样式也是越来越丰富,这样就很有可能产生两个组件中样式名称有可能会冲突,这样会根据引入App这个组件的先后顺序,后面的会覆盖前面的,
为了解决这个问题React中还为我们提供了一中方式,CSS Module。
我们可以将CSS Module理解为外部样式表的一种进化版,它的大部分使用方式都和外部样式表类似,不同点在于使用CSS Module后,网页中元素的类名会自动计算生成并确保唯一,所以使用CSS Module后,我们再也不用担心类名重复了
使用方式
CSS Module在React中已经默认支持了(前提是使用了react-scripts),所以无需再引入其他多余的模块。使用CSS Module时需要遵循如下几个步骤:
1.将css文件名修改: index.css --- > index.module.css
2.引入并使用的时候改变方式:
这就是一个简单的CSS Module的案例,设置完成后你可以自己通过开发者工具查看元素的class属性,你会发现class属性和你设置的并不完全一样,这是因为CSS Module通过算法确保了每一个模块中类名的唯一性。
总之,相较于标准的外部样式表来说,CSS Module就是多了一点——确保类名的唯一,通过内部算法避免了两个组件中出现重复的类名,如果你能保证不会出现重复的类名,其实直接使用外部样式表也是一样的。
7.配置代理
Section titled “7.配置代理”本案例需要下载axios库npm install axios
React本身只关注与页面,并不包含发送ajax请求的代码,所以一般都是集成第三方的一些库,或者自己进行封装。
推荐使用axios。
在使用的过程中很有可能会出现跨域的问题,这样就应该配置代理。
所谓同源(即指在同一个域)就是两个页面具有相同的协议(protocol),主机(host)和端口号(port), 当一个请求url的协议、域名、端口 三者之间任意一个与当前页面url不同即为跨域 。
那么react通过代理解决跨域问题呢
利用服务器之间访问不会有跨域,在中间开启一个服务器,端口号和项目端口号一样
7.1 方法一
Section titled “7.1 方法一”在package.json中追加如下配置
说明:
- 优点:配置简单,前端请求资源时可以不加任何前缀。
- 缺点:不能配置多个代理。
- 工作方式:上述方式配置代理,当请求了3000不存在的资源时,那么该请求会转发给5000 (优先匹配前端资源)
7.2 方法二
Section titled “7.2 方法二”方法二
-
第一步:创建代理配置文件
-
编写setupProxy.js配置具体代理规则:
说明:
- 优点:可以配置多个代理,可以灵活的控制请求是否走代理。
- 缺点:配置繁琐,前端请求资源时必须加前缀。
7.3 vite配置proxy
Section titled “7.3 vite配置proxy”vite.config.ts