React-2-useState-获取DOM-组件通信

一.useState

useState 是一个 React Hook(函数),它允许我们向组件添加一个状态变量, 从而控制影响组件的渲染结果

本质:和普通JS变量不同的是,状态变量一旦发生变化组件的视图UI也会跟着变化**(数据驱动视图)**

  const [count, setCount] = useState(0)
  1. useState是一个函数,返回值是一个数组
  2. 数组中的第一个参数是状态变量,第二个参数是set函数用来修改状态变量
  3. useState的参数将作为count的初始值
1.1 修改状态的规则

状态不可变
在React中,状态被认为是只读的,我们应该始终替换它而不是修改它,直接修改状态不能引发视图更新

   let [count, setCount] = useState(0)const handleClick = () => {// 直接修改 无法引发视图更新// count++// console.log(count)setCount(count + 1)}

class组件中this.setState更新是state是合并, hook中 useState中setState是替换

修改对象状态

// 修改对象状态const [form, setForm] = useState({ name: 'jack' })const changeForm = () => {// 错误写法:直接修改  不引发视图变化// form.name = 'john'// 正确写法:setFrom 传入一个全新的对象setForm({...form,name: 'john'})}

二.受控表单绑定

vue中的双向数据绑定

// 1. 通过value属性绑定react状态
// 2. 绑定onChange事件 通过事件参数e拿到输入框最新的值 反向修改到react状态身上function App () {const [value, setValue] = useState('')return (<div><inputvalue={value}onChange={(e) => setValue(e.target.value)}type="text" /></div>)
}

三. React中获取DOM

在 React 组件中获取/操作 DOM,需要使用 useRef React Hook钩子函数

  1. 使用useRef创建 ref 对象,并与 JSX 绑定
  2. 在DOM可用时,通过 inputRef.current 拿到 DOM 对象
// 1. useRef生成ref对象 绑定到dom标签身上
// 2. dom可用时,ref.current获取dom
// 渲染完毕之后dom生成之后才可用
function App () {const inputRef = useRef(null)const showDom = () => {console.dir(inputRef.current)}return (<div><input type="text" ref={inputRef} /><button onClick={showDom}>获取dom</button></div>)
}

四. 组件通信

4.1 父传子-props

props可传递任意的数据
数字、字符串、布尔值、数组、对象、函数、JSX

	 <Sonname={name}age={18}isTrue={false}list={['vue', 'react']}obj={{ name: 'jack' }}cb={() => console.log(123)}child={<span>this is span</span>}><p>33</p></Son>

子组件只能读取props中的数据,不能直接进行修改, 父组件的数据只能由父组件修改

4.2 子传父

核心思路:在子组件中调用父组件中的函数并传递参数

 <Son onGetSonMsg={getMsg} /><div>this is Son<button onClick={() => onGetSonMsg('this is son msg')}>sendMsg</button></div>
4.3.兄弟组件通信

使用状态提升实现兄弟组件通信

  1. A组件先通过子传父的方式把数据传给父组件App
  2. App拿到数据后通过父传子的方式再传递给B组件
4.4.跨层传递数据

使用Context机制跨层级组件通信

实现步骤:

  1. 使用createContext方法创建一个上下文对象Ctx
  2. 在顶层组件(App)中通过 Ctx.Provider 组件提供数据
  3. 在底层组件(B)中通过 useContext 钩子函数获取消费数据
// App -> A -> B
import { createContext, useContext } from "react"
// 1. createContext方法创建一个上下文对象
const MsgContext = createContext()
// 2. 在顶层组件 通过Provider组件提供数据
// 3. 在底层组件 通过useContext钩子函数使用数据
function App () {const msg = 'this is app msg'return (<div><MsgContext.Provider value={msg}>this is App<A /></MsgContext.Provider></div>)
}
function A () {return (<div>this is A component<B /></div>)
}function B () {const msg = useContext(MsgContext)return (<div>this is B compnent,{msg}</div>)
}

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

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

