• React 全栈体系(四)


    第二章 React 面向组件编程

    六、组件的生命周期

    1. 效果

    • 需求: 定义组件实现以下功能:
      • 让指定的文本做显示 / 隐藏的渐变动画
      • 从完全可见,到彻底消失,耗时 2S
      • 点击“不活了”按钮从界面中卸载组件

    请添加图片描述

    DOCTYPE html>
    <html lang="en">
    <head>
    	<meta charset="UTF-8">
    	<title>1_引出生命周期title>
    head>
    <body>
    	
    	<div id="test">div>
    
    	
    	<script type="text/javascript" src="../js/react.development.js">script>
    	
    	<script type="text/javascript" src="../js/react-dom.development.js">script>
    	
    	<script type="text/javascript" src="../js/babel.min.js">script>
    
    	<script type="text/babel">
    		//创建组件
    		//生命周期回调函数 <=> 生命周期钩子函数 <=> 生命周期函数 <=> 生命周期钩子
    		class Life extends React.Component{
    
    			state = {opacity:1}
    
    			death = ()=>{
    				//卸载组件
    				ReactDOM.unmountComponentAtNode(document.getElementById('test'))
    			}
    
    			//组件挂载完毕
    			componentDidMount(){
    				console.log('componentDidMount');
    				this.timer = setInterval(() => {
    					//获取原状态
    					let {opacity} = this.state
    					//减小0.1
    					opacity -= 0.1
    					if(opacity <= 0) opacity = 1
    					//设置新的透明度
    					this.setState({opacity})
    				}, 200);
    			}
    
    			//组件将要卸载
    			componentWillUnmount(){
    				//清除定时器
    				clearInterval(this.timer)
    			}
    
    			//初始化渲染、状态更新之后
    			render(){
    				console.log('render');
    				return(
    					<div>
    						<h2 style={{opacity:this.state.opacity}}>React学不会怎么办?</h2>
    						<button onClick={this.death}>不活了</button>
    					</div>
    				)
    			}
    		}
    		//渲染组件
    		ReactDOM.render(<Life/>,document.getElementById('test'))
    	script>
    body>
    html>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65

    2. 理解

    • 组件从创建到死亡它会经历一些特定的阶段。
    • React 组件中包含一系列勾子函数(生命周期回调函数), 会在特定的时刻调用。
    • 我们在定义组件时,会在特定的生命周期回调函数中,做特定的工作。

    3. 生命周期流程图(旧)

    请添加图片描述

    • 生命周期的三个阶段(旧)
    3.1 初始化阶段: 由 ReactDOM.render()触发—初次渲染
    • constructor()
    • componentWillMount()
    • render()
    • componentDidMount()
    3.2 更新阶段: 由组件内部 this.setSate()或父组件重新 render 触发
    • shouldComponentUpdate()
    • componentWillUpdate()
    • render()
    • componentDidUpdate()
    3.3 卸载组件: 由 ReactDOM.unmountComponentAtNode()触发
    • componentWillUnmount()
    DOCTYPE html>
    <html lang="en">
    <head>
    	<meta charset="UTF-8">
    	<title>2_react生命周期(旧)title>
    head>
    <body>
    	
    	<div id="test">div>
    
    	
    	<script type="text/javascript" src="../js/react.development.js">script>
    	
    	<script type="text/javascript" src="../js/react-dom.development.js">script>
    	
    	<script type="text/javascript" src="../js/babel.min.js">script>
    
    	<script type="text/babel">
    		/*
    				1. 初始化阶段: 由ReactDOM.render()触发---初次渲染
    									1.	constructor()
    									2.	componentWillMount()
    									3.	render()
    									4.	componentDidMount() =====> 常用
    													一般在这个钩子中做一些初始化的事,例如:开启定时器、发送网络请求、订阅消息
    				2. 更新阶段: 由组件内部this.setSate()或父组件render触发
    									1.	shouldComponentUpdate()
    									2.	componentWillUpdate()
    									3.	render() =====> 必须使用的一个
    									4.	componentDidUpdate()
    				3. 卸载组件: 由ReactDOM.unmountComponentAtNode()触发
    									1.	componentWillUnmount()  =====> 常用
    													一般在这个钩子中做一些收尾的事,例如:关闭定时器、取消订阅消息
    		*/
    		//创建组件
    		class Count extends React.Component{
    
    			//构造器
    			constructor(props){
    				console.log('Count---constructor');
    				super(props)
    				//初始化状态
    				this.state = {count:0}
    			}
    
    			//加1按钮的回调
    			add = ()=>{
    				//获取原状态
    				const {count} = this.state
    				//更新状态
    				this.setState({count:count+1})
    			}
    
    			//卸载组件按钮的回调
    			death = ()=>{
    				ReactDOM.unmountComponentAtNode(document.getElementById('test'))
    			}
    
    			//强制更新按钮的回调
    			force = ()=>{
    				this.forceUpdate()
    			}
    
    			//组件将要挂载的钩子
    			componentWillMount(){
    				console.log('Count---componentWillMount');
    			}
    
    			//组件挂载完毕的钩子
    			componentDidMount(){
    				console.log('Count---componentDidMount');
    			}
    
    			//组件将要卸载的钩子
    			componentWillUnmount(){
    				console.log('Count---componentWillUnmount');
    			}
    
    			//控制组件更新的“阀门”
    			shouldComponentUpdate(){
    				console.log('Count---shouldComponentUpdate');
    				return true
    			}
    
    			//组件将要更新的钩子
    			componentWillUpdate(){
    				console.log('Count---componentWillUpdate');
    			}
    
    			//组件更新完毕的钩子
    			componentDidUpdate(){
    				console.log('Count---componentDidUpdate');
    			}
    
    			render(){
    				console.log('Count---render');
    				const {count} = this.state
    				return(
    					<div>
    						<h2>当前求和为:{count}</h2>
    						<button onClick={this.add}>点我+1</button>
    						<button onClick={this.death}>卸载组件</button>
    						<button onClick={this.force}>不更改任何状态中的数据,强制更新一下</button>
    					</div>
    				)
    			}
    		}
    
    		//父组件A
    		class A extends React.Component{
    			//初始化状态
    			state = {carName:'奔驰'}
    
    			changeCar = ()=>{
    				this.setState({carName:'奥拓'})
    			}
    
    			render(){
    				return(
    					<div>
    						<div>我是A组件</div>
    						<button onClick={this.changeCar}>换车</button>
    						<B carName={this.state.carName}/>
    					</div>
    				)
    			}
    		}
    
    		//子组件B
    		class B extends React.Component{
    			//组件将要接收新的props的钩子
    			componentWillReceiveProps(props){
    				console.log('B---componentWillReceiveProps',props);
    			}
    
    			//控制组件更新的“阀门”
    			shouldComponentUpdate(){
    				console.log('B---shouldComponentUpdate');
    				return true
    			}
    			//组件将要更新的钩子
    			componentWillUpdate(){
    				console.log('B---componentWillUpdate');
    			}
    
    			//组件更新完毕的钩子
    			componentDidUpdate(){
    				console.log('B---componentDidUpdate');
    			}
    
    			render(){
    				console.log('B---render');
    				return(
    					<div>我是B组件,接收到的车是:{this.props.carName}</div>
    				)
    			}
    		}
    
    		//渲染组件
    		ReactDOM.render(<Count/>,document.getElementById('test'))
    	script>
    body>
    html>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119
    • 120
    • 121
    • 122
    • 123
    • 124
    • 125
    • 126
    • 127
    • 128
    • 129
    • 130
    • 131
    • 132
    • 133
    • 134
    • 135
    • 136
    • 137
    • 138
    • 139
    • 140
    • 141
    • 142
    • 143
    • 144
    • 145
    • 146
    • 147
    • 148
    • 149
    • 150
    • 151
    • 152
    • 153
    • 154
    • 155
    • 156
    • 157
    • 158
    • 159
    • 160
    • 161
    • 162
    • 163

    4. 生命周期流程图(新)

    在这里插入图片描述

    • 生命周期的三个阶段(新)
    4.1 初始化阶段: 由 ReactDOM.render()触发—初次渲染
    • constructor()
    • getDerivedStateFromProps
    • render()
    • componentDidMount()
    4.2 更新阶段: 由组件内部 this.setSate()或父组件重新 render 触发
    • getDerivedStateFromProps
    • shouldComponentUpdate()
    • render()
    • getSnapshotBeforeUpdate
    • componentDidUpdate()
    4.3 卸载组件: 由 ReactDOM.unmountComponentAtNode()触发
    • componentWillUnmount()
    DOCTYPE html>
    <html lang="en">
    <head>
    	<meta charset="UTF-8">
    	<title>3_react生命周期(新)title>
    head>
    <body>
    	
    	<div id="test">div>
    
    	
    	<script type="text/javascript" src="../js/17.0.1/react.development.js">script>
    	
    	<script type="text/javascript" src="../js/17.0.1/react-dom.development.js">script>
    	
    	<script type="text/javascript" src="../js/17.0.1/babel.min.js">script>
    
    	<script type="text/babel">
    		//创建组件
    		class Count extends React.Component{
    			/*
    				1. 初始化阶段: 由ReactDOM.render()触发---初次渲染
    								1.	constructor()
    								2.	getDerivedStateFromProps
    								3.	render()
    								4.	componentDidMount() =====> 常用
    											一般在这个钩子中做一些初始化的事,例如:开启定时器、发送网络请求、订阅消息
    				2. 更新阶段: 由组件内部this.setSate()或父组件重新render触发
    								1.	getDerivedStateFromProps
    								2.	shouldComponentUpdate()
    								3.	render()
    								4.	getSnapshotBeforeUpdate
    								5.	componentDidUpdate()
    				3. 卸载组件: 由ReactDOM.unmountComponentAtNode()触发
    								1.	componentWillUnmount()  =====> 常用
    											一般在这个钩子中做一些收尾的事,例如:关闭定时器、取消订阅消息
    			*/
    			//构造器
    			constructor(props){
    				console.log('Count---constructor');
    				super(props)
    				//初始化状态
    				this.state = {count:0}
    			}
    
    			//加1按钮的回调
    			add = ()=>{
    				//获取原状态
    				const {count} = this.state
    				//更新状态
    				this.setState({count:count+1})
    			}
    
    			//卸载组件按钮的回调
    			death = ()=>{
    				ReactDOM.unmountComponentAtNode(document.getElementById('test'))
    			}
    
    			//强制更新按钮的回调
    			force = ()=>{
    				this.forceUpdate()
    			}
    
    			//若state的值在任何时候都取决于props,那么可以使用getDerivedStateFromProps
    			static getDerivedStateFromProps(props,state){
    				console.log('getDerivedStateFromProps',props,state);
    				return null
    			}
    
    			//在更新之前获取快照
    			getSnapshotBeforeUpdate(){
    				console.log('getSnapshotBeforeUpdate');
    				return 'atguigu'
    			}
    
    			//组件挂载完毕的钩子
    			componentDidMount(){
    				console.log('Count---componentDidMount');
    			}
    
    			//组件将要卸载的钩子
    			componentWillUnmount(){
    				console.log('Count---componentWillUnmount');
    			}
    
    			//控制组件更新的“阀门”
    			shouldComponentUpdate(){
    				console.log('Count---shouldComponentUpdate');
    				return true
    			}
    
    			//组件更新完毕的钩子
    			componentDidUpdate(preProps,preState,snapshotValue){
    				console.log('Count---componentDidUpdate',preProps,preState,snapshotValue);
    			}
    
    			render(){
    				console.log('Count---render');
    				const {count} = this.state
    				return(
    					<div>
    						<h2>当前求和为:{count}</h2>
    						<button onClick={this.add}>点我+1</button>
    						<button onClick={this.death}>卸载组件</button>
    						<button onClick={this.force}>不更改任何状态中的数据,强制更新一下</button>
    					</div>
    				)
    			}
    		}
    
    		//渲染组件
    		ReactDOM.render(<Count count={199}/>,document.getElementById('test'))
    	script>
    body>
    html>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115

    请添加图片描述

    DOCTYPE html>
    <html lang="en">
    <head>
    	<meta charset="UTF-8">
    	<title>4_getSnapShotBeforeUpdate的使用场景title>
    	<style>
    		.list{
    			width: 200px;
    			height: 150px;
    			background-color: skyblue;
    			overflow: auto;
    		}
    		.news{
    			height: 30px;
    		}
    	style>
    head>
    <body>
    	
    	<div id="test">div>
    
    	
    	<script type="text/javascript" src="../js/17.0.1/react.development.js">script>
    	
    	<script type="text/javascript" src="../js/17.0.1/react-dom.development.js">script>
    	
    	<script type="text/javascript" src="../js/17.0.1/babel.min.js">script>
    
    	<script type="text/babel">
    		class NewsList extends React.Component{
    
    			state = {newsArr:[]}
    
    			componentDidMount(){
    				setInterval(() => {
    					//获取原状态
    					const {newsArr} = this.state
    					//模拟一条新闻
    					const news = '新闻'+ (newsArr.length+1)
    					//更新状态
    					this.setState({newsArr:[news,...newsArr]})
    				}, 1000);
    			}
    
    			getSnapshotBeforeUpdate(){
    				return this.refs.list.scrollHeight
    			}
    
    			componentDidUpdate(preProps,preState,height){
    				this.refs.list.scrollTop += this.refs.list.scrollHeight - height
    			}
    
    			render(){
    				return(
    					<div className="list" ref="list">
    						{
    							this.state.newsArr.map((n,index)=>{
    								return <div key={index} className="news">{n}</div>
    							})
    						}
    					</div>
    				)
    			}
    		}
    		ReactDOM.render(<NewsList/>,document.getElementById('test'))
    	script>
    body>
    html>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68

    5. 重要的勾子

    • render:初始化渲染或更新渲染调用
    • componentDidMount:开启监听,发送 ajax 请求
    • componentWillUnmount:做一些收尾工作,如:清理定时器

    6. 即将废弃的勾子

    • componentWillMount
    • componentWillReceiveProps
    • componentWillUpdate

    现在使用会出现警告,下一个大版本需要加上 UNSAFE_前缀才能使用,以后可能会被彻底废弃,不建议使用。

    七、虚拟 DOM 与 DOM Diffing 算法

    1. 效果

    请添加图片描述

    2. 基本原理图

    请添加图片描述

    3. 代码

    DOCTYPE html>
    <html>
    <head>
      <meta charset="UTF-8">
      <title>1_验证diff算法title>
    head>
    <body>
    	
    	<div id="test">div>
    
    	
    	<script type="text/javascript" src="../js/17.0.1/react.development.js">script>
    	
    	<script type="text/javascript" src="../js/17.0.1/react-dom.development.js">script>
    	
    	<script type="text/javascript" src="../js/17.0.1/babel.min.js">script>
    
    	<script type="text/babel">
    		class Time extends React.Component {
    			state = {date: new Date()}
    
    			componentDidMount () {
    				setInterval(() => {
    					this.setState({
    						date: new Date()
    					})
    				}, 1000)
    			}
    
    			render () {
    				return (
    					<div>
    						<h1>hello</h1>
    						<input type="text"/>
    						<span>
    							现在是:{this.state.date.toTimeString()}
    							<input type="text"/>
    						</span>
    					</div>
    				)
    			}
    		}
    
    		ReactDOM.render(<Time/>,document.getElementById('test'))
    script>
    body>
    html>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47

    请添加图片描述
    请添加图片描述
    请添加图片描述

    DOCTYPE html>
    <html>
    <head>
      <meta charset="UTF-8">
      <title>2_key的作用title>
    head>
    <body>
    <div id="test">div>
    
    <script type="text/javascript" src="../js/react.development.js">script>
    
    <script type="text/javascript" src="../js/react-dom.development.js">script>
    
    <script type="text/javascript" src="../js/babel.min.js">script>
    
    <script type="text/babel">
    	/*
       经典面试题:
          1). react/vue中的key有什么作用?(key的内部原理是什么?)
          2). 为什么遍历列表时,key最好不要用index?
    
    			1. 虚拟DOM中key的作用:
    					1). 简单的说: key是虚拟DOM对象的标识, 在更新显示时key起着极其重要的作用。
    
    					2). 详细的说: 当状态中的数据发生变化时,react会根据【新数据】生成【新的虚拟DOM】,
    												随后React进行【新虚拟DOM】与【旧虚拟DOM】的diff比较,比较规则如下:
    
    									a. 旧虚拟DOM中找到了与新虚拟DOM相同的key:
    												(1).若虚拟DOM中内容没变, 直接使用之前的真实DOM
    												(2).若虚拟DOM中内容变了, 则生成新的真实DOM,随后替换掉页面中之前的真实DOM
    
    									b. 旧虚拟DOM中未找到与新虚拟DOM相同的key
    												根据数据创建新的真实DOM,随后渲染到到页面
    
    			2. 用index作为key可能会引发的问题:
    								1. 若对数据进行:逆序添加、逆序删除等破坏顺序操作:
    												会产生没有必要的真实DOM更新 ==> 界面效果没问题, 但效率低。
    
    								2. 如果结构中还包含输入类的DOM:
    												会产生错误DOM更新 ==> 界面有问题。
    
    								3. 注意!如果不存在对数据的逆序添加、逆序删除等破坏顺序操作,
    									仅用于渲染列表用于展示,使用index作为key是没有问题的。
    
    			3. 开发中如何选择key?:
    								1.最好使用每条数据的唯一标识作为key, 比如id、手机号、身份证号、学号等唯一值。
    								2.如果确定只是简单的展示数据,用index也是可以的。
       */
    
    	/*
    		慢动作回放----使用index索引值作为key
    
    			初始数据:
    					{id:1,name:'小张',age:18},
    					{id:2,name:'小李',age:19},
    			初始的虚拟DOM:
    					
  • 小张---18
  • 小李---19
  • 更新后的数据: {id:3,name:'小王',age:20}, {id:1,name:'小张',age:18}, {id:2,name:'小李',age:19}, 更新数据后的虚拟DOM:
  • 小王---20
  • 小张---18
  • 小李---19
  • ----------------------------------------------------------------- 慢动作回放----使用id唯一标识作为key 初始数据: {id:1,name:'小张',age:18}, {id:2,name:'小李',age:19}, 初始的虚拟DOM:
  • 小张---18
  • 小李---19
  • 更新后的数据: {id:3,name:'小王',age:20}, {id:1,name:'小张',age:18}, {id:2,name:'小李',age:19}, 更新数据后的虚拟DOM:
  • 小王---20
  • 小张---18
  • 小李---19
  • */
    class Person extends React.Component{ state = { persons:[ {id:1,name:'小张',age:18}, {id:2,name:'小李',age:19}, ] } add = ()=>{ const {persons} = this.state const p = {id:persons.length+1,name:'小王',age:20} this.setState({persons:[p,...persons]}) } render(){ return ( <div> <h2>展示人员信息</h2> <button onClick={this.add}>添加一个小王</button> <h3>使用index(索引值)作为key</h3> <ul> { this.state.persons.map((personObj,index)=>{ return <li key={index}>{personObj.name}---{personObj.age}<input type="text"/></li> }) } </ul> <hr/> <hr/> <h3>使用id(数据的唯一标识)作为key</h3> <ul> { this.state.persons.map((personObj)=>{ return <li key={personObj.id}>{personObj.name}---{personObj.age}<input type="text"/></li> }) } </ul> </div> ) } } ReactDOM.render(<Person/>,document.getElementById('test'))
    script> body> html>
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119
    • 120
    • 121
    • 122
    • 123
    • 124
    • 125
    • 126
    • 127
    • 128
    • 129
    • 130
    • 131
    • 132
    • 133
    • 134
    • 135
    • 136
    • 137
    • 138
  • 相关阅读:
    数据结构-二叉排序树(建立、查找、修改)
    数智化时代下,看S2B2C供应链商城系统如何赋能珠宝首饰行业增长新引擎
    计算机视觉算法——DETR / Deformable DETR / DETR 3D
    用python实现自动回复QQ消息——不到60行
    高频经典算法题汇总
    C++模板编程(23)---模板实例化小结summary
    Si3262 集成低功耗SOC 三合一智能门锁应用芯片
    周赛361(模拟、枚举、记忆化搜索、统计子数组数目(前缀和+哈希)、LCA应用题)
    Flink / Scala- BroadCast 广播流数据先到再处理 Source 数据
    lua # 获取table数组长度
  • 原文地址:https://blog.csdn.net/sgsgkxkx/article/details/132630250