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

news/2024/7/15 18:07:22 标签: react.js, javascript, 前端

一、props 了解

理解

1、每个组件对象都会有 props(properties的简写)属性

2、组件标签的所有属性都保存在 props 中

作用

通过标签属性从组件外向组件内传递变化的数据

注意

组件内部不要修改 props 数据

二、案例

需求:自定义用来显示一个人员信息的组件

姓名必须指定,且为字符串类型;

性别为字符串类型,如果性别没有指定,默认为男

年龄为字符串类型,默认为18

1、基本使用

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>props基本使用</title>
</head>
<body>
	<!-- 准备好一个“容器” -->
	<div id="test1"></div>
	<div id="test2"></div>
	<div id="test3"></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">javascript">
		// 1、创建组件
		class Person extends React.Component {
			// state是在组件内部定义数据,通过 this.state.xxx 访问
			// state = { name: 'jerry', sex: '男', age: '19' }

			render() {
				console.log(this) // Person组件的实例对象

				// 通过Person组件实例的props属性接收外部传入数据
				const { name, sex, age } = this.props
				return (
					<ul>
						<li>姓名:{ name }</li>
						<li>性别:{ sex }</li>
						<li>年龄:{ age }</li>
					</ul>
				)
			}
		}

		// 2、渲染组件到页面
		ReactDOM.render(<Person name="jerry" sex="男" age={19}/>, document.getElementById('test1'))
		ReactDOM.render(<Person name="tom" sex="女" age={18}/>, document.getElementById('test2'))

		// 模拟api返回数据处理(批量传递属性)
		const p = { name: '老刘', sex: '女', age: 18 }
		// ReactDOM.render(<Person name={p.name} sex={p.sex} age={p.age}/>, document.getElementById('test3'))
		// 简写 (返回数据p中的数据项(name、sex、age...)必须存在,否则取不到值)
		ReactDOM.render(<Person {...p}/>, document.getElementById('test3'))

		/* ... 展开运算符 */
		// <Person {...p}/> 中的 {} 代表要在此处写js表达式,并不是字面量对象
		// ... 不能遍历对象,babel+react 允许使用 ... 遍历对象,仅适用于标签属性传递
		console.log('展开运算符', ...p)
	</script>
</body>
</html>

2、对 props 进行限制

React 中使用 propTypes 对标签属性进行类型、必要性的限制

React.PropTypes 形式 React v15.5 开始已弃用

React v15.5 及以后版本以后引入 prop-types 库,对组件标签属性进行限制

React 中使用 defaultProps 指定默认标签属性值

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>对props进行限制</title>
</head>
<body>
	<!-- 准备好一个“容器” -->
	<div id="test1"></div>
	<div id="test2"></div>
	<div id="test3"></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>
	<!-- 引入prop-types,用于对组件标签属性进行限制,全局有PropTypes对象 -->
	<script type="text/javascript" src="../js/prop-types.js"></script>

	<script type="text/babel">javascript">
		class Person extends React.Component {
			render () {
				const { name, sex, age } = this.props
				// this.props.speak() // 执行传入方法

				// props是只读的
				// this.props.name = 'jack' // 此行代码会报错,因为props是只读的
				return (
					<ul>
						<li>姓名:{ name }</li>
						<li>性别:{ sex }</li>
						<li>年龄:{ age + 1 }</li>
					</ul>
				)
			}
		}

		// 伪代码
		Person.属性规则 = {
			name: '必传,字符串',
			sex: '非必传,字符串,默认男',
			age: '非必传,数字,默认18'
		}

		// React 中使用 propTypes 对标签属性进行类型、必要性的限制
		Person.propTypes = {
			// name: React.PropTypes.string.isRequired, // React v15.5 开始已弃用
			name: PropTypes.string.isRequired, // 限制name必传,且为字符串
			sex: PropTypes.string, // 限制sex为字符串
			age: PropTypes.number, // 限制age为数字
			speak: PropTypes.func // 限制speak为函数(function会和关键字冲突,改为使用func)
		}

		// React 中使用 defaultProps 指定默认标签属性值
		Person.defaultProps = {
			sex: '男', // sex默认值为男
			age: 18 // age默认值为18
		}

		ReactDOM.render(<Person name="jerry" speak={speak}/>, document.getElementById('test1'))
		ReactDOM.render(<Person name="tom" sex="女" age={18} speak={speak}/>, document.getElementById('test2'))

		// 给实例传入方法,限制传入方法必须为函数
		function speak() {
			console.log('我说话了')
		}
	</script>