相关文章

maven本地引入tongweb7的jar包的方法

#jar包目录 cd /d D:\develops\mavenjars mvn install:install-file -Dfile./tongweb-spring-boot-starter-2.x-7.0.E.6_P2.jar -DgroupIdcom.tongweb.springboot -DartifactIdtongweb-spring-boot-starter-2.x -Dversion7.0.E.6_P2 -Dpackagingjar mvn install:install-file -…

3453: 【PY】餐厅AA制付费

题目描述 3个人在餐厅吃饭&#xff0c;总共花费n元&#xff0c;他们还想留 15%的小费给服务员。每个人该付多少? &#xff08;付费方式是AA制&#xff0c;即每个人平分花费&#xff09; n是3个人的合计消费&#xff08;不包括小费&#xff09; 输入 3个人的合计消费&…

自建SSL证书(兼容ios)

于SSL/TLS服务器证书&#xff0c;特别是那些用于HTTPS网站的证书&#xff0c;有几个关键的扩展和属性是必要的&#xff0c;以确保证书可以被客户端&#xff08;如浏览器&#xff09;正确识别和信任。这些细节对于确保加密连接的安全性至关重要。以下是一些关键的证书详情和扩展…

网络原理 - HTTP / HTTPS(1)——http请求

目录 一、认识HTTP协议 理解 应用层协议 二、fiddler的安装以及介绍 1、fiddler的安装 2、fiddler的介绍 三、HTTP 报文格式 1、http的请求 2、http的响应 五、认识URL 六、关于URL encode 一、认识HTTP协议 HTTP 全称为&#xff1a;“超文本传输协议”&#xff0c;是…

数据挖掘比赛比较基础的baseline

目录 LGBM/XGB/CAT的接口 Scikit-learn接口 原生接口 LightGBM介绍 应用场景

好物分享:FPGA实现SDI视频编解码的方案设计汇总

目录 1、前言2、专用芯片方案2.1、GS2971FPGA的图像采集 设计方案2.2、GS2971FPGA的图像采集图像缩放 设计方案2.3、GS2971FPGA的图像采集纯verilog图像缩放纯verilog视频拼接 设计方案2.4、GS2971FPGA的图像采集HLS图像缩放Video Mixer视频拼接 设计方案2.5、GS2971FPGA的图像…

Android RecycleView 缓存 itemView 提高滑动流畅度

RecyclerView 是 Android 官方推荐的用于展示大量数据列表的控件&#xff0c;具有高度的可定制性和灵活性。我们可以通过自定义 LayoutManager、ItemDecoration、ItemAnimator 等来实现不同的布局和动画效果&#xff0c;满足各种需求。同时&#xff0c;RecyclerView 支持局部刷…

C++初阶:5.STL简介(了解)

STL简介&#xff08;了解&#xff09; 一.什么是STL STL(standard template libaray-标准模板库)&#xff1a;是C标准库的重要组成部分&#xff0c;不仅是一个可复用的组件库&#xff0c;而且是一个包罗数据结构与算法的软件框架。 二. STL的版本 原始版本 Alexander Stepan…

算法设计课第二周(分治 芯片测试)

实验2 芯片测试算法设计 一、【实验目的】 &#xff08;1&#xff09;理解分治策略的设计思想&#xff1b; &#xff08;2&#xff09;熟悉将伪码转换为可运行的程序的方法&#xff1b; &#xff08;3&#xff09;能够根据算法的要求设计具体的实例。 二、【实验内容】 有…

【教学类-09-06】20240401细线迷宫图01+箭头图片(A4横版一页-1份横版)

作品展示 作品展示 word模板 重点说明 代码展示 批量制作细线条的迷宫图(A4横板一面一份横版)图片加箭头图片 作者&#xff1a; 1、落难Coder https://blog.csdn.net/u014297502/article/details/124839912 2、AI对话大师、 3、阿夏 作者&#xff1a;2024年4月3日 numint(input…

