React学习笔记五-props

news2024/9/28 19:28:24

此文章是本人在学习React的时候,写下的学习笔记,在此纪录和分享。此为第五篇,主要介绍react中的props。

目录

1.props的基本使用

 2.props的批量传递

2.1展开运算符的复习

2.1.1数组中的展开运算符

 2.1.2函数中的展开运算符

 2.1.3构造字面量对象时使用展开语法

2.2展开运算符与props 

3.对props进行限制

4.props的简写方式

5.类式组件中构造器和props

6.函数式组件与props

6.1函数式组件中使用props

 6.2函数式组件内限制props

7.props的总结


1.props的基本使用

我们先来写一个小案例,将一个人的姓名,性别和年龄分别以li的形式渲染到页面上,要渲染多个人的。

这时候我先写好类式组件,在render函数内写上const {name,age,sex} = this.props,将实例中的props解构赋值,方便我们构建虚拟dom时候渲染props内的name,age和sex。

最后在ReactDOM.render内,我们写组件名字的时候,在组件内把name,age和sex传进去。

就像是<Person name='张三' sex='男' age='18'/>的形式。如此我们组件创建的实例中的props属性内就存在了name,sex和age三个数据,在render函数生成虚拟dom时会直接拿取props内的数据。

代码如下:

<!-- 准备好容器 -->
    <div id="test1"></div>
    <div id="test2"></div>
    <div id="test3"></div>
<script src="https://cdn.staticfile.org/react/16.4.0/umd/react.development.js"></script>
    <script src="https://cdn.staticfile.org/react-dom/16.4.0/umd/react-dom.development.js"></script>
    <script src="https://cdn.staticfile.org/babel-standalone/6.26.0/babel.min.js"></script>

    <script type="text/babel">
        class Person extends React.Component {
            render(){
                console.log(this);//打印this指向的实例对象,查看props属性
                const {name,age,sex} = this.props//解构赋值
                return(//构建虚拟dom
                    <ul>
                        <li>姓名:{name}</li>
                        <li>性别:{sex}</li>
                        <li>年龄:{age}</li>    
                    </ul>
                )
            }
           
        }
        //分别渲染dom到三个容器内
        ReactDOM.render(<Person name='张三' sex='男' age='18'/>, document.getElementById('test1'))
        ReactDOM.render(<Person name='李四' sex='女' age='19'/>, document.getElementById('test2'))
        ReactDOM.render(<Person name='王五' sex='男' age='20'/>, document.getElementById('test3'))
    </script>

效果如下:

 2.props的批量传递

2.1展开运算符的复习

在学习props的批量转递的时候,我们要先复习一下展开运算符,也就是三点运算符。

2.1.1数组中的展开运算符

如下两个数组,展开运算符可以将一个数组中的每一项展开显示,也可以将两个数组拼接在一起成为一个新的数组。

代码如下:

let arr1 = [1, 3, 5, 7, 9]
let arr2 = [2, 4, 6, 8, 10]
console.log(...arr1);//展开数组
let arr3 = [...arr1, ...arr2]
console.log(arr3);//拼接数组

效果如下:

 2.1.2函数中的展开运算符

我们写一个求和函数,在传参的时候使用展开运算符。首先打印一下参数,发现用展开运算符传承的时候,传递的参数会变成一个数组。然后我们正常运行函数,输出结果保证函数求和功能没有问题。

代码如下:

function sum(...numbers) {
            console.log(numbers);
            return numbers.reduce((preValue, currentValue) => {
                return preValue + currentValue
            })
        }
        console.log(sum(1, 2, 3, 4));

效果如下:

 2.1.3构造字面量对象时使用展开语法

我们先写这样的代码:

let person = {name:'tom', age:18}
console.log(...person);//报错。展开运算符不可以展开对象

效果如下:

 所以,展开运算符不可以展开对象。

但是看下面的代码:

 let person = {name:'tom', age:18}
 let person2 = {...person}
 console.log(person2);

效果如下:

 我们使用展开运算符展开了person,并赋值给person2,实现了深拷贝。即使我们再去更改person里的内容,person2的内容也不会改变。

代码如下:我们再写一个person3.

 let person3 = {...person,name:'jack',address:'地球'}
        console.log(person3);

效果如下:person3是person和新的属性产生了合并,一致的属性产生了覆盖。

2.2展开运算符与props 

还是上面的案例,我们尝试使用展开运算符在ReactDOM.render内的组件内使用。

代码如下:我们直接写一个对象存储name,sex和age,并赋值给p。在ReactDOM.render内的组件props内,我们使用了展开运算符,把name,sex和age三个数据一次性批量传入,简单快捷。

ReactDOM.render(<Person name='李四' sex='女' age={19} />, document.getElementById('test2'))
       
const p = { name:'王五', sex:'男', age:19 }
ReactDOM.render(<Person {...p}/>, document.getElementById('test3'))