</body>
</html>

3、props 的简写方式

使用 static 关键字,给类自身添加属性;将 propTypes、defaultProps 写在类中

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>对props进行限制</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>
	<!-- 引入prop-types,用于对组件标签属性进行限制 -->
	<script type="text/javascript" src="../js/prop-types.js"></script>

	<script type="text/babel">javascript">
		class Person extends React.Component {

			constructor(props) {
				// 构造器是否接收props,是否传递给super,取决于:是否希望在构造器中通过this访问props
				// console.log(props)
				super(props)
				console.log('constructor', this.props)
			}

			/* 简化写法:使用static关键字,给类自身添加属性 */

			// 对标签属性进行类型、必要性的限制
			static propTypes = {
				name: PropTypes.string.isRequired, // 限制name必传,且为字符串
				sex: PropTypes.string, // 限制sex为字符串
				age: PropTypes.number, // 限制age为数字
			}
			// 指定标签默认属性值
			static defaultProps = {
				sex: '男', // sex默认值为男
				age: 18 // age默认值为18
			}

			render() {
				const { name, sex, age } = this.props
				return (
					<ul>
						<li>姓名:{name}</li>
						<li>性别:{sex}</li>
						<li>年龄:{age + 1}</li>
					</ul>
				)
			}
		}

		ReactDOM.render(<Person name="jerry" />, document.getElementById('test'))
	</script>
</body>
</html>

4、函数组件使用 props

函数式组件,可以通过接收参数形式使用 props;props 会收集所有传递的标签属性

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>对props进行限制</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>
	<!-- 引入prop-types,用于对组件标签属性进行限制 -->
	<script type="text/javascript" src="../js/prop-types.js"></script>

	<script type="text/babel">javascript">
		function Person(props) {
			const { name, age, sex } = props
			return (
				<ul>
					<li>姓名:{ name }</li>
					<li>性别:{ sex }</li>
					<li>年龄:{ age }</li>
				</ul>
			)
		}

		// React 中使用 propTypes 对标签属性进行类型、必要性的限制
		Person.propTypes = {
			name: PropTypes.string.isRequired, // 限制name必传,且为字符串
			sex: PropTypes.string, // 限制sex为字符串
			age: PropTypes.number, // 限制age为数字
		}

		// React 中使用 defaultProps 指定标签默认属性值
		Person.defaultProps = {
			sex: '男', // sex默认值为男
			age: 18 // age默认值为18
		}

		ReactDOM.render(<Person name="jerry" />, document.getElementById('test'))
	</script>
</body>
</html>

三、展开运算符了解

<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8" />
	<title>Document</title>
</head>

<body>
	<script type="text/javascript">javascript">
		let arr1 = [1, 3, 5, 7, 9]
		/* 1、展开一个数组 */
		console.log(...arr1) // 1 3 5 7 9

		/* 2、连接数组 */
		let arr2 = [2, 4, 6, 8, 10]
		let arr3 = [...arr1, ...arr2]
		console.log(arr3) // [1, 3, 5, 7, 9, 2, 4, 6, 8, 10]

		/* 3、不定参数(在函数中使用) */
		function sum(...numbers) {
			return numbers.reduce((preValue, currentValue) => {
				return preValue + currentValue
			})
		}
		console.log(sum(1, 2, 3, 4)) // 10

		/* 4、构造字面量对象时使用展开语法 */
		let person = { name: 'tom', age: 18 }

		// 4.1、深拷贝一层
		let person2 = { ...person } 
		person.name = 'jerry'
		console.log(person) // {name: 'jerry', age: 18}
		console.log(person2) // {name: 'tom', age: 18}

		// console.log(...person) // 报错,展开运算符不能展开对象
		
		// 4.2、合并
		let person3 = { ...person, name: 'jack', address: '地球' }
		console.log(person3) // {name: 'jack', age: 18, address: '地球'}
	</script>
