React03-props 和 state 详解

一、props 组件传参

1. props 基本使用

我们在使用组件时可以向组件传递数据,在组件内可以使用 props 对象来调用传入的数据。

function Person(props) {return <div><h3>姓名:{props.name}</h3><h3>年龄:{props.age}</h3></div>;
}export default function () {return <Person name='zhangsan' age='20'></Person>;
}

直接在组件定义中传入 props 参数,使用组件时直接在属性列表中就可以使用了,props 即为传入的参数组成的对象。

注意:

  • props 是只读的,组件内不能修改 props。
  • 如果 props 的数据源被修改,那组件内得到的 props 数据也会随着修改,即数据驱动 DOM。

2. 设置 props 初始值

(1) 设置 defaultProps

可以给组件设置 defaultProps 属性的方式来设置 props 的初始值。

function Person(props) {return <div><h3>姓名:{props.name}</h3><h3>年龄:{props.age}</h3></div>;
}
Person.defaultProps = {age: 25
};export default function () {return <Person name='zhangsan'></Person>;
}

这里我们给 Person 组件设置了 age 参数的默认值为25,传递参数时没有传 age,页面上的 age 就为默认的25。

(2) 使用解构语法

使用 es6 的解构语法可以轻松拆分 props 并设置默认值。

function Person({ name, age = 30 }) {return <div><h3>姓名:{name}</h3><h3>年龄:{age}</h3></div>;
}export default function () {return <Person name='zhangsan'></Person>;
}

使用解构语法提取出 props 中的 name 和 age,并为 age 属性设置了默认值为30。

注意:使用解构语法,在获取 props 中的 name 属性时直接写 name,而不需要 props.name。

3. props.children

props.children 是我们在调用组件时,填充在组件标签中的内容。

function Person(props) {return (<div><h3>hello world</h3>{props.children}</div>);
}export default function () {return (<Person><h3>hello web</h3><h3>hello</h3></Person>);
}

这里我们给 Person 标签内传入了一个 h3 标签,在 Person 组件中通过 props.children 获取到并渲染到页面上。

props.children 的内容如下:

可以看到, props.children 是一个由传入的标签组成的虚拟 DOM 数组。

props 的注意事项:

  • props 用于传递数据,这个数据是单向传递,从父组件传递给子组件,逆向传递是不被允许的。
  • 子组件如果想修改父组件的状态,需要父组件给子组件传递事件方法。

4. 传递事件方法

使用组件时可以以参数的形式传递事件方法给子组件,子组件可以直接使用。

function Person(props) {function click() {console.log(props.onEvent());}return (<div><button onClick={click}>事件点击</button></div>);
}export default function () {function click() {return '我来自于父组件';}return (<Person onEvent={click}></Person>);
}

在这个案例中,我们传递了一个 click 方法给子组件,子组件中在自己的 click 方法中调用父组件传来的 click 方法。点击按钮时,控制台会打印出 “我来自于父组件”。 

二、state 状态管理

组件通常需要根据用户交互更改页面上显示的内容,使用普通的变量来渲染数据,在变量改变时并不会触发页面改变。这时就需要使用 state 来记录动态数据的状态,在 state 更新时进行页面渲染修改数据。

如以下计数器案例:

function Counter() {let count = 0;function add() {count++;}return (<div><h3>{count}</h3><button onClick={add}>+</button></div>);
}export default function () {return (<Counter />);
}

 

count 是一个普通变量,点击按钮 count 变量自增,但并不会触发页面重新渲染,因此点击按钮不会起作用。

1. useState Hook 的使用

要添加 state 变量,需要先导入 useSate。

import { useState } from 'react';

下面是修改后的计数器应用:

function Counter() {const [count, setCount] = useState(0);function add() {setCount(count + 1);}return (<div><h3>{count}</h3><button onClick={add}>+</button></div>);
}export default function () {return (<Counter />);
}

在这个案例中,我们使用 const [count, setCount] = useState(0) 定义了一个 state 变量 count,默认值为0。其中,count 为 state 变量,setCount 为 count 的 setter 方法,用于设置 count 变量新的状态值。在点击按钮时调用 setCount 方法设置 count 为 count 自增后的值。

需要注意,state 变量是只读的,修改它的值需要使用 setCount 方法。

2. state 渲染和提交

3. 更新 state 中的对象

4. 更新 state 中的数组

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

接口测试-postman,JMeter与LoadRunner比较

目录 JMeter与LoadRunner比较 JMeter缺点 一.创建测试用例集、子集 二.创建测试用例 三.设置变量 四.添加响应处理 五.批量执行测试用例 总结&#xff1a; postman是一个谷歌出的轻量级的专门测试接口的小工具~&#xff08;PS&#xff1a;postman包括两种&#xff1a;C…

【项目部署】NGINX原生部署前端

