【04】基础知识:React组件实例三大核心属性 - state

一、state 了解

理解

1、state 是组件对象最重要的属性,值是对象(可以包含多个 key-value 的组合)

2、组件被称为 "状态机", 通过更新组件的 state 来更新对应的页面显示(重新渲染组件)

强烈注意

1、组件中 render 方法中的 this 为组件实例对象

2、组件自定义的方法中 this 为 undefined,如何解决?

a)、强制绑定 this:通过函数对象的 bind()

b)、自定义方法使用:赋值语句+箭头函数

3、状态数据,不能直接修改或更新,需要通过 setState 方法进行修改

二、案例

定义一个展示天气信息的组件,默认展示天气炎热 或 凉爽,点击文字切换天气

基础写法(了解)

html 复制代码
<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>state</title>
</head>
<body>
	<!-- 准备好一个"容器" -->
	<div id="test"></div>
	
	<!-- 引入react核心库 -->
	<script type="text/javascript" src="../js/react.development.js"></script>
	<!-- 引入react-dom,用于支持react操作DOM -->
	<script type="text/javascript" src="../js/react-dom.development.js"></script>
	<!-- 引入babel,用于将jsx转为js -->
	<script type="text/javascript" src="../js/babel.min.js"></script>

	<script type="text/babel">
		// let that // ********了解:定义变量,缓存this

		// 1、创建组件
		class Weather extends React.Component {
			// 构造器调用几次?------------ 1次,实例化组件时调用
			constructor(props) { // props为组件三大属性二,后续学习
				console.log('constructor')
				super(props)
				// 初始化状态
				this.state = { isHot: false, wind: '微风' }
				// that = this // ********了解:赋值this给that

				// 解决changeWeather中this指向问题(获取原型上的changeWeather,修改this指向为实例对象,返回新函数,挂载在实例自身)
				this.changeWeather = this.changeWeather.bind(this)
			}

			// render调用几次?------------ 1+n次,实例化组件时调用1次、n是状态更新的次数
			render() {
				console.log('render')
				const { isHot, wind } = this.state
				return <h2 onClick={ this.changeWeather }>今天天气很 { isHot ? '炎热' : '凉爽' }, { wind }</h2>

				// ********了解:定义changeWeather在类外部
				// return <h2 onClick={changeWeather}>今天天气很 { isHot ? '炎热' : '凉爽' }, { wind }</h2>
			}

			// changeWeather调用几次?------------ 点几次调几次
			changeWeather() {
				// changeWeather放在哪里?------------ Weather的原型对象上,供实例使用
				// console.log(this) // undefined
				// 由于changeWeather是作为onClick的回调,所以不是通过实例调用的,是直接调用
				// 类中的方法默认开启了局部的严格模式,所以changeWeather中的this为undefined
				console.log('changeWeather')

				const { isHot } = this.state
				// 严重注意:状态必须通过setState进行更新,且更新是一种合并,不是替换。
				this.setState({ isHot: !isHot })

				// 严重注意:状态(state)不可直接更改
				// this.state.isHot = !isHot // 错误写法,React中值未改变
			}
		}

		// 2、渲染组件到页面
		ReactDOM.render(<Weather/>, document.getElementById('test'))

		 // ********了解:定义在类外部,一般不这么写
		// function changeWeather() {
		// 	console.log(this) // this为undefined,因为babel会将jsx转换为严格模式,严格模式下自定义函数中this为undefined
		// 	console.log(that.state)
		// }
	</script>
</body>
</html>

简化写法(常用)

html 复制代码
<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>state简写方式</title>
</head>
<body>
	<!-- 准备好一个"容器" -->
	<div id="test"></div>
	
	<!-- 引入react核心库 -->
	<script type="text/javascript" src="../js/react.development.js"></script>
	<!-- 引入react-dom,用于支持react操作DOM -->
	<script type="text/javascript" src="../js/react-dom.development.js"></script>
	<!-- 引入babel,用于将jsx转为js -->
	<script type="text/javascript" src="../js/babel.min.js"></script>

	<script type="text/babel">
		// 1、创建组件
		class Weather extends React.Component {
			// constructor构造器不需要时可省略

			// 初始化状态:类中可以直接写赋值语句,如下代码的含义是:给Weather的实例对象添加一个属性state
			state = { isHot: false, wind: '微风' }

			render() {
				const { isHot, wind } = this.state
				return <h2 onClick={ this.changeWeather }>今天天气很 { isHot ? '炎热' : '凉爽' }, { wind }</h2>
			}

			// 自定义方法:要用赋值语句的形式(将changeWeather放在实例对象上,而不是原型对象上)+ 箭头函数(箭头函数没有this,指向父级的this,为实例对象)
			changeWeather = () => {
				console.log(this)
				const { isHot } = this.state
				this.setState({ isHot: !isHot })
			}
		}

		// 2、渲染组件到页面
		ReactDOM.render(<Weather/>, document.getElementById('test'))
	</script>
</body>
</html>

三、原生事件绑定方法

1、element.addEventListener(事件名, 方法)

2、element.onclick = 方法

3、直接在标签上绑定

html 复制代码
<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8" />
		<title>Document</title>
	</head>
	<body>
		<button id="btn1">按钮1</button>
		<button id="btn2">按钮2</button>
		<button onclick="demo()">按钮3</button>

		<script type="text/javascript">
			const btn1 = document.getElementById('btn1')
			btn1.addEventListener('click', () => {
				alert('按钮1被点击了')
			})

			const btn2 = document.getElementById('btn2')
			btn2.onclick = () => {
				alert('按钮2被点击了')
			}

			function demo(){
				alert('按钮3被点击了')
			}
		</script>
	</body>
</html>

注意:

React 对原生 javascript 中所有的事件做了一层封装

比如,onclick 在 React 中需要写为 onClick

相关推荐
计算机毕设定制辅导-无忧学长11 分钟前
Redis 主从复制搭建与理解
前端·bootstrap·html
reembarkation26 分钟前
vue2中使用 v-html 指令渲染的标签, 标签内绑定的 click 事件
前端·vue.js·html
网络安全-老纪28 分钟前
web 浏览器安全攻防
前端·安全
m0_7482495429 分钟前
【JavaEE】Spring Web MVC
前端·spring·java-ee
星空你好29 分钟前
cursor 编程测试,记录写一个全栈完整的crud的过程
javascript·vue·springboot·elementplus·cursor
皮蛋很白38 分钟前
IOS safari 播放 mp4 遇到的坎儿
前端·ios·safari·video.js
接着奏乐接着舞。1 小时前
如何在 Three.js 地球飞线中间生成卡片
开发语言·javascript·ecmascript
shadowflies1 小时前
组件库TDesign的表格<t-table>的使用,行列合并以及嵌入插槽实现图标展示,附踩坑
前端·javascript·vue.js·vue·tdesign
GesLuck1 小时前
C#控件开发3—文本显示、文本设值
前端·c#
轻口味1 小时前
【每日学点鸿蒙知识】屏幕高度、证书签名、深色模式对上架影响、Taskpool上下文、List触底加载更多
前端·华为·harmonyos