3.对props进行限制

上面基本使用的案例,如果我们对name,sex和age的类型分别限定为string,string和number,并且规定name属性不可为空,sex和age都有默认值,那该怎么办呢?

代码如下:

先引入propTypes库,这个依赖包就是限定props需要的包。

 <!-- 新引入的库,用于限定props传入值的类型,propTypes -->
    <script src="https://cdn.bootcss.com/prop-types/15.6.1/prop-types.js"></script>

然后我们使用Person.propTypes为Person内的各种属性设置类型限定和不可为空。

使用Person.defaultProps为Person内的属性设置默认值。

注意,设置属性的时候,string,number这些类型都是小写的,function类型写为func。

//在引入相应的依赖包后,才能使用本代码对数据类型进行限定
        Person.propTypes = {//为Person的数据设置类型限定
            name:PropTypes.string.isRequired,//限定name必须为string类型,并且不得为空
            sex:PropTypes.string,//限制sex为string类型
            age:PropTypes.number,//限定age为number类型
            speak:PropTypes.func//限定speak为function类型
        }
        Person.defaultProps = {//为Person的数据设置默认数据
            sex:'性别未知',//为sex设置默认值
            age:18//设置age默认值为18
        }
        //分别渲染dom到三个容器内
        ReactDOM.render(<Person name='张三' sex='男' age={18} speak={speak}/>, document.getElementById('test1'))
        ReactDOM.render(<Person name='李四' sex='女' age={19}/>, document.getElementById('test2'))
        ReactDOM.render(<Person name='王五' sex='男' age={19}/>, document.getElementById('test3'))

        function speak() {
            console.log('我说话了');
        }

写完后,可以尝试违反类型限制为属性传入不同类型的值,这时候在控制台会清楚的指出因为数据类型不同的报错。

4.props的简写方式

代码如下:我们把对数据设置类型限定和设置默认数据的代码,加上static关键字,转移到创建组件的类里面。注意不要写到render函数内。这样props代码部分,放在组件内,比较简洁规范。

//创建组件
        class Person extends React.Component {
            static propTypes = {//为Person的数据设置类型限定
                name: PropTypes.string.isRequired,//限定name必须为string类型,并且不得为空
                sex: PropTypes.string,//限制sex为string类型
                age: PropTypes.number,//限定age为number类型
                speak: PropTypes.func//限定speak为function类型
            }
            //指定默认标签属性值
            static defaultProps = {//为Person的数据设置默认数据
                sex: '性别未知',//为sex设置默认值
                age: 18//设置age默认值为18
            }
            render() {
                console.log(this);//打印this指向的实例对象,查看props属性
                const { name, age, sex } = this.props//解构赋值
                return (//构建虚拟dom
                    <ul>
                        <li>姓名:{name}</li>
                        <li>性别:{sex}</li>
                        <li>年龄:{age}</li>
                    </ul>
                )
            }

        }

5.类式组件中构造器和props

constructor在类式组件的作用是什么?我们来看react官网的解释:

通常,在React中,构造函数仅用于以下两种情况:

        1.通过给this.state赋值对象来初始化内部state

        2.为事件处理函数绑定实例。

其实在书写类式组件的时候,可以不写构造器。如果写了构造器,也可以不接收props这个参数,super()内也可以不写,但如果如此,console.log('constructor',this.props);这行代码就会打印undefined,就是在构造器中没有办法通过实例.props去取得值。

代码如下:

constructor(props){
      console.log(props);
      super(props)
      console.log('constructor',this.props);
}

结果:

 不接收props的情况:

constructor(){ 
     super()
     console.log('constructor',this.props);
}

结果:

 所以,构造器是否接收props,是否传递props给super关键字,这就取决于:是否希望在构造器中通过this,访问props。但这个场景及其罕见,如果没有这个需求,构造器都可以直接省略,能省就省。

6.函数式组件与props

对于实例三大属性,函数式组件不可以使用state和ref,但可以使用props,因为它可以接收参数。

6.1函数式组件中使用props

我们在函数式组件内直接接收参数props,在ReactDOM.render(<Person name='张三' sex='男' age={18} />, document.getElementById('test1'))渲染组件到界面时接收参数,name='张三' sex='男' age={18} 这三条传入的数据会自动保存到函数式组件内的props里面,以对象的形式存在。我们使用解构赋值对props解构后,直接拿到虚拟dom里面使用。

代码如下:

function Person(props) {
            const { name, age, sex } = props
            return (//构建虚拟dom
                <ul>
                    <li>姓名:{name}</li>
                    <li>性别:{sex}</li>
                    <li>年龄:{age}</li>
                </ul>
            )
        }
        //渲染组件到界面
        ReactDOM.render(<Person name='张三' sex='男' age={18} />, document.getElementById('test1'))

