从零开始学React框架
原创react 基础知识清单
- 1.React基础使用
- 2.JSX语法规则
- 3.JSX语法糖遍历
- 4.安装 react-tools调试工具
- 5.React 定义组件(功能组件)
- 6.React 定义组件(类组件)
- 7.React 三个核心属性之一 state 使用
- 8.React 三个核心属性之一 props 使用
- 9.React 三个核心属性之一 refs------不要过度使用 ref
- 10.React 不受控制的部件和受控组件之间的区别
- 11.React 生命周期 (非常重要)
- 12.React DOMDE Diffing 算法
- 13.React 棚架的使用
- 14.React 空白版本样式 方便调试 todos
- 15.React 请求接口
- 16.React 结构赋值 连续结构分配 连续结构分配
- 17.React
1.React基础使用
在学习之初,使用Simple htmlWRITE,未来将使用更高顺序的写作
01 react test
区别:
- 虚拟 dom 是一个object 对象类型,实型 dom 是节点;
- 虚拟 dom 更轻,没错 dom 重,debugger 可查;
- 虚拟 dom 最终会被 react 变得真实 dom,显示在页面上;
2.JSX语法规则
02 JSX语法糖
jsx 语法糖规则
1. 定义虚拟 DOM 不要写引号。
2. 混入标签 JS 该表达式将被使用。{}。
3. 不要使用样式的顶级类名 class,要用 className。
4. 内联样式,要使用 style{{key:value}}写作的形式。
5. 只能有一个根标签。
6. 标签必须关闭。
7. 标签首字母
(1).如果小写字母开始, 标签将被转换 html 中具有相同名称的元素,如果 html 如果没有与中的标签对应的同名元素,则会报告错误。
(2).如果大写字母开始,react 要呈现相应的组件,如果组件未定义,则会报告错误。
3.JSX语法糖遍历
语法糖练习第二天练习
4.安装 react-tools调试工具
下载地址:https://gitee.com/loki-demo/react_dev_tools
5.React 定义组件(功能组件)
功能组件注意事项
- 首字母必须大写
- 该函数必须具有返回值 return
- 渲染必须写入组件标签并关闭。
渲染ReactDOM.render(..。在那之后,发生了什么?
- React 分析元件注释,查找 MyCompontent组件。
- 发现该组件是使用函数定义的,然后调用该函数,该函数返回虚拟DOM转为真实 DOM,然后,它会显示在页面上。
6.React 定义组件(类组件)
功能组件注意事项
- 首字母必须大写
- 该函数必须具有返回值 return
- 渲染必须写入组件标签并关闭。
渲染ReactDOM.render(..。在那之后,发生了什么?
- React 分析元件注释,查找 MyCompontent组件。
- 发现组件是使用类定义的,下面是 new 从类的实例中取出并通过该实例调用原型。 render方法。
- 将 render 返回的虚拟 DOM 转为真实 DOM,然后,它会显示在页面上。
7.React 三个核心属性之一 state 使用
标准写法
简写方法
8.React 三个核心属性之一 props 使用
标准写法
简写写法
注意:
- 速记方法需要在类中编写并使用。 static 修饰;props 只读,不能修改;
- {…person} 可以处理对象或数组;通常情况下,只能处理数组,但在{}如果你把它包起来,你就可以暴露物体并跟随它。 vue 的很像;
- propTypes 和 PropTypes 为了区分,前者是阶级的财产,后者是阶级的财产的类型。. string.number.func (方法);
- defaultProps 是这是prop 缺省值;
- constructor 类的构造者的角色是什么?
作用:
(1)初始化 state 在数据中,事件处理程序的绑定实例为。bind 一个this可以调用的方法。
如果构造函数只有上述两个函数,则可以直接编写,无需使用。 state 并且剪头函数的方法可以完全取代构造函数。是否使用构造函数取决于您是否希望在构造函数中接受它。 this.props ,如果使用构造函数,则必须。 super 和接受
constructor(props){
super(props)
console.log(this.props)
}
9.React 三个核心属性之一 refs------不要过度使用 ref
字符串类型。 ref ->虽然简单,但不推荐,以后可能会被移除,说效率不高!
回调类型 ref
注意:
-
ref={ © => { this.inputLeft = c} } 将使用回调方法。{}括起来;
-
onClick={this.getInfo} 也应该使用普通的方法。{}括起来;
-
ref={ © => { this.inputLeft = c} }(复杂的写作) ,ref={c => this.inputRight = c} (速记)
-
注释 jsx 语法用{}它变成了 js,在用/**/注释可以通过将其括起来来实现。 jsx;
{/<input ref={ (c) => { this.inputLeft = c} } type="text" />/}
-
内联 ref={ © => { this.inputLeft = c} }在调用期间呈现两次调用可能存在问题; ref 的写法 ref={this.inputLeftF}
相应地生成一个 inputLeftF = (e)=>{ this.inputLeft = e }不会有两个电话 ref 问题;这个问题不大,你可以用任何方式写,但要知道这个问题的本质,如果有人很严重,你可以和他一起手术~~<!DOCTYPE html>
createRef的使用
注意:
- inputLeft = React.createRef() 创建 ref 容器 专人专用
<input ref={this.inputLeft} type="text" />
调用- this.inputLeft.current.value 获取节点的值
10.React 不受控制的部件和受控组件之间的区别
-
不受控制的组件(现已首次采用)
<!DOCTYPE html>
-
受控组件(维护 state 状态中)
<!DOCTYPE html>
3. 高次函数与函数化
-
什么是高阶函数?自变量是函数或者返回值是满足高阶函数之一的函数,
常见的高阶函数:map 、filter、reduce、setTimeout等 -
什么是功能化?
我自己的理解是,函数中的函数集和函数集<!DOCTYPE html>
11.React 生命周期 (非常重要)
1. 旧版本
-
初始化阶段:ReactDOM.render()触发 ----初次渲染;
- constructor()
- componentWillMount()
- render() ====》必须用
- componentDidMount() ====》常用
1) 注意:一般来说,在这个钩子中做一些初始化的事情,打开定时器,发送网络请求,订阅消息等;
-
更新阶段:按组件内部。 this.setState()或父组件 render 触发;
- componentWillReceiveProps()=>仅当更新父组件时 render 时触发
- shouldComponentUpdate() (this.forceUpdate()不是这个)
- componentWillUpdate()
- render()====》必须用
- componentDidMount()
-
卸载组件:ReactDOM.unmountComponentAtNode(documnet.getElemengById())触发;
- componentWillUnmount() ====》常用
1) 注意:一般来说,在这个钩子上做一些收尾工作,关闭定时器,取消订阅消息;
- componentWillUnmount() ====》常用
旧版本如下图所示
2.新的生命周期
-
初始化阶段:ReactDOM.render()触发 ---- 初次渲染;
- constructor()
- getDerivedStateFromProps()
- render() ====》必须用
- componentDidMount() ====》常用
1) 注意:一般来说,在这个钩子中做一些初始化的事情,打开定时器,发送网络请求,订阅消息等;
-
更新阶段:按组件内部。 this.setState()或父组件 render 触发;
- getDerivedStateFromProps() ----> 挂载后,执行以下命令
- shouldComponentUpdate()
- render()
- getSnapshotBeforeUpdate() —> 是否要拍摄更新的快照(保留以前的数据)
- componentDidMount()
-
卸载组件:ReactDOM.unmountComponentAtNode(documnet.getElemengById())触发;
-
componentWillUnmount() ====》常用
1) 注意:一般来说,在这个钩子上做一些收尾工作,关闭定时器,取消订阅消息;
图如下图
注意:新版本的钩子和旧版本的钩子之间的区别。
- 新版本放弃了三个旧版本。 will 钩子(componentWillMount,componentWillUpdate,componentWillReceiveProps);
- 添加了两种新方法 (getSnapshotBeforeUpdate , getDerivedStateFromProps)
最常用的重要挂钩
- render:初始化渲染或更新渲染调用;
- componentDidMount:打开监听并发送 ajax 请求;
- componentWillUnmount:做一些整理工作,如清洁计时器;
12.React DOMDE Diffing 算法
自己diff总结:
diff 该算法是查找不同的;根据要查找的节点,如果该节点中有节点,则 diff 会被深度比较;
13.React 棚架的使用
-
创建项目并启动
-
脚手架的安装 :npm i -g create-react-app (window) sudo npm i -g create-react-app(max)
-
创建项目:create-react-app 项目名称
-
启动项目:yarn start
-
包装好的物品:yarn build
-
把 wepack.config.js 默认情况下,隐藏文件被暴露;yarn eject
react脚手架创作工程特别注意事项
-
%PUBLIC_URL% 代表public 文件路径;
-
<meta name="viewport" content="width=device-width, initial-scale=1" />
用于打开视窗和适配移动终端; -
<meta name="theme-color" content="#000000" />
用于配置浏览器选项卡+地址栏的颜色(只支持Android手机浏览器,兼容性不是很好;); -
<meta name="description" content="Web site created using create-react-app" />
描述网站信息; -
<link rel="apple-touch-icon" href="%PUBLIC_URL%/logo192.png" />
用于在后台将首页添加到手机主屏幕上的图标; -
<link rel="manifest" href="%PUBLIC_URL%/manifest.json" />
应用外壳配置文件,即E.H5可转化为Android; -
<noscript>You need to enable JavaScript to run this app.</noscript>
浏览器不支持 js 显示标签的内容; -
React.StrictMode严格监控
<App />
组件中的书写是否合理;ReactDOM.render(
-
reportWebVitals 页面 性能分析文件(必填 web-vitals图书馆支持);
-
setupTests.js 用于组件单元测试的文件(必需 jest-dom 图书馆支持);
-
css模块化风格:
1).css文件名为:index.module.css
2).在 jsx 在文件中引入hello使用hello.title
import { Component } from "react";
import hello from ./index.module.css
export default class Hello extends Component {
render() {
return (
我是 Hello 组件
)
}
}
-
**快速生成代码片段 类别和功能
rcc 是快速生成的类代码片段。
rfc 是一个快速生成的函数代码片段。
**
注意:需要安装插件 使用快捷键的步骤
-
引入组件顺序
1>. 在第三方之上 ->react react-dom nanoid uuid
2>. 自己的文件 ->自定义组件
3>. 样式文件 ->css 文件
-
脚手架创建组件
import React, { Component } from react // 第三方文件简介 import ./index.css // 引入自定义样式 export default class Item extends Component { // export default 暴露节点 state = { // 变量,它等同于vue 中的 data mouse: false } mouseEnter = (flag) => { // 方法:使用剪头功能。 return () => { this.setState({ mouse: flag }) } } change = (id) => { // 方法:使用剪头功能。 return (e) => { // 高阶函数 this.props.updataTodo(id, e.target.checked) // 调用父组件传递的方法,返回返回值; } } handerDel = (id)=>{ console.log(id,id....) } render() { let { item } = this.props // 用于获取结构赋值的值 let { mouse } = this.state // 用于获取结构赋值的值 return ( <li style={{ background: mouse ? #f9f9f9 : #fff }} className=item onMouseEnter={this.mouseEnter(true)} // 一种鼠标进入触发方法 onMouseLeave={this.mouseEnter(false)} // 一种鼠标离开触发方法 onChange={this.change(item.id)} //鼠标更改触发器方法并调用该方法中父组件传递的函数,因为有圆括号,所以这 change 方法需要使用高阶函数,否则它们将默认执行,或者可以用来删除该按钮,这对于高阶函数是不实用的;
<div className=item-del @click={()=>{this.handerDel(item.id)}} style={{ display: mouse && item.finish ? block : none }}>Del
注意:1.如果要在方法中传递值,则需要使用或不使用高阶函数。@click={()=>{this.handerDel(item.id)}} ;2.调用从父组件函数传递的函数 this.props.updataTodo()
-
生成随机数 可用于当ID;uuid(较大,不推荐)nanoid(小号,推荐)
安装 uuid nanoid
npm i uuid / yarn add uuid
npm i nanoid / yarn add nanoid
使用 uuid nanoid
import {nanoid} from nanoid;
console.log(nanoid());
-
Proptypes 用于限制传输规范等限制的使用。
安装 Proptypes
npm i prop-types / yarn add prop-types
使用 Proptypes
import Proptypes from prop-types;
// 对接受参数需求的限制。
static propTypes = {
name:PropTypes.string.isRequired,
sex:PropTypes.string,
age:PropTypes.number,
speak:PropTypes.func , // 传递函数
}
// 设置标签的默认值
static defaultProps = {
sex:保密,
age:18
}
-
该函数用于展开修改默认值的方法。
checkAll = () => { const {todos} = this.state let newTodos = todos.map(item=>{ return {...item,finish:true} // 返回展开的item 并把 item 中的所有 finish 所有值都将被替换 true })
}
14.React 空白版本样式 方便调试 todos
15.React 请求接口
1. 建议使用 axios轻量级 不推荐 jquery 太大;
2. 安装 axios
yarn add axios || npm install axios
3. 使用
import axios from axios
//调用接口
axios.get().then(
response => { },
error => { }
)
注意: 1.跨域解决方案,如下图所示
解决跨域方法一。
求解跨域方法II
求解跨域方法III
直接找到后端,让后端来处理!
2.安装fehelper 组织请求接口格式页 json 文件
地址: https://www.baidufe.com/fehelper/index/index.html
安装方法
下载当前最新版本*.crx
chrome浏览器地址栏输入:chrome://extensions/ 并打开
右上角打开开发人员模式
拖拽crx转到当前页面并完成安装。
16.React 结构赋值 连续结构分配 连续结构分配
17.React
版权声明
所有资源都来源于爬虫采集,如有侵权请联系我们,我们将立即删除