Ubuntu 自启动应用程序的方法

1、自启动的方法 自启动应用程序可以在/etc/rc.local文件中调用脚本来启动应用程序&#xff0c;另外也可以自行编写一个服务来启动应用程序。这两种方法其实都是一种方法即使用服务来启动一个应用程序。rc.local脚本本身也是被一个rc.local的服务来调用的。如下图&#xff0c;可…

MongoDB聚合运算符:$lt

文章目录 MongoDB聚合运算符&#xff1a;$lt语法举例 MongoDB聚合运算符&#xff1a;$lt $lt聚合运算符用于比较两个值&#xff0c;如果第一个小于第二个&#xff0c;返回true&#xff1b;如果第一个小于等于第二个&#xff0c;返回false。 语法 { $lt: [ <expression1&g…

【DevOps工具篇】LDAP GUI管理工具

【DevOps工具篇】LDAP GUI管理工具 目录 【DevOps工具篇】LDAP GUI管理工具LDAP管理工具“phpLDAPadmin”管理LDAP数据管理LDAP服务器LDAP管理工具“phpLDAPadmin”的模板功能LDAP管理工具“postLDAPadmin”LDAP管理工具“web2ldap”LDAP管理工具“ldap-ui”LDAP管理工具“go-l…

构建第一个ArkTS应用(Stage模型)

创建ArkTS工程 若首次打开DevEco Studio&#xff0c;请点击Create Project创建工程。如果已经打开了一个工程&#xff0c;请在菜单栏选择File > New > Create Project来创建一个新工程。选择Application应用开发&#xff08;本文以应用开发为例&#xff0c;Atomic Servi…

2024年04月IDE流行度最新排名

点击查看最新IDE流行度最新排名&#xff08;每月更新&#xff09; 2024年04月IDE流行度最新排名 顶级IDE排名是通过分析在谷歌上搜索IDE下载页面的频率而创建的 一个IDE被搜索的次数越多&#xff0c;这个IDE就被认为越受欢迎。原始数据来自谷歌Trends 如果您相信集体智慧&am…

kafka面试常见问题

1、如何判断kafka某个主题消息堆积&#xff1f; 要判断Kafka中某个主题的消息是否堆积&#xff0c;可以通过查看该主题的生产者和消费者的偏移量&#xff08;offset&#xff09;差异来实现。Kafka中的每条消息在主题的分区内都有一个唯一的偏移量&#xff0c;生产者每发送一条…

【面试八股总结】传输控制协议TCP(一)

一、什么是TCP协议 TCP是传输控制协议Transmission Control Protocol TCP 是面向连接的、可靠的、基于字节流的传输层通信协议。 面向连接的&#xff1a;每条TCP连接杜只能有两个端点&#xff0c;每一条TCP连接只能是点对点的&#xff08;一对一&#xff09;可靠的&#xff1a…

产品经理与产品原型

点击下载《产品经理与产品原型》 1. 前言 互联网产品经理在向技术部门递交产品策划方案时,除了详尽的需求阐述,一份清晰易懂的产品原型设计方案同样不可或缺。一份出色的原型设计,不仅能促进前期的深入讨论,更能让美工和开发人员更直观地理解产品特性,进而优化工作流程,…

Flutter iOS上架指南

本文探讨了使用Flutter开发的iOS应用能否上架&#xff0c;以及上架的具体流程。苹果提供了App Store作为正式上架渠道&#xff0c;同时也有TestFlight供开发者进行内测。合规并通过审核后&#xff0c;Flutter应用可以顺利上架。但上架过程可能存在一些挑战&#xff0c;因此可能…

NoSQL之 Redis配置

目录 关系数据库与非关系型数据库 关系型数据库&#xff1a; ●非关系型数据库 关系型数据库和非关系型数据库区别&#xff1a; &#xff08;1&#xff09;数据存储方式不同 &#xff08;2&#xff09;扩展方式不同 对事务性的支持不同 非关系型数据库产生背景 Redis简介…