react项目初始化配置
## [初始化项目](https://facebook.github.io/create-react-app/))
+ 安装
```
npx create-react-app myreact
```
+ 结构
- package.json:包管理文件
- node_modules:局部安装的第三方模块
- .gitignore:被git忽略的目录或者文件
- src:开发目录
- index.js:整个项目的入口文件
- app.js:根组件
- public:存放项目模板文件,以及通过href或者src引入的外部文件
- readme.md:说明文档
+ vscode插件:ES7 React/Redux
+ react-devtools
## [配置](https://www.npmjs.com/package/react-app-rewired)
+ 安装
- 修改默认配置
```
npm install react-app-rewired customize-cra --save-dev
```
- 使用路由
```
npm install react-router-dom --save
```
- 使用sass
```
npm install node-sass --save-dev
```
- 使用多个类名
```
npm install classnames --save
```
+ 新建
- 在项目根目录下新建一个config-overrides.js
```
const {override,addWebpackAlias,useEslintRc} = require('customize-cra')
const path = require('path')
module.exports = override(
addWebpackAlias({
'@': path.resolve(__dirname, 'src/'),
}),
useEslintRc()
)
```
- 在项目根目录下新建一个.eslintrc
```
{
"extends": "react-app",
"rules": {
"no-undef": "off",
"no-restricted-globals": "off",
"no-unused-vars": "off",
"eqeqeq": "off"
}
}
```
+ 使用
- 修改项目根目录下的package.json中的scripts
```
"scripts": {
"dev": "react-app-rewired start",
"build": "react-app-rewired build",
"test": "react-app-rewired test --env=jsdom",
"eject": "react-scripts eject"
}
```
- 启动项目
```
npm run dev
```
- 将css文件全部改成scss
## [路由](https://reacttraining.com/react-router/web/guides/quick-start)
+ index.js
- 引入
```
import {HashRouter} from 'react-router-dom'
```
- 使用
```
<HashRouter><App /></HashRouter>
```
+ App.js
- 引入
```
import {Route,Switch,Link,NavLink} from 'react-router-dom'
import routes from './routes.js'
```
- 使用
```
<Switch>
{
routes.map(e => <Route {...e} />)
}
</Switch>
```
+ routes.js
- 从vies目录引入路由组件
- 在routes中添加这个路由的path、key和component
- 添加exact为true,表示严格匹配
## [组件](https://react.docschina.org/)
- 类型
- 按定义方式
- 函数:一个函数就相当于一个组件
- 无状态:只能接收props,没有state、ref和生命周期
- 受控:当props改变,组件的内容才会更新
- 展示:充当UI组件
- 类:使用es6的class定义一个组件
- 有状态:既能接收props,又能定义state,还有ref和生命周期
- 非受控:除了props,改变state,视图也会变
- 处理逻辑:调用函数,改变状态,渲染视图
- 按功能划分
- 路由:在views目录下
- 复用:在components目录下
- 创建
- 引入
- 类库
```
import React, {Component} from 'react'
import classnames from 'classnames'
```
- 样式
- 全局样式
```
import './index.scss'
```
- 模块化样式
```
import styles from './index.module.scss'
```
- 生成
- 使用jsx语法生成一个react元素,它是html与js的结合体
- 函数
- 类
- ES6的class
- 继承
- 标签
- 可以在多个标签的外层添加一对小括号
- 有且仅有一个顶层标签
- 样式
- 类名不是class,而是className
- 动态
- 内联:style等于花括号,再接一个json对象
- 类名:使用classnames,当成函数来调用
- 事件
- 属性名是小驼峰,属性值是花括号,再接一个函数
- 事件监听函数中没有this,需要设置this,方法有3种
- 1.在花括号中,对函数使用bind
- 2.在contructor中,对函数使用bind
- 3.使用箭头函数
- 参数
- 默认参数是事件对象
- 可以从外部传入参数,方法有两种
- 对函数使用bind方法,第一个参数是this,后面就是传入的参数
- 在回调函数的外层套上一个函数,父函数的默认参数是事件对象,子函数接收所有参数
- 列表
- 使用map方法生成react元素
- 每个元素必须有key,并且不同出现重复
- 导出
```
export default 组件名
```
## 组件
+ 条件渲染
- 不能在花括号里写if条件语句
- 可以在花括号里写逻辑运算符
- &&和||
- 三元表达式
+ 生命周期函数
- constructor:只会在组件初始化的时候执行一次
- render:第一次以及之后组件发生更新,都会执行render
- componentDidMount:当前组件内的DOM节点全部加载完毕
- shouldComponentUpdate:当props或state发生变化,在重新渲染执行之前
- componentDidUpdate:当props或state发生变化,并且shouldComponentUpdate返回为true
- componentWillUnmount:当组件被销毁
- UNSAFE_componentWillMount:当组件被渲染出来之前
- UNSAFE_componentWillReceiveProps:当组件收到新的props之前
+ ref
- 在construtor中,创建一个ref变量
- 在jsx中,给目标节点添加一个ref属性,等于这个ref变量
- 获取这个变量,结果的current属性就是要获取的目标节点
+ 纯组件
- React自带的一个API
- 当props或state发生改变时,浅比较改变前后的值,如果不变,就不会重新渲染
+ 高阶组件
- React中的一种设计模块
- 其实就是一个函数,传入的参数是一个组件,导出的结果是一个新的组件
- 使用ES7的装饰器语法
- 安装插件
```
npm install @babel/plugin-proposal-decorators --save-dev
```
- 在config-overrides.js文件中添加
```
addDecoratorsLegacy()
```
- 先使用@加上高阶组件的名称,再正常导出被装饰的组件
## [antd-design-mobile](https://mobile.ant.design/docs/react/introduce-cn)
+ 安装
```
npm install antd-mobile --save
npm install babel-plugin-import --save-dev
```
+ 在config-overrides.js文件中添加如下代码
```
fixBabelImports('import', {
libraryName: 'antd-mobile',
style: 'css',
})
```
+ 使用:在jsx中,直接当成标签来使用
+ 如果需要引入外部文件
- 放在assets目录下
- 参与wepback的打包流程
- 使用相对路径或者@
- 放在public目录下
- 没有参与打包
- 路径抬头是%PUBLIC_URL%/
## [axios](https://www.kancloud.cn/yunye/axios/234845)
+ 对比fetch
- ES7引入的API
- 语义化,简洁,但是目前存在诸多问题
+ 安装
```
npm install axios --save
```
+ 配置
- 新建一个axios.js文件,添加以下内容
```
import axios from 'axios'
import {Toast} from 'antd-mobile'
axios.interceptors.request.use(function(config){
Toast.loading('加载中')
return config
}, function (error) {
return Promise.reject(error)
});
axios.interceptors.response.use(function(response){
Toast.hide()
return response.data
}, function (error) {
return Promise.reject(error)
})
export default axios
```
- 在index.js文件中,将axios添加到全局
- 创建上下文对象
- 使用Provider组件,在value中添加axios
+ 使用
- 在某个组件中,指定上下文对象
- 通过this.context.axios获取axios
+ 图片
- 本地图片
- img标签
- 如果src的值是写死的,直接写图片的相对路径,也可以将相对路径改成@抬头
- 无论src的值是否写死,都必须结合require方法
- 背景图片
- 如果将样式写在style中,url里面的路径必须是相对路径
- 如果将样式写在标签上,必须结合require方法
- 服务器返回的图片
- 后端不要返回请求路径前面的域名和端口号
- 前端在index.js文件中
- 配置http请求的公共路径
```
const commonUrl = `http://${process.env.NODE_ENV == 'development' ? 'localhost' : 'xiaobulaoshi.club'}:8888`
```
- 添加到Provider组件的value中
- 前端指定当前组件的上下文对象
- 前端在服务器返回的图片路径前面,手动添加this.context.commonUrl
+ 代理
- 安装插件
```
npm install http-proxy-middleware --save-dev
```
- 在src目录下新建一个setupProxy.js文件,添加
```
const proxy = require('http-proxy-middleware')
module.exports = function(app){
app.use(
proxy(
'/xiaobu/api',
{
target: 'http://localhost:8888',
secure: false,
changeOrigin: true,
pathRewrite: {
'^/xiaobu/api': ''
}
}
)
)
}
```
- 在axios的请求拦截器中添加axios请求的路径抬头
```
config.url = '/xiaobu/api' + config.url
```
- 将请求路径中的http://locahost:8888去掉
```
react项目初始化配置的更多相关文章
- 【Webpack2.X笔记】 配合react项目进行配置
前言: 本文是自己在工作中使用webpack进行react开发项目构建的一些经验总结,做以记录防范后续踩坑. 如果您还没有webpack相关基础,请先移步 入门Webpack,看这篇就够了 进行基础学 ...
- 如何在通过脚手架create-react-app 创建的react项目中配置 less
首先感慨下 自己竟然有半年没登账户 ,干嘛去啦? 从刚接触vue 接手做两次版本之后 又让我这个小菜鸡 开始开发react项目,连react生命周期还没搞明白的时候 就开始进行第一版本的开发了,第一个 ...
- 了解CSS in JS(JSS)以及在React项目中配置并使用JSS
目录 认识JSS 什么是JSS JSS 的常见实现 JSS 的好处与坏处 好处 坏处 使用模块化CSS实现JSS 安装插件 在React项目中的tsconfig.json中添加配置 vscode项目中 ...
- 从码云上下载react项目并配置成可运行状态
(第一次写,如有不足之处,欢迎指出) 一.下载项目: 1.首先保证安装了git, 2.然后在本地想要存放项目位置打开git(Git Bash Here),再复制码云中如图所示的地址: 3.在git中输 ...
- 初始化一个React项目(TypeScript环境)
React将由三部分组成,其中,Redux是应用状态管理服务,React-Router用于路由映射,React View用于显示界面. 我们使用Facebook推荐的create-react-app来 ...
- 最详细React Native环境配置及项目初始化(2018-10-14)
注意配环境一定要全程使用稳定VPN工具,否则会浪费大量时间!!!相信我 一.截止到项目初始化之前也就是执行这条命令之前都按官网的方法就可以 https://reactnative.cn/docs/ge ...
- react项目搭建及webpack配置
1,配置webpack npm install -g webpack webpack的cli环境 npm install -g webpack-dev-se ...
- 初始化react项目
react脚手架 npm install -g create-react-app 国内npm一般下载比较慢或者是常出现下载失败的情况,我们可以指定下载的仓库: npm install -g creat ...
- DvaJS构建配置React项目与使用
DvaJS构建配置React项目与使用 一,介绍与需求分析 1.1,介绍 dva 首先是一个基于redux 和redux-saga的数据流方案,然后为了简化开发体验,dva 还额外内置了react-r ...
随机推荐
- PHP NULL 合并运算符
HP 7 新增加的 NULL 合并运算符(??)是用于执行isset()检测的三元运算的快捷方式. NULL 合并运算符会判断变量是否存在且值不为NULL,如果是,它就会返回自身的值,否则返回它的第二 ...
- PHP is_resource() 函数
is_resource() 函数用于检测变量是否为资源类型. PHP 版本要求: PHP 4, P+-HP 5, PHP 7高佣联盟 www.cgewang.com 语法 bool is_resour ...
- 类加载Class Loading
JVM 何时.如何把 Class 文件加载到内存,形成可以直接使用的 Java 类型,并开始执行代码? 类的生命周期 加载 - 连接(验证.准备.解析)- 初始化 - 使用 - 卸载. 注意,加载 ...
- Spring bean作用范围
1,singleton Spring ioc 容器中仅有一个 Bean 实例,Bean 以单例的方式存在:2,prototype 每次从容器中调用 Bean 时,都返回一个新的实例:3,request ...
- 【BZOJ1426】收集邮票 题解 (期望)
题目:有n种不同的邮票,皮皮想收集所有种类的邮票.唯一的收集方法是到同学凡凡那里购买,每次只能买一张,并且买到的邮票究竟是n种邮票中的哪一种是等概率的,概率均为1/n.但是由于凡凡也很喜欢邮票,所以皮 ...
- 十分钟搭建自己的私有NuGet服务器-BaGet
目录 前言 开始 搭建BaGet 上传程序包 在vs中使用 其他 最后 前言 NuGet是用于微软.NET(包括 .NET Core)开发平台的软件包管理器.NuGet能够令你在项目中添加.移除和更新 ...
- Python笔试——毕业旅行问题
毕业旅行问题 小明目前在做一份毕业旅行的规划.打算从北京出发,分别去若干个城市,然后再回到北京,每个城市之间均乘坐高铁,且每个城市只去一次.由于经费有限,希望能够通过合理的路线安排尽可能的省一些路上的 ...
- Netty(一):的入门使用。
Netty的入门基本使用流程代码,不做具体分析.使用版本为Netty 4.x版本. 服务端调用示例: 绑定端口号为8080端口 package com.cllover; import com.sun. ...
- RIPS源码阅读记录(二)
Author: tr1ple 这部分主要分析scanner.php的逻辑,在token流重构完成后,此时ini_get是否包含auto_prepend_file或者auto_append_file 取 ...
- Flutter 容器(6) - FractionallySizedBox
FractionallySizedBox 用法与SizedBox类似,只不过FractionallySizedBox的宽高是百分比大小,widthFactor,heightFactor参数就是相对于父 ...