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

news/2024/7/15 18:40:13 标签: react.js, javascript, ecmascript

一.useState

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

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

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

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

javascript">   let [count, setCount] = useState(0)

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

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

修改对象状态

javascript">// 修改对象状态
  const [form, setForm] = useState({ name: 'jack' })

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

二.受控表单绑定

vue中的双向数据绑定

javascript">// 1. 通过value属性绑定react状态
// 2. 绑定onChange事件 通过事件参数e拿到输入框最新的值 反向修改到react状态身上

function App () {
  const [value, setValue] = useState('')
  return (
    <div>
      <input
        value={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 对象
javascript">// 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

javascript">	 <Son
        name={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 子传父

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

javascript"> <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 钩子函数获取消费数据
javascript">// 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.niftyadmin.cn/n/5464248.html

相关文章

express+mysql+vue,从零搭建一个商城管理系统17--查询订单导出excel

提示&#xff1a;学习express&#xff0c;搭建管理系统 文章目录 前言一、安装exceljs二、新建config/exportExcel.js三、修改dao/order.js四、修改routes/order.js五、添加商品到购物车总结 前言 需求&#xff1a;主要学习express&#xff0c;所以先写service部分 一、安装exc…

渗透测试练习题解析 5(CTF web)

1、[安洵杯 2019]easy_serialize_php 1 考点&#xff1a;PHP 反序列化逃逸 变量覆盖 【代码审计】 通过 GET 的方式获取参数 f 的值&#xff0c;传递给变量 function 定义一个过滤函数&#xff0c;过滤掉特定字符&#xff08;用空字符替换&#xff09; 下面的代码其实没什么用…

Jenkins插件下载错误时间问题

以下为错误原因&#xff0c;主要是虚拟机的时间和北京时间不一致造成的 java.security.cert.CertificateNotYetValidException: NotBefore: Tue Mar 26 10:14:30 UTC 2024 jenkins-jenkins-1 | 2024-03-25 19:36:03.9460000 [id72] INFO h.model.UpdateCenter$DownloadJob#run…

泰克Tektronix TCP0030A电流探头

181/2461/8938产品概述&#xff1a; TCP0030 是简便易用的高性能交流/直流探头&#xff0c;旨在用于通过 TekVPI™ 探头接口直接连接示波器。该交流/直流测量探头提供了超过 120 MHz 的带宽&#xff0c;选配择 5 A 和 30 A 测量量程。还提供了卓越的低电流测量能力和最低 1 mA…

【漏洞复现】金和OA XmlDeal.aspx XXE漏洞

0x01 产品简介 金和数字化智能办公平台(简称JC6)是一款结合了人工智能技术的数字化办公平台,为企业带来了智能化的办公体验和全面的数字化转型支持。同时符合国家信创认证标准,支持组织数字化转型,实现业务流程的数字化、智能化和协同化,提高企业竞争力。 0x02 漏洞概述…

HackTheBox-Mist

整体思路 端口扫描->Pluck CMS组件文件读取漏洞->文件上传获取shell->创建指向exe的快捷方式来提权-> 信息收集&端口利用 namp -sSVC 10.10.11.17目标只开放了80端口&#xff0c;将mist.htb加入到hosts文件后&#xff0c;访问mist.htb Pluck CMS文件读取 在…

iPhone设备中调试应用程序崩溃日志的高效方法探究

​ 目录 如何在iPhone设备中查看崩溃日志 摘要 引言 导致iPhone设备崩溃的主要原因是什么&#xff1f; 使用克魔助手查看iPhone设备中的崩溃日志 奔溃日志分析 总结 摘要 本文介绍了如何在iPhone设备中查看崩溃日志&#xff0c;以便调查崩溃的原因。我们将展示三种不同的…

银行业架构网络BIAN (Banking IndustryArchitecture Network)详细介绍

BIAN ( The Banking Industry Architecture Network) 是一个业界多方协作的非营利性组织&#xff0c;由全球领先银行、技术提供商、顾问和学者组成&#xff0c;定义了一个用以简化和标准化核心银行体系结构的银行技术框架。这一框架基于面向服务的架构 (SOA) 原则&#xff0c;银…