React速成

news2024/10/19 8:47:16

 

 

 

 

useRef获取DOM 

 组件通讯

 子传父

function Son({ onGetMsg }){
  const sonMsg = 'this is son msg'
  return (
    <div>
      {/* 在子组件中执行父组件传递过来的函数 */}
      <button onClick={()=>onGetMsg(sonMsg)}>send</button>
    </div>
  )
}


function App(){
  const getMsg = (msg)=>console.log(msg)
  
  return (
    <div>
      {/* 传递父组件中的函数到子组件 */}
       <Son onGetMsg={ getMsg }/>
    </div>
  )
}

 兄弟组件——状态提升


// 1. 通过子传父 A -> App
// 2. 通过父传子 App -> B

import { useState } from "react"

function A ({ onGetAName }) {
  // Son组件中的数据
  const name = 'this is A name'
  return (
    <div>
      this is A compnent,
      <button onClick={() => onGetAName(name)}>send</button>
    </div>
  )
}

function B ({ name }) {
  return (
    <div>
      this is B compnent,
      {name}
    </div>
  )
}

function App () {
  const [name, setName] = useState('')
  const getAName = (name) => {
    setName(name)
  }
  return (
    <div>
      this is App
      <A onGetAName={getAName} />
      <B name={name} />
    </div>
  )
}

export default App

 爷孙组件

// App -> A -> B

import { createContext, useContext } from "react"

// 1. createContext方法创建一个上下文对象

const MsgContext = createContext()

function A () {
  return (
    <div>
      this is A component
      <B />
    </div>
  )
}

function B () {
  // 3. 在底层组件 通过useContext钩子函数使用数据
  const msg = useContext(MsgContext)
  return (
    <div>
      this is B compnent,{msg}
    </div>
  )
}

function App () {
  const msg = 'this is app msg'
  return (
    <div>
      {/* 2. 在顶层组件 通过Provider组件提供数据 */}
      <MsgContext.Provider value={msg}>
        this is App
        <A />
      </MsgContext.Provider>
    </div>
  )
}

export default App

useEffect

React中useEffect钩子-CSDN博客

自定义hook

自定义 Hook 是一种在 React 函数组件中重用状态逻辑的方式。它们可以让你将组件逻辑提取到可重用的函数中,从而提高代码的可读性和可维护性。自定义 Hook 的命名通常以 use 开头,并且它们必须接受一个函数参数并返回 React 的状态和函数(例如 useState 和 useEffect 所返回的内容)。

以下是如何创建和使用自定义 Hook 的一个简单示例:

1. 创建一个自定义 Hook

假设我们要创建一个自定义 Hook 来处理用户的登录状态。我们可以创建一个名为 useUserAuth 的 Hook。

import { useState, useEffect } from 'react';  
  
function useUserAuth() {  
  const [isAuthenticated, setIsAuthenticated] = useState(false);  
  
  useEffect(() => {  
    // 这里可以添加一些逻辑,比如检查本地存储、调用 API 等  
    // 假设我们从本地存储中获取登录状态  
    const storedIsAuthenticated = localStorage.getItem('isAuthenticated');  
    if (storedIsAuthenticated === 'true') {  
      setIsAuthenticated(true);  
    }  
  
    // 清理函数(可选)  
    return () => {  
      // 组件卸载时执行的逻辑,比如清除定时器、取消网络请求等  
    };  
  }, []); // 空数组作为依赖项,表示这个 effect 只在组件挂载和卸载时运行一次  
  
  const login = () => {  
    setIsAuthenticated(true);  
    localStorage.setItem('isAuthenticated', 'true');  
  };  
  
  const logout = () => {  
    setIsAuthenticated(false);  
    localStorage.setItem('isAuthenticated', 'false');  
  };  
  
  return { isAuthenticated, login, logout };  
}  
  
export default useUserAuth;

2. 使用自定义 Hook

现在,我们可以在任何组件中使用这个自定义 Hook。

import React from 'react';  
import useUserAuth from './useUserAuth'; // 假设 useUserAuth 在同一个目录下  
  
function App() {  
  const { isAuthenticated, login, logout } = useUserAuth();  
  
  return (  
    <div>  
      <h1>User Authentication</h1>  
      {isAuthenticated ? (  
        <button onClick={logout}>Logout</button>  
      ) : (  
        <button onClick={login}>Login</button>  
      )}  
      <p>You are {isAuthenticated ? 'logged in' : 'logged out'}</p>  
    </div>  
  );  
}  
  