</body>
</html>

http://www.niftyadmin.cn/n/5087781.html

相关文章

01Maven的工作机制: Maven作为依赖管理工具以及Maven作为构建管理工具

Maven的特点及其应用 Maven是Apache软件基金会组织维护的一款专门为Java项目提供构建和依赖管理支持的工具 Maven作为依赖管理工具 管理jar包的规模: 随着我们使用的框架数量越来越多以及框架的封装程度也越来越高&#xff0c;项目中使用的jar包也就越来越多 Maven工程中依…

在网络安全、爬虫和HTTP协议中的重要性和应用

1. Socks5代理&#xff1a;保障多协议安全传输 Socks5代理是一种功能强大的代理协议&#xff0c;支持多种网络协议&#xff0c;包括HTTP、HTTPS和FTP。相比之下&#xff0c;Socks5代理提供了更高的安全性和功能性&#xff0c;包括&#xff1a; 多协议支持&#xff1a; Socks5代…

微服务+Java+Spring Cloud +UniApp +MySql智慧工地综合管理云平台源码,SaaS模式

智慧工地围绕工程现场人、机、料、法、环及施工过程中质量、安全、进度、成本等各项数据满足工地多角色、多视角的有效监管,实现工程建设管理的降本增效. 智慧工地综合管理云平台源码&#xff0c;PC监管端、项目端&#xff1b;APP监管端、项目端、数据可视化大屏端源码&#xf…

python 并发请求,转发

python 并发请求&#xff0c;转发 http://t.csdnimg.cn/snSm5 另外&#xff1a;如果想要随机入参&#xff0c;可以参考加入随机数 #codingutf-8 import requests import json import threading import time import uuid import random class postrequests(): def init(self):…

【农业生产系统模型】基于R语言APSIM模型进阶应用与参数优化、批量模拟实践技术

随着数字农业和智慧农业的发展&#xff0c;基于过程的农业生产系统模型在模拟作物对气候变化的响应与适应、农田管理优化、作物品种和株型筛选、农田固碳和温室气体排放等领域扮演着越来越重要的作用。APSIM (Agricultural Production Systems sIMulator)模型是世界知名的作物生…

分享 5 个关于正则表达式的实际应用场景

在计算机编程的广泛领域中&#xff0c;某些技术具有改变我们如何处理和提取文本内容中信息的能力。在这些强大工具中&#xff0c;正则表达式成为每个开发者工具库中基本且不可或缺的组成部分。正则表达式&#xff0c;通常被称为 RegEx &#xff0c;为程序员提供了高效且多功能的…

VC++OpenCV配置

VCOpenCV配置 说明 安装目录 E:\repo-c\opencv\build VC目录 包含目录 E:\repo-c\opencv\build\include\opencv2 E:\repo-c\opencv\build\include库目录 E:\repo-c\opencv\build\x64\vc15\lib链接器→输入 附加依赖项 opencv_world454d.lib注&#xff1a;Debug就用d结尾…

ideal远程Debug部署在服务器上的服务详解

ideal远程Debug部署在服务器上的服务详解 一 简介二 ideal配置步骤第一步&#xff1a;点击Edit Configurations选项添加远程连接第二步&#xff1a;配置Remote JVM debug参数第三步&#xff1a;服务的启动参数中添加第二步生成的命令并重新启动服务第四步&#xff1a;ideal启动…