📔
饥人谷前端体系课程笔记
黑马程序员笔记前端面试押题前端精进
  • 课程大纲
  • Git入门
    • 3. 软件安装详解
    • 4. Mac环境搭建
    • 5. 命令行入门
    • 6. 本地仓库
    • 7. Git远程仓库-GitHub
  • HTML全解
    • 8. HTML概览
    • 9. HTML标签
    • 10. HTML重难点
    • 11. HTML实践 & 手机调试
  • CSS全解
    • 12. CSS基础
    • 13. CSS布局(上)
    • 14. CSS布局(下)
    • 15. CSS定位
    • 16. CSS动画
  • HTTP全解
    • 17. URL 是什么
    • 18. 请求和响应 & Node.js Server
  • JS全解
    • 19. JavaScript概览
    • 20. 内存图与JS世界(精品课)
    • 21. Canvas 实践—画图板
    • 22. JS语法
    • 23. JS数据类型
    • 24. JS 对象
    • 25. JS 对象分类
    • 26. JS 数组
    • 27. JS 函数
    • 28. JS 实战,会动的代码
    • 29. JS运算符
    • 30. JS总结
  • JS编程接口
    • 31. DOM编程
    • 32. 手写DOM库
    • 33. JQuery中的设计模式(上)
    • 34. JQuery中的设计模式(下)
    • 35. DOM事件与事件委托
  • 项目 前端导航站点
    • 前端导航项目笔记
  • 前后分离
    • 40. AJAX的原理
    • 41. 异步与Promise
    • 42. 跨域、CORS、JSONP
    • 43. 静态服务器
    • 44. AJAX实战:Cookie、Session
  • JS进阶MVC
    • 48. MVC(上)
    • 49. MVC(中)
    • 50. MVC(下)
  • 项目构建
    • 51. Webpack(上)
    • 52. Webpack(下)
  • 算法与数据结构
    • 62. 伪代码与流程图
  • React全解
    • 75. React起手式
    • 76. React类组件和函数组件
    • 77. Class组件详解
    • 78. 函数组件
    • 79. Hooks原理解析
    • 80. Hooks各个击破
    • 81. 精通Redux
  • Node.js
    • 84. Node.js技术架构
    • 85. 文件模块
    • 86. 单元测试之文件模块
    • 87. 调试 Node.js 程序
    • 88. 静态服务器
    • 89. 命令行翻译工具
    • 90. 操作数据库
    • 91. 数据库基础知识
    • 92. Stream 流
    • 93. child_process
    • 94. 总结
  • TypeScript
    • 112. 基础
    • 113. 泛型
  • Next.js全解
    • Next.js 上
    • Next.js 下
  • ES6精讲
    • Promise,async/await
  • 大屏可视化笔记
    • 大屏可视化项目
  • SCSS全解
    • SCSS全解
  • 拓展
    • 一次性弄懂性能优化
    • Web性能优化
由 GitBook 提供支持
在本页
  • 78. 函数组件
  • 函数组件比class组件简单
  • 创建方式
  • 函数组件
  • 面临两个问题
  • 没有State
  • 没有生命周期
  • UseEffect
  • 模拟componentDidMount
  • 模拟componentDidUpdate
  • 模拟componentWillUnmount
  • 其他生命周期怎么模拟
  • constructor
  • shouldComponentUpdate
  • render
  • 总结
  • 插曲
  • useUpdate
  • useState的原理
  • 函数组件模拟生命周期
  • 自定义Hook之useUpdate

这有帮助吗?

  1. React全解

78. 函数组件

78. 函数组件

函数组件比class组件简单

创建方式

函数组件

创建函数组件的三种方式

//1
const Hello = (props) => {
	return <div>{props.message}</div>
}
//2
const Hello = props => <div>{props.message}</div>
//上面的缩写形式,如果箭头后面加了{}就必须有return

//3
function Hello(props){
	return <div>{props.message}</div>
}

函数组件代替class组件

面临两个问题

函数组件没有state

函数组件没有生命周期

没有State

React v16.8.0 推出Hooks API

其中一个API叫做useState可以解决问题

import React, {useState} from 'react';
export default function App() {
  const [n, setN] = useState(0);

  const onClick = ()=>{
    setN(n+1)
  }
  return (
    <div className="App">
      {n}
      <button onClick={onClick}>+1</button>
    </div>
  );
}

没有生命周期

React v16.8.0推出Hooks API

其中的一个API叫做useEffect可以解决问题

UseEffect

模拟componentDidMount

useEffect(()=>{console.log('第一次渲染')},[])
//第二个参数指明在何时调用 ,传入空数组代表只在第一次渲染时调用

模拟componentDidUpdate

useEffect(()=>{console.log('任意属性变更')})
//任何state变化都要执行这个函数
useEffect(()=>{console.log('n变了')},[n])
//n变了就执行这个函数

模拟componentWillUnmount

useEffect(()=>{
	console.log('第一次渲染')
	return ()=>{
		console.log('组件要死了')
	}
})
//return之后是函数销毁时执行

其他生命周期怎么模拟

constructor

函数组件要执行的时候,就相当于constructor,return之前的内容

函数名就是标签名

shouldComponentUpdate

后面的React.memo和useMemo可以解决

render

函数组件的返回值就是render的返回值

总结

能用函数组件就用函数组件,因为它更简单

如果你理解不了函数组件,就用class组件

插曲

useUpdate

第一次由undefined变成0时不执行函数

第二次变化时,执行函数

第三次变化时,执行函数

这就是自定义Hook

useState的原理

函数组件模拟生命周期

自定义Hook之useUpdate

const useUpdate = (fn, dep) => {
	const [count, setCount] = useState(0);
	useEffect(()=>{
		setCount(x => x + 1);
	},[dep]);
	
	useEffect(() => {
		if(count > 1){
			fn();
		}
	}, [count, fn]);
};

export default useUpdate
上一页77. Class组件详解下一页79. Hooks原理解析

最后更新于3年前

这有帮助吗?