01 react test
区别:
02 JSX语法糖
jsx 语法糖规则
1. 定义虚拟 DOM 时,不要写引号。
2. 标签中混入 JS 表达式时要用{}。
3. 样式的类名置顶不要用 class,要用 className。
4. 内联样式,要用 style{{key:value}}的形式写。
5. 根标签只能有一个。
6. 标签必须闭合。
7. 标签首字母
(1).若小写字母开头, 则将该标签转化 html 中的同名元素,若 html 中无该标签对应的同名元素,则报错。
(2).若大写字母开头,react 就去渲染对应的组件,若组件没有定义,则报错。
语法糖练习次日练习
下载地址:https://gitee.com/loki-demo/react_dev_tools
函数式组件注意
渲染ReactDOM.render(…之后,发生了什么?
函数式组件注意
渲染ReactDOM.render(…之后,发生了什么?
标准写法
简写方法
标准写法
简写写法
注意:
1. 简写方法需要写在类内且需要用 static 修饰;props 只读不能修改;
2. {…person} 可以处理对象也可以处理数组;正常情况下只能处理数组,但是这里{}包裹起来,就可以暴露对象了跟 vue 的很像;
3. propTypes 和 PropTypes 要区分,前者是类的属性,后者是类的属性的类型.string.number.func(方法);
4. defaultProps 是这是prop 的默认值;
5. constructor类的构造器的作用?
作用:
(1)初始化 state 中数据,为事件处理函数绑定实例即bind 一个this可调用的方法。
如果该构造器只有以上两个作用,完全可以不用,直接写 state 和剪头函数的方法就可以完全取代构造器。是否使用构造器取决于是否要在构造器中能接受 this.props ,如果用构造器,必须 super 和接受
constructor(props){
super(props)
console.log(this.props)
}
字符串类型的 ref ->虽然简单,不建议使用,以后可能被移出,说效率不高!!!
回调类型的 ref
注意:
{/* { this.inputLeft = c} } type="text" />*/}
createRef的使用
注意:
调用
什么是高阶函数?参数是函数或者返回值是函数满足其一就是高阶函数,
常用高阶函数:map 、filter、reduce、setTimeout等
什么是函数柯里化?
自己的理解就是函数里套函数再套函数
1. 旧版本
初始化阶段:由ReactDOM.render()触发 ----初次渲染;
1. constructor()
2. componentWillMount()
3. render() ====》必须用
4. componentDidMount() ====》常用
1) 注意:一般在这个钩子做一些初始化的事情,开启定时器,发送网络请求,订阅消息等;
更新阶段:由组件内部 this.setState()或父组件 render 触发;
0. componentWillReceiveProps()=>只有在父组件更新 render 时触发
1. shouldComponentUpdate() (this.forceUpdate()没有这个)
2. componentWillUpdate()
3. render()====》必须用
4. componentDidMount()
卸载组件:由ReactDOM.unmountComponentAtNode(documnet.getElemengById())触发;
1. componentWillUnmount() ====》常用
1) 注意:一般在这个钩子做一些收尾的事情,关闭定时器,取消订阅消息;
旧版图如下图
2.新版生命周期
初始化阶段:由ReactDOM.render()触发 ---- 初次渲染;
1. constructor()
2. getDerivedStateFromProps()
3. render() ====》必须用
4. componentDidMount() ====》常用
1) 注意:一般在这个钩子做一些初始化的事情,开启定时器,发送网络请求,订阅消息等;
更新阶段:由组件内部 this.setState()或父组件 render 触发;
0. getDerivedStateFromProps() ----> 挂载完后都执行这个
1. shouldComponentUpdate()
2. render()
3. getSnapshotBeforeUpdate() —> 更新要不要搞个快照(留一下之前数据)
4. componentDidMount()
卸载组件:由ReactDOM.unmountComponentAtNode(documnet.getElemengById())触发;
componentWillUnmount() ====》常用
1) 注意:一般在这个钩子做一些收尾的事情,关闭定时器,取消订阅消息;
diff 算法就是找不同;按照节点来找的,如果节点里面还有节点那么 diff 会深层比对;
用于开启视口,适配移动端;
用于配置浏览器页签+地址栏的颜色(仅支持安卓手机浏览器,兼容性不太好;);
描述网站信息;
用于置顶网页添加到手机主屏幕后的图标;
应用加壳配置文件,即H5可转化为Android;
浏览器不支持 js 展示标签中的内容;
组件中的写法是否合理;ReactDOM.render(
,
document.getElementById('root')
);
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 (
{this.handerDel(item.id)}} style={{ display: mouse && item.finish ? 'block' : 'none' }}>Del // 不使用高阶函数
)
}
}
注意:1.如果想在方法中传值,需要使用高阶函数或者不是高阶@click={()=>{this.handerDel(item.id)}} ;2.调用父组件函数传过来的函数 this.props.updataTodo()
安装 uuid nanoid
npm i uuid / yarn add uuid
npm i nanoid / yarn add nanoid
使用 uuid nanoid
import {nanoid} from 'nanoid';
console.log(nanoid());
安装 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
})
}