效果如下:

 6.2函数式组件内限制props

与类式组件类似,我们写 组件名.propTypes和组件名.defaultProps来限制props的数据类型和设置默认数据。写完后可以传入任意类型数据,或者不写数据,看看控制台的输出,发现限制和默认设置没有问题。

代码如下:

function Person(props) {
            const { name, age, sex } = props
            return (//构建虚拟dom
                <ul>
                    <li>姓名:{name}</li>
                    <li>性别:{sex}</li>
                    <li>年龄:{age}</li>
                </ul>
            )
        }
        Person.propTypes = {//为Person的数据设置类型限定
            name: PropTypes.string.isRequired,//限定name必须为string类型,并且不得为空
            sex: PropTypes.string,//限制sex为string类型
            age: PropTypes.number,//限定age为number类型
        }
        Person.defaultProps = {//为Person的数据设置默认数据
            sex: '性别未知',//为sex设置默认值
            age: 18//设置age默认值为18
        }
        //渲染组件到界面
        ReactDOM.render(<Person name='张三'/>, document.getElementById('test1'))

7.props的总结

理解:

1.每个组件对象都会有props属性。

2.组件标签的所有属性都报存到props属性中。

作用:

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

2.注意:组件内部不要修改props数据。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/546350.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

部署图的画法

部署图画法 1.部署图 1.1含义 部署图是把软件制品装配到计算机节点以及配置软件环境的工作 软件部署包含环境部署和软件制品部署 1.2软件部署 软件部署通过部署图对软件进行建模 1.3部署图 部署图常见的有制品 节点 设备 运行环境和部署规范 1.4部署图关系 在UML&…

UnityVR--Managers--对象池2

目录 前言 基本结构 对象池代码 对象池管理器代码 使用 总结 前言 经过上一篇对象池1的了解&#xff0c;已经做到了使用Unity自带的ObjectPool进行内存优化。本篇自己构建一个对象池管理器&#xff08;Manager&#xff09;&#xff0c;实现对象池的创建、删除、加载资源…

机器视觉工程师很苦吗?年轻人不怕苦,就怕学不到东西,机器视觉销售>项目经理>视觉>电气>机械>老板

年轻人不怕苦&#xff0c;就怕学不到东西。 对于年轻人来说&#xff0c;需要规划&#xff0c;更需要发展。如果学不到东西&#xff0c;就会限制其发展&#xff0c;最重要的体现就是限制待遇上限。 一个非标自动化公司出差的频次&#xff08;各个公司略有差别&#xff0c;大多…

062:cesium设置泛光折线材质(material-6)

第062个 点击查看专栏目录 本示例的目的是介绍如何在vue+cesium中设置泛光折线材质,请参考源代码,了解PolylineGlowMaterialProperty的应用。 直接复制下面的 vue+cesium源代码,操作2分钟即可运行实现效果. 文章目录 示例效果配置方式示例源代码(共89行)相关API参考:专…

蓝桥:前端开发笔面必刷题——Day2 数组(三)

文章目录 &#x1f4cb;前言&#x1f3af;两数之和 II&#x1f4da;题目内容✅解答 &#x1f3af;移除元素&#x1f4da;题目内容✅解答 &#x1f3af;有序数组的平方&#x1f4da;题目内容✅解答 &#x1f3af;三数之和&#x1f4da;题目内容✅解答 &#x1f4dd;最后 &#x…

Cloud Studio 内核升级之持续优化

前言 Cloud Studio 是基于浏览器的集成式开发环境&#xff08;IDE&#xff09;&#xff0c;为开发者提供了一个永不间断的云端工作站。用户在使用 Cloud Studio 时无需安装&#xff0c;随时随地打开浏览器就能使用。云端开发体验与本地几乎一样&#xff0c;上手门槛更低&#…

Xcode 14.3 和 iOS 16.4 为 SwiftUI 带来了哪些新功能?

0. 概览 今年年初&#xff0c;Apple 推出了最新的 Xcode 14.3 以及对应的 iOS 16.4 。 与此同时&#xff0c;它们对目前最新的 SwiftUI 4.0 也添加了一些新功能&#xff1a; sheet 弹窗后部视图&#xff08;Interact with a view Behind a sheet&#xff09;可交互&#xff…

头歌计算机组成原理实验—运算器设计(7) 第7关:6位有符号补码阵列乘法器

第7关&#xff1a;6位有符号补码阵列乘法器 实验目的 帮助学生掌握补码阵列乘法器的实现原理。 视频讲解 实验内容 在 Logisim 中打开 alu.circ 文件&#xff0c;在6位补码阵列乘法器中利用5位阵列乘法器以及求补器等部件实现补码阵列乘法器&#xff0c;实验框架如图所示&a…

Linux - Shell 权限 权限管理 权限修改 权限身份的认证 目录的权限 粘滞位

