React快速入门之交互性

news2024/11/17 6:00:31

响应事件

  • 创建事件处理函数
    处理函数名常以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 input
  		lastName: person.lastName,
  		email: person.email
	});
  }
  • 展开对象写法
function handleChange(e) {
    setPerson({
  		...person, // Copy the old fields
  		firstName: 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://www.coloradmin.cn/o/1338958.html

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

相关文章

信息科技成“新课标”重点,家长必须要懂!

日新月异的当下&#xff0c;人工智能无疑是与生活最为密切相关的核心词语。或许在不远的将来&#xff0c;技术含量低的重复性工作将会被机器取代。甚至有人认为&#xff0c;现在的小学生&#xff0c;大概多数会在未来从事目前尚未发明出来的工作。 近年来&#xff0c;我国的教…

微信消息撤回拦截:x64dbg反汇编实现揭秘

在数字世界中&#xff0c;信息传递的速度快如闪电&#xff0c;但也常常伴随着一些遗憾。微信作为我们日常生活中最常用的通讯工具之一&#xff0c;其撤回功能让许多人在发出信息后有了后悔的机会。然而&#xff0c;有时候我们却希望能够拦截这些即将被撤回的信息。通过x64dbg反…

YOLOv7+Pose姿态估计+tensort部署加速

YOLOv7是一种基于深度学习的目标检测算法&#xff0c;它能够在图像中准确识别出不同目标的位置和分类。而姿态估计pose和tensort则是一种用于实现人体姿态估计的算法&#xff0c;可以对人体的关节位置和方向进行精准的检测和跟踪。 下面我将分点阐述YOLOv7姿态估计posetensort…

用 Unity 实现的安检模拟小游戏源码,通过安检设备 (扫描仪) 检查乘客的随身物品 根据禁止名单对乘客做出判断是否允许通行

介绍 用 Unity 实现的安检模拟小游戏 软件版本 Unity 2019.4.9f1 (64-bit) Visual Studio 2019 游戏玩法 在游戏中你将扮演一名安全检查员 通过安检设备 (扫描仪) 检查每位乘客的随身物品 根据禁止名单对乘客做出判断&#xff1a;允许通行或者下令逮捕 游戏效果 游戏截图…

maven工具的搭建以及使用

文章目录 &#x1f412;个人主页&#x1f3c5;JavaEE系列专栏&#x1f4d6;前言&#xff1a;&#x1f380;首先进行maven工具的搭建&#x1f993;1.[打开下载 maven 服务器官网](http://maven.apache.org)&#x1fa85;2.解压之后&#xff0c;配置环境变量&#x1f3e8;3.打开设…

【SAM系列】I-MedSAM: Implicit Medical Image Segmentation with Segment Anything

论文链接&#xff1a;https://arxiv.org/abs/2311.17081 比较有趣的点&#xff1a;frequency adapter

数据结构课设迷宫问题

迷宫问题 【问题描述】以一个mn的长方阵表示迷宫&#xff0c;0和1分别表示迷宫中的通路和障碍。设计一个程序&#xff0c;对任意设定的迷宫&#xff0c;求出一条从入口到出口的通路&#xff0c;或得出没有通路的结论。 【基本要求】编写一个求解迷宫的非递归程序。求得的通路…

微信小程序获取手机号

1、先新建vue页面 打开看到页面是下图 在method定义方法 源码&#xff1a; <template><view><button type"primary" open-type"getPhoneNumber" getphonenumber"getPhoneNumberFn">登录</button><view class"&…

Explain分析-Mysql索引优化(三)

欢迎大家关注我的微信公众号&#xff1a; 传送门&#xff1a;Explain分析——索引优化实践 传送门&#xff1a;Explain分析-Mysql索引优化&#xff08;二&#xff09; 目录 分页查询优化 Join关联查询优化 in和exsits优化 count(*)查询优化 分页查询优化 示例表&am…

115基于matlab的用于铣削动力学建模的稳定性叶瓣图分析(stablity lobe)

基于matlab的用于铣削动力学建模的稳定性叶瓣图分析(stablity lobe)&#xff0c;程序已调通&#xff0c;可直接运行。 115matlab铣削动力学 (xiaohongshu.com)

HarmonyOS的功能及场景应用

一、基本介绍 鸿蒙HarmonyOS主要应用的设备包括智慧屏、平板、手表、智能音箱、IoT设备等。具体来说&#xff0c;鸿蒙系统是一款面向全场景(移动办公、运动健康、社交通信、媒体娱乐等)的分布式操作系统&#xff0c;能够支持手机、平板、智能穿戴、智慧屏、车机等多种终端设备…

SpringBoot 3.2.0 结合Redisson接入Redis

依赖版本 JDK 17 Spring Boot 3.2.0 Redisson 3.25.0 工程源码&#xff1a;Gitee 集成Redis步骤 导入依赖 <properties><redisson.version>3.25.0</redisson.version> </properties> <dependencies><dependency><groupId>org.pr…

无需手动搜索!轻松创建IntelliJ IDEA快捷方式的Linux教程

轻松创建IntelliJ IDEA快捷方式的Linux教程 一、IntelliJ IDEA简介二、在Linux系统中创建快捷方式的好处三、命令行创建IntelliJ IDEA快捷方式四、图形界面创建IntelliJ IDEA快捷方式五、常见问题总结 一、IntelliJ IDEA简介 IntelliJ IDEA是一个由JetBrains搞的IDE&#xff0…

Bridge桥模式(单一职责)

目的 链接&#xff1a;桥模式实例代码 解析 由于某些类型的固有的实现逻辑&#xff0c;使得它们具有两个变化的维度&#xff0c;乃至多个纬度的变化。 如何应对这种“多维度的变化”&#xff1f;如何利用面向对象技术来使得类型可以轻松地沿着两个乃至多个方向变化&#xff…

算法模板之单调栈和单调队列图文详解

&#x1f308;个人主页&#xff1a;聆风吟 &#x1f525;系列专栏&#xff1a;算法模板、数据结构 &#x1f516;少年有梦不应止于心动&#xff0c;更要付诸行动。 文章目录 &#x1f4cb;前言一. ⛳️单调栈讲解1.1 &#x1f514;单调栈的定义1.2 &#x1f514;如何维护一个单…

Socket与字节序

一、Socket "Socket"&#xff08;套接字&#xff09;是计算机网络编程中的一个重要概念&#xff0c;它提供了一种在网络上进行进程间通信的机制。套接字是一种抽象&#xff0c;它允许程序通过网络发送和接收数据。在通常的情况下&#xff0c;套接字用于实现不同计算…

【论文阅读+复现】SparseCtrl: Adding Sparse Controls to Text-to-Video Diffusion Models

SparseCtrl:在文本到视频扩散模型中添加稀疏控制。 &#xff08;AnimateDiff V3&#xff0c;官方版AnimateDiffControlNet&#xff0c;效果很丝滑&#xff09; code&#xff1a;GitHub - guoyww/AnimateDiff: Official implementation of AnimateDiff. paper&#xff1a;htt…

数据库开发之子查询的详细解析

1.4 子查询 1.4.1 介绍 SQL语句中嵌套select语句&#xff0c;称为嵌套查询&#xff0c;又称子查询。 SELECT * FROM t1 WHERE column1 ( SELECT column1 FROM t2 ... ); 子查询外部的语句可以是insert / update / delete / select 的任何一个&#xff0c;最常见…

SEGGER-RTT

wiki:https://wiki.segger.com/RTT 1.简介 Real Time Transfer&#xff08;简称RTT&#xff09;是Segger公司推出的用于嵌入式系统监控和交互的工具&#xff0c;其融合了SWO&#xff08;SWD调试技术中的调试日志输出&#xff09;等能力&#xff0c;且具备极高的性能。RTT的技术…