export default App;

注意事项

  1. 命名规范:自定义 Hook 的命名应该以 use 开头,这有助于 React 和其他开发者识别出这是一个 Hook。
  2. 避免在类组件中使用:自定义 Hook 只能在函数组件和自定义 Hook 中使用,不能在类组件中使用。
  3. 副作用:在自定义 Hook 中使用 useEffect 来处理副作用,比如数据获取、订阅或手动更改 React 组件中的 DOM。
  4. 状态提升:当多个组件需要共享状态时,可以将这些状态提升到一个共同的父组件中,或者使用全局状态管理解决方案(如 Redux)。自定义 Hook 可以帮助封装和重用这些状态逻辑。

通过自定义 Hook,你可以更好地组织你的代码,使其更具可读性和可维护性。

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

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

相关文章

厨房老鼠数据集:掀起餐饮卫生监测的科技浪潮

厨房老鼠数据集&#xff1a;掀起餐饮卫生监测的科技浪潮 摘要&#xff1a;本文深入探讨了厨房老鼠数据集在餐饮行业卫生管理中的重要性及其相关技术应用。厨房老鼠数据集通过收集夜间厨房图像、老鼠标注信息以及环境数据&#xff0c;为深度学习模型提供了丰富的训练样本。基于…

两个案例全面阐述全链路测试怎么做

首先我们先针对全链路功能测试部分进行一下讲解。去年的时候&#xff0c;有一家电商公司可能知道我一直在帮银行做相关的测试&#xff0c;就请我帮他们去做一些规划。这个平台有虚拟订单&#xff0c;也有实体订单&#xff0c;方式不太一样。 还涉及到分账分佣以及跟银行的对接…

基于SpringBoot+Vue+uniapp的涪陵区特色农产品交易系统的详细设计和实现(源码+lw+部署文档+讲解等)

详细视频演示 请联系我获取更详细的视频演示 项目运行截图 技术框架 后端采用SpringBoot框架 Spring Boot 是一个用于快速开发基于 Spring 框架的应用程序的开源框架。它采用约定大于配置的理念&#xff0c;提供了一套默认的配置&#xff0c;让开发者可以更专注于业务逻辑而不…

【IC设计】复旦微行业分析

文章目录 概述各产品线安全与识别芯片&#xff1a;非挥发存储器&#xff1a;智能电表 MCU &#xff1a;集成电路测试服务&#xff1a; 前景公司是FPGA领军企业&#xff0c;在国产替代背景下深度受益优势 1&#xff1a;公司最早推出亿门级 FPGA 产品&#xff0c;提前卡位 28nm 赛…

python的多线程和多进程

首先需要明确的是&#xff0c;多进程和其他语言的一样&#xff0c;能够利用多核cpu&#xff0c;但是python由于GIL的存在&#xff0c;多线程在执行的时候&#xff0c;实际上&#xff0c;每一时刻只有一个线程在执行。相当于是单线程。然而多线程在某些情况下&#xff0c;还是能…

爬虫逆向-js进阶

1.作用域和闭包 //作用域 // var a 3 // // function test(a){ // var a 1; // console.log(函数内部,a) // } // test(2) // // console.log(a)//闭包 // function jiami(){ // function encrypt(){ // console.log(在这里进行加密了) // } // p…

GaussDB高智能--自治运维技术(中)

目录 2.4 日志分析 &#xff08;1&#xff09;日志解析阶段 &#xff08;2&#xff09;日志分析模型的训练 &#xff08;3&#xff09;在线检测模块 2.5 慢SQL发现 &#xff08;1&#xff09;训练阶段 &#xff08;2&#xff09;预测流程 2.6 慢SQL诊断 &#x…

只想简单跑个 AI 大模型,却发现并不简单

之前我用 Ollama 在本地跑大语言模型&#xff08;可以参考《AI LLM 利器 Ollama 架构和对话处理流程解析》&#xff09;。这次想再捣鼓点进阶操作&#xff0c;比如 fine-tuning。 我的想法是&#xff1a;既然有现成的大模型&#xff0c;为什么不自己整理些特定领域的数据集&am…

如何捕捉行情爆发的前兆

在金融市场的激烈角逐中&#xff0c;每一次行情的爆发都是投资者获取丰厚回报的关键时刻。然而&#xff0c;如何识别并把握这些时刻&#xff0c;却是一门需要深厚金融专业知识和敏锐洞察力的艺术。今天&#xff0c;我们就来深入探讨行情爆发的初期信号&#xff0c;揭示那些能够…