如有拼错的单词感谢提醒~ 一.准备工作 为了方便文件的管理&#xff0c;我们先在服务器上创建一个专门存放项目的目录。 # 1.查看当前所在目录 pwd # 1.1 可以切换到根目录管理 cd /root # 2.创建一个专门存放项目的文件夹 mkdir services # 3.可以查看我们创建的文件夹 ls # …

【精致的美少女-InsCode Stable Diffusion 美图活动一期】

&#x1f4a7; 【精致的美少女 − I n s C o d e S t a b l e D i f f u s i o n 美图活动一期】 \color{#FF1493}{【精致的美少女-InsCode Stable Diffusion 美图活动一期】} 【精致的美少女−InsCodeStableDiffusion美图活动一期】&#x1f4a7; &#x1f337; 仰望…

Abaqus_Python 基于abqpy的python3版本的二次开发【没写完,慢慢更新】

前言 介绍abaqus和python二次开发的教程较少&#xff0c;而比较常见的一种python二次开发方法是&#xff1a;使用PythonReader.exe去读取Abaqus运行后的内部生成代码&#xff08;即对应temp目录下的abaqus.rpy&#xff0c;例如“Abaqus\temp\abaqus.rpy”&#xff09;再粘贴到…

【Linux】Selinux基本了解

文章目录 SElinux1.简介2.基本概念3.规则4.策略5.工作模式 SElinux 1.简介 SELinux是一个内核级别的安全机制&#xff0c;从Linux2.6内核之后就将SELinux集成在了内核当中。因为SELinux是内核级别的&#xff0c;所以我们对于其配置文件的修改都是需要重新启动操作系统才能生效…

小狐狸ChatGPT付费创作系统V2.1.0独立版 +WEB端+ H5端 + 小程序端安装教程

播播资源针对ChatGPT付费创作系统V2.1.0提供最新的对应版本小程序端全套测试&#xff0c;上一版本增加了PC端绘画功能&#xff0c;绘画功能采用其他绘画接口-意间AI&#xff0c;本版新增了百度文心一言接口。后台一些小细节的优化及一些小BUG的处理&#xff0c;前端进行了些小细…

【运维知识进阶篇】zabbix5.0稳定版详解6(zabbix自动化监控:自动发现+自动注册+监控项目主动式)

本篇文章继续给大家介绍zabbix自动化监控&#xff0c;包括zabbix自动注册&#xff0c;zabbix自动发现&#xff0c;将主机添加进服务端之后需要做的监控项目更改为主动式&#xff0c;zabbix说多不多&#xff0c;说少不少&#xff0c;其实远没有监控那么简单&#xff0c;更深层次…

【实证分析】地区竞争、推广数字普惠金融与绿色经济效率

研究内容 基于考虑非期望产出的 Super-SBM 模型测算了 2011—2018 年中国 265 个地级市的绿色经济效率,综合运用面板模型、空间杜宾模型,系统分析了地区竞争下推广数字普惠金融对绿色经济效率的影响效应。研究发现:(1)绿色经济效率存在显著正向空间溢出效应,地理距离与经济差异…

部署LVS-DR群集博客

文章目录 部署LVS-DR群集一.LVS数据包流向分析1.数据包流向2.DR 模式的特点 二.LVS-DR中ARP的问题1.问题11.1 解决办法 2.问题22.1 解决办法 三.LVS-DR特性1.LVS-DR模式需要注意2.优点3.缺点 四.案例&#xff0c;构建LVS-DR集群部署1.LVS-DR集群构架图2.DR模式 LVS负载均衡群集…

测试Hyperledger Fabric环境

首先进入fabric-samples目录中的first-networked 子目录 cd fabric-samples/first-network 在first-network目录下有一个自动化脚本byfn.sh,可以使用-help参数查看相应的可 用命令&#xff0c;在命令提示符中输入如下命令&#xff1a; ./byfn.sh --help命令执行成功后&#…

短视频矩阵系统源码自研+开发技术文档

一、短视频矩阵系统源码自研&#xff08;站在开发者交付分析&#xff09; 目录 一、短视频矩阵系统源码自研&#xff08;站在开发者交付分析&#xff09; 二、 短视频矩阵系统需要开发的前提语言框架技巧&#xff1a;NGINX&#xff0c;PHP7.4&#xff0c;MySQL5.7&#xff0…

聚焦云原生安全攻防|构建纵深防御的运行时威胁检测体系

7月2日&#xff0c;诸子云北京分会研讨会活动—网络安全攻防对抗在北京成功举办。作为国内云原生安全领导厂商&#xff0c;安全狗也参与此次活动。 近年来&#xff0c;国际网络空间安全威胁事件发生频率越来越高、影响范围越来越大&#xff0c;对国内不断依赖5G、云计算等新兴…