React快速入门之交互性

响应事件

  • 创建事件处理函数
    处理函数名常以handle+事件名命名
  function handlePlayClick() {alert(`Playing`);}
  • 传递事件处理函数
    函数名、匿名两种方式!
function PlayButton() {function handlePlayClick() {alert(`Playing`);}return (<Button handleClick={handlePlayClick}>Play "{movieName}"</Button>);
}function UploadButton() {return (<Button handleClick={() => alert('Uploading!')}>Upload Image</Button>);
}
  • 接受事件处理函数
    传参、匿名两种方式(⚠️传递的是函数名handlePlayClick并非handlePlayClick()!后者会在组件渲染时执行!)
  • onClick:事件名,仅支持浏览器事件名称。
function Button({ handleClick}) {function handlePlayClick() {alert(`Playing`);}return (<div><button onClick={handlePlayClick}></button><button onClick={handleClick}></button>// 匿名<button onClick={() => alert('Uploading!')}></button></div>);
}

事件传播

  • 事件“冒泡”
    单击3号button,会触发自身的onClick事件,接着事件会冒泡上传;
    2号button没有满足当前事件的函数,不执行,事件继续冒泡上传;
    1号div存在满足当前事件的函数,触发1号div响应的函数,事件继续冒泡上传…
<div id={1} className="Toolbar" onClick={() => {alert('You clicked on the toolbar!');}}><button id={2} onDoubleClick={() => alert('Playing!')}><button id={3} onClick={() => alert('Uploading!')}>Uploading</button></button></div>
  • 阻止事件传播:e.stopPropagation()
    事件处理函数接收事件对象e(代表 “event”)作为唯一的参数。
    在事件名称末尾添加 Capture获取被捕获的事件,eg:onClickCapture
<div id={1} className="Toolbar" onClick={e => {e.stopPropagation();alert('You clicked on the toolbar!');}}>......
</div>
  • e.preventDefault(): 阻止了少数事件的默认浏览器行为
    例如在表单提交事件中,浏览器默认会刷新整个页面,e.preventDefault()可以阻止这一行为。
    <form onSubmit={e => {e.preventDefault();alert('Submitting!');}}>......</form>

Hooks :以 use 开头的函数

⚠️只能在组件或自定义的钩子函数的顶层被调用。 不能在条件、循环或其他嵌套函数中调用

状态:useState

  • 导入
import { useState } from 'react';
  • 使用
    0是默认值
    something 是状态变量,setSomething 是设置函数。(均为自定义)
const [something, setSomething] = useState(0);

纯粹原则表明应视something为只读,应通过setSomething函数创建一个新的值去更新!

1. something是一个对象时
  • 更新person对象部分属性
function handleChange(e) {setPerson({firstName: e.target.value, // New first name from the inputlastName: person.lastName,email: person.email});}
  • 展开对象写法
function handleChange(e) {setPerson({...person, // Copy the old fieldsfirstName: e.target.value // But override this one});}
  • 动态[变量名]写法
function handleChange(e) {setPerson({...person,[e.target.name]: e.target.value});}
  • 当要修改的对象属性名被嵌套太深,可以使用Immer三方库
import React from "react";
import { useImmer } from "use-immer";function App() {......function updateName(name) {updatePerson(draft => {draft.name = name;});}......
}
2. something是一个数组时
  • 添加元素
setArtists([...artists,{ id: nextId++, name: name } // Put new item at the end
]);setArtists([{ id: nextId++, name: name }, // Put new item at the head...artists 
]);
  • 删除元素
setArtists(artists.filter(a => a.id !== artist.id)
);
  • 使用返回新数组的方法(a:元素,i:下标)
    map():遍历每个元素
    filter():返还条件为true的元素
artists.map(a => <li>a/<li>)
artists.map((a,i) => <li key={i}>a/<li>)artists.filter(a => a.id !== artist.id)
artists.filter((a,i) => i<10)
  • 需要使用原地操作数组的方法时,使用slice()方法拷贝数组后,操作新数组。
    ⚠️这种拷贝都是浅拷贝(新数组中的对象仍然是对原始对象的引用)
/ 拷贝
let citrus = [...fruits] / 拷贝
let citrus = fruits.slice(); / 全部拷贝
let citrus = fruits.slice(1, 3); / 拷贝fruits[13/ 操作
const item = citrus.find(a => a.id === 2);
citrus.reverse();
citrus.sort();
/ 更新
setFruits(citrus);
  • 当然,当数组元素为对象时,仍要创建一个新的值去更新
    setMyList(myList.map(artwork => {return { ...artwork, seen: nextSeen };}));
  • 使用Immer三方库简化数组嵌套

状态与渲染

  • ⚠️React将something状态值存储在组件之外(组件存储的只是状态值的快照),每次setSomething()更改的是组件外的状态值,当组件“稳定”(没有代码在执行)后,React会更改DOM从而触发组件渲染,通过渲染将更新后的状态值刷新到页面!!!
    在这里插入图片描述
  • 代码中number默认为0
    当点击🔘+5时,alert(number)的值仍然是0!
import { useState } from 'react';export default function Counter() {const [number, setNumber] = useState(0);return (<><h1>{number}</h1><button onClick={() => {setNumber(number + 5);alert(number);}}>+5</button></>)
}
  • 那如果需要多次修改状态值时,怎么办?传入函数(参数名通常为状态值首字母)
setNumber(n => n + 1);
setNumber(n => n + 1);
setNumber(n => n + 1);
setEnabled(e => !e);
setLastName(ln => ln.reverse());
setFriendCount(fc => fc * 2);

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

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

相关文章

网站显示不安全警告怎么办?消除网站不安全警告超全指南

网站显示不安全警告怎么办&#xff1f;当用户访问你的网站&#xff0c;而您的网站没有部署SSL证书实现HTTPS加密时&#xff0c;网站就会显示不安全警告&#xff0c;这种警告&#xff0c;不仅有可能阻止用户继续浏览网站&#xff0c;影响网站声誉&#xff0c;还有可能影响网站在…

Android 8.1 设置USB传输文件模式(MTP)

项目需求&#xff0c;需要在电脑端adb发送通知手机端接收指令&#xff0c;将USB的仅充电模式更改成传输文件&#xff08;MTP&#xff09;模式&#xff0c;便捷用户在我的电脑里操作内存文件&#xff0c;下面是我们的常见的修改方式 1、android12以下、android21以上是这种方式…

纸质版表格怎么用扫描仪转换成电子版表格

要将纸质版表格转换成电子版表格&#xff0c;可以使用以下步骤&#xff1a; 1、准备一台物理扫描仪并与电脑连接好&#xff0c;并安装好驱动。 2、打开安装好的金鸣表格文字识别电脑客户端。 3、点击“扫描文件”&#xff0c;在弹出的对话框中选中需要使用的扫描仪。 4、点击“…

法线贴图可以实现什么样的3D效果

在线工具推荐&#xff1a; 3D数字孪生场景编辑器 - GLTF/GLB材质纹理编辑器 - 3D模型在线转换 - Three.js AI自动纹理开发包 - YOLO 虚幻合成数据生成器 - 三维模型预览图生成器 - 3D模型语义搜索引擎 在 3D 建模中&#xff0c;曲面由多边形表示。照明计算是基于这些多边…

成考生必看!2023年成人高考录取后入学拿证流程

成人高考录取后并不是就可以坐等拿证了&#xff01; 成人高考录取后你还有这些事情要做。 一起来了解一下吧&#xff01; 成人高考入学到拿证流程 办理入学流程 1.入学时间 确认被高校录取后&#xff0c;12月下旬左右开始办理入学(实际时间以各院校安排为准&#xff09; 2.缴…

【28】Kotlin语法进阶——使用协程编写高效的并发程序

提示&#xff1a;此文章仅作为本人记录日常学习使用&#xff0c;若有存在错误或者不严谨得地方欢迎指正。 文章目录 一、Kotlin中的协程1.1 协程的基本用法1.1.1协程与协程作用域1.1.2 使用launch函数创建子协程1.1.3 通过suspend关键声明挂起函数1.1.4 coroutineScope函数 1.2…

Arduino串口测试

目录 一、硬件介绍 1、控制器 2、TTL转USB串口 二、软件程序 1、单片机发送字符串 &#xff08;1&#xff09;每个串口对应的类名称介绍 &#xff08;2&#xff09;发送功能 &#xff08;3&#xff09;代码 &#xff08;4&#xff09;测试 2、单片机接收字符串 &…

鸿蒙开发之android对比开发《基础知识》

基于华为鸿蒙未来可能不再兼容android应用&#xff0c;推出鸿蒙开发系列文档&#xff0c;帮助android开发人员快速上手鸿蒙应用开发。 1. 鸿蒙使用什么基础语言开发&#xff1f; ArkTS是鸿蒙生态的应用开发语言。它在保持TypeScript&#xff08;简称TS&#xff09;基本语法风…

记录 | ubuntu源码编译python3.7.3(指定版本)

一、安装依赖包 sudo apt-get install -y make build-essential libssl-dev zlib1g-dev sudo apt-get install -y libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm sudo apt-get install -y libncurses5-dev libncursesw5-dev xz-utils tk-dev 二、从Python网…

二叉树数据结构:深入了解二叉树的概念、特性与结构

在探索栈和队列之后&#xff08;大家可以移步至我的数据结构专栏&#xff09;&#xff1a;T-rLN的数据结构专栏 我们转向了更为复杂而有趣的数据结构——二叉树。本文将引领我们进入二叉树的世界&#xff0c;从最基本的概念和结构开始&#xff0c;逐步深入了解二叉树的顺序结构…

听GPT 讲Rust源代码--src/tools(30)

File: rust/src/tools/clippy/clippy_lints/src/casts/cast_slice_from_raw_parts.rs 在Rust源代码中&#xff0c;cast_slice_from_raw_parts.rs文件位于rust/src/tools/clippy/clippy_lints/src/casts/目录下&#xff0c;它是Clippy工具中的一个lint&#xff0c;用于检查通过f…

【技巧】7z分卷压缩文件如何解压?

7z分卷压缩格式是一种常用的文件压缩格式&#xff0c;可以在压缩文件时将文件分割成多个独立的文件&#xff0c;更方便储存或者传输。那压缩好的7z分卷文件要如何解压呢&#xff1f;不清楚的小伙伴一起来看看吧。 想要解压7z分卷压缩文件&#xff0c;需要用到支持7z格式的解压…

Springboot拦截器及统一异常处理

文章目录 一、Java中异常相关概念1、异常类2、异常处理方法3、注意事项4、自定义异常 二、配置全局异常处理1、统一返回体定义2、定义异常处理实现类3、全局异常处理类 三、Springboot拦截器1、定义拦截器2、注册拦截器 四、验证效果 一、Java中异常相关概念 1、异常类 Throw…

微信小程序登录用户信息、手机号、照片等隐私api不能使用解决的方案

问题 突然小程序不能使用用户信息、手机号、图片上传的功能 例如这种错误 "getUserProfile:fail api scope is not declared in the privacy agreement" 定位问题 经过微信社区查询得知 为规范开发者的用户个人信息处理行为&#xff0c;保障用户的合法权益&…

(2)llvm解析器和抽象语法树

解析器的输出是抽象语法树 对于数字字面量&#xff0c;创造了一个实例&#xff0c;并捕捉 变量捕捉函数名&#xff1b;二元表达式捕捉运算符&#xff1b;函数调用捕捉函数名和函数调用参数 函数原型和函数定义 构建语法树 getNextToken会从输入流里拿一个token&#xff0c;Cur…

2023年中职“网络安全”——B-5:网络安全事件响应(Server2216)

B-5&#xff1a;网络安全事件响应 任务环境说明&#xff1a; 服务器场景&#xff1a;Server2216&#xff08;开放链接&#xff09; 用户名:root密码&#xff1a;123456 1、黑客通过网络攻入本地服务器&#xff0c;通过特殊手段在系统中建立了多个异常进程&#xff0c;找出启…

医院安全(不良)事件报告系统源码 支持二次开发、支持源码交付

医疗不良事件报告系统源码旨在建立全面的、统一的医疗不良事件标准分类系统和患者安全术语&#xff0c;使不良事件上报管理更加标准化和科学化。通过借鉴国内外医疗不良事件报告系统的先进经验&#xff0c;根据医疗不良事件的事件类型、处理事件的不同部门&#xff0c;灵活设置…

How to Develop Word Embeddings in Python with Gensim

https://machinelearningmastery.com/develop-word-embeddings-python-gensim/ 本教程分为 6 个部分;他们是&#xff1a; 词嵌入 Gensim 库 开发 Word2Vec 嵌入 可视化单词嵌入 加载 Google 的 Word2Vec 嵌入 加载斯坦福大学的 GloVe 嵌入 词嵌入 单词嵌入是一种提供单词的…

Android Jetpack之用Room+ViewModel+LiveData实现增删改查数据(createFromAsset())

文章目录 一、Room简介二、用RoomViewModelLiveData增删改查数据三、下载源码 一、Room简介 Room是Google推出的数据库框架&#xff0c;是一个 ORM (Object Relational Mapping)对象关系映射数据库、其底层还是对SQLite的封装。 Room包含三个主要组件&#xff1a; 数据库类&…

润和软件HopeStage与亚信安全云主机深度安全防护系统完成产品兼容性互认证

近日&#xff0c;江苏润和软件股份有限公司&#xff08;以下简称“润和软件”&#xff09;HopeStage 操作系统与亚信科技&#xff08;成都&#xff09;有限公司&#xff08;以下简称“亚信安全”&#xff09;云主机深度安全防护系统完成兼容性测试。 测试结果表明&#xff0c;企…