shell命令以及运行原理 我们来输入指令的本质就是 输入字符串。 而指令的本质&#xff0c;就是编译好的文件和脚本&#xff0c;而只要是文件&#xff0c;就会在系统的特定路径下存放。 我们使用所有的指令最终都要在 OS &#xff08;操作系统&#xff09;内部运行&#xff0c;…

〖Python网络爬虫实战㉖〗- Selenium库和ChromeDriver驱动的安装

订阅&#xff1a;新手可以订阅我的其他专栏。免费阶段订阅量1000 python项目实战 Python编程基础教程系列&#xff08;零基础小白搬砖逆袭) 说明&#xff1a;本专栏持续更新中&#xff0c;目前专栏免费订阅&#xff0c;在转为付费专栏前订阅本专栏的&#xff0c;可以免费订阅付…

【C++】内存泄漏 智能指针

目录 一、什么是内存泄漏二、如何检测内存泄漏1、内存占用变化排查法2、valgrind定位法3、mtrace定位法 三、智能指针分类及作用1、unique_ptr2、shared_ptr3、weak_ptr 一、什么是内存泄漏 在实际的 C 开发中&#xff0c;我们经常会遇到诸如程序运行中突然崩溃、程序运行所用…

关于 HTTPS 的加密流程

目录 HTTP 与 HTTPS 的区别加密方式HTTPS 基本工作过程1. 仅使用对称密钥2. 引入非对称密钥对 key 进行加密3. 引入证书, 破解中间人攻击 HTTP 与 HTTPS 的区别 其实 HTTPS 与 HTTP 一样都是应用层协议, HTTPS 只是在 HTTP 的基础上再加上了一个加密层. 为啥要对 HTTP 进行加密…

bugku---misc

一.telnet 下载后是一个压缩包 条件反射&#xff0c;先丢在wireshark中看一下&#xff0c; 直接搜flag&#xff0c;就 出来了 Data: flag{d316759c281bf925d600be698a4973d5} 二.简单取证1 之前只做过取证大赛的&#xff0c;但是这个没有啥思路&#xff0c;看了一下需要工具m…

Redis集群简介及槽位映射(哈希取余和一致性哈希算法)

redis cluster需求至少需要3个master才能组成一个集群&#xff0c;同时每个sentinel至少有一个slave节点&#xff0c;各个节点之间保持tcp通信。当master发生宕机&#xff0c;redis cluster自动将对应的slave节点提拔为master,来重新对外提供服务。 先来说一下槽&#xff0c;集…

从“被动发现”变为“主动感知”|智能井盖脚下安全守护者

井盖作为城市基础设施的重要组成部分&#xff0c;具有关键的作用。城市的管道网络错综复杂&#xff0c;包括雨水、污水、弱电和强电等。其中&#xff0c;雨水和污水管道的管径较大&#xff0c;可能会导致隐藏或其他安全事故的发生。而弱电井则是整个城市信息传输的重要环节&…

Java 基础进阶篇(十四):File 类常用方法

File 类的对象代表操作系统的文件&#xff08;文件、文件夹&#xff09;&#xff0c;File 类在 java.io.File 包下。 File 类提供了诸如&#xff1a;创建文件对象代表文件&#xff0c;获取文件信息&#xff08;大小、修改时间&#xff09;、删除文件、创建文件&#xff08;文件…

Java【文件和IO】File 类, 字节IO流的使用

文章目录 前言一、File 类1, 构造方法2, 成员方法 二、字节流输入输出1, 字节流输入 InputStream1.1, 每次输入一个字节1.2, 每次输入多个字节 2, 字节流输出 OutputStream2.1, 每次输出一个字节2.2, 每次输出多个字节 总结 前言 各位读者好, 我是小陈, 这是我的个人主页, 希望…

chatgpt赋能Python-python3__2怎么算

Python3中<<2的计算方法 Python3是一种高级编程语言&#xff0c;它具有强大的数据分析和计算能力。在Python3中&#xff0c;<<2是一种用于移位计算的运算符。在本篇文章中&#xff0c;我们将介绍Python3中<<2的计算方法。 什么是移位运算符 移位运算符是一…

C++基础语法——内存管理

1. C/C中的内存管理 我们先看如下一段代码 #include <iostream>using namespace std;int globalVar 1; static int staticGlobalVar 1;void Test() {static int staticVar 1;int localVar 1;int num1[10] { 1, 2, 3, 4 };char char2[] "abcd";const ch…

rk3399 buildroot ubuntu20版本编译遇到问题

一、编译uboot遇到问题 /usr/include/libfdt.h:258:1: error: redefinition of fdt_set_version 258 | fdt_set_hdr_(version); | ^~~~~~~~~~~~ In file included from tools/fdt_host.h:11, from tools/imagetool.h:22, from tools…