锥线性规划【分布鲁棒、两阶段鲁棒方向知识点】

1 锥线性对偶理论 本部分看似和分布鲁棒、两阶段鲁棒优化没什么关系&#xff0c;但值得优先学习&#xff0c;原因将在最后揭晓。 二阶锥 二阶锥&#xff08;second-order cone&#xff0c;又称ice-cream/Lorentz cone&#xff09;的形式为&#xff1a; 非负象限锥 半正定锥 …

初入Linux网络

1.网络发展 独立模式&#xff1a;计算机之间相互独立——>网络互联&#xff1a;多台计算机连接在一起完成数据共享——>局域网LAN&#xff1a;更多的计算机通过交换机和路由器连接在一起——>广域网WAN&#xff1a;将相隔万里的计算机连在一起。 2.协议 计算机之间…

【AI论文精读5】知识图谱与LLM结合的路线图-P3

【AI论文解读】【AI知识点】【AI小项目】【AI战略思考】 P1&#xff0c;P2&#xff0c;P4 5 LLM增强的知识图谱 知识图谱&#xff08;KGs&#xff09; 以其结构化的方式呈现知识而闻名&#xff0c;它们已被广泛应用于许多下游任务&#xff0c;如问答系统、推荐系统和网页搜索等…

(一)Mysql篇---Mysql整体架构

MySql框架浅析 首先&#xff0c;上一张图先让各位看看大致结构&#xff1a; 从上到下&#xff0c;依次说一下结构&#xff1a; 连接层&#xff1a;这里主要是处理客户端和数据库连接的&#xff0c;直接使用的Tomcat的连接池&#xff0c;可以调整最大连接数&#xff1b; 服务…

OpenEuler 软件安装与服务管理全攻略

在 OpenEuler 操作系统的日常使用中&#xff0c;软件安装和服务管理是至关重要的操作环节。本文将以严谨的方式为大家详细阐述 OpenEuler 中安装软件的多种方法&#xff0c;涵盖 RPM、DNF 的概念与操作命令以及操作实验&#xff0c;同时还包括源代码软件的安装方法和使用 syste…

JDK-23与JavaFX的安装

一、JDK-23的安装 1.下载 JDK-23 官网直接下载&#xff0c;页面下如图&#xff1a; 2.安装 JDK-23 2.1、解压下载的文件 找到下载的 ZIP 文件&#xff0c;右键点击并选择“解压到指定文件夹”&#xff0c;将其解压缩到您希望的目录&#xff0c;例如 C:\Program Files\Java\…

react18中如何实现同步的setState来实现所见即所得的效果

在react项目中&#xff0c;实现添加列表项&#xff0c;最后一项自动显示在可视区域范围&#xff01;&#xff01; 实现效果 代码实现 import { useState, useRef } from "react"; import { flushSync } from "react-dom"; function FlushSyncRef() {con…

MySQL面试专题-索引

一、MySQL为什么要选择B树来存储索引&#xff1f; MySQL的索引选择B树作为数据结构来进行存储&#xff0c;其本质原因在于可以减少IO次数&#xff0c;提高查询效率&#xff0c;简单来说就是保证在树的高度不变的情况下可以存储更多的数据。 &#xff08;一&#xff09;IO角度 在…

【状态机DP】【记忆化搜索及翻译递推】【空间优化】力扣3290. 最高乘法得分

给你一个大小为 4 的整数数组 a 和一个大小 至少为 4 的整数数组 b。 你需要从数组 b 中选择四个下标 i0, i1, i2, 和 i3&#xff0c;并满足 i0 < i1 < i2 < i3。你的得分将是 a[0] * b[i0] a[1] * b[i1] a[2] * b[i2] a[3] * b[i3] 的值。 返回你能够获得的 最大…

Chromium form表单post提交过程分析c++

form表单get提交参考之前文章Chromium 前端form表单提交过程分析c-CSDN博客 一、表单post提交测试例子&#xff1a; <!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title>菜鸟教程(runoob.com)</title> </head&…

【C++11】可变模板参数详解

个人主页&#xff1a;chian-ocean 文章专栏 C 可变模板参数详解 1. 引言 C模板是现代C编程中一个非常强大且灵活的工具。在C11标准中&#xff0c;引入了可变模板参数&#xff08;variadic templates&#xff09;&#xff0c;它为模板编程带来了革命性改变。它的出现允许我们…