【React-Hooks进阶】useState回调函数的参数 / useEffect发送网络请求/ useRef / useContext

news2024/11/17 5:44:17

前言

博主主页👉🏻蜡笔雏田学代码
专栏链接👉🏻React专栏
上篇文章初步学习了Hooks的基础知识
今天来深入学习Hooks的一些扩展知识
感兴趣的小伙伴一起来看看吧~🤞

在这里插入图片描述

文章目录

  • useState -回调函数的参数
    • 使用场景
    • 语法
    • 语法规则
    • 语法选择
    • 代码
  • useEffect - 发送网络请求
    • 使用场景
    • 语法要求
    • 正确写法
  • useRef
    • 使用场景
    • 使用步骤
    • 获取dom
    • 获取组件实例
  • useContext
    • 实现步骤
    • 代码实现

useState -回调函数的参数

使用场景

参数只会在组件的初始渲染中起作用,后续渲染时会被忽略。如果初始 state 需要通过计算才能获得,则可以传入一个函数,在函数中计算并返回初始的 state,此函数只在初始渲染时被调用。

语法

const [name, setName] = useState(()=>{   
  // 编写计算逻辑    return '计算之后的初始值'
})

语法规则

  1. 回调函数return出去的值将作为 name 的初始值
  2. 回调函数中的逻辑只会在组件初始化的时候执行一次

语法选择

  1. 如果就是初始化一个普通的数据 直接使用 useState(普通数据) 即可
  2. 如果要初始化的数据无法直接得到需要通过计算才能获取到,使用useState(()=>{})

代码

import { useState } from 'react'

function Counter(props) {
  const [count, setCount] = useState(() => {
    return props.count
  })
  return (
    <div>
      <button onClick={() => setCount(count + 1)}>{count}</button>
    </div>
  )
}

function App() {
  return (
    <>
      <Counter count={10} />
      <Counter count={20} />
    </>
  )
}

export default App

useEffect - 发送网络请求

使用场景

如何在useEffect中发送网络请求,并且封装同步 async await操作

语法要求

不可以直接在useEffect的回调函数外层直接包裹 await ,因为异步会导致清理函数无法立即返回

useEffect(async ()=>{    
  const res = await axios.get('http://geek.itheima.net/v1_0/channels')   
  console.log(res)
},[])

正确写法

内部单独定义一个函数,然后把这个函数包装成同步

useEffect(() => {
  //  发送请求
  async function loadData() {
    const res = await fetch('http://geek.itheima.net/v1_0/channels')
    console.log(res)
  }
  loadData()
}, [])

useRef

使用场景

在函数组件中获取真实的dom元素对象或者是组件对象

使用步骤

  1. 导入 useRef 函数
  2. 执行 useRef 函数并传入null,返回值为一个对象 内部有一个current属性存放拿到的dom对象(组件实例)
  3. 通过ref 绑定 要获取的元素或者组件

获取dom

import { useEffect, useRef } from 'react'
function App() {  
    const h1Ref = useRef(null)  
    useEffect(() => {    
        console.log(h1Ref.current)  
    },[])  
    return (    
        <div>      
            <h1 ref={ h1Ref }>this is h1</h1>    
        </div>  
    )
}
export default App

获取组件实例

函数组件由于没有实例,不能使用ref获取,如果想获取组件实例,必须是类组件

import React, { useRef } from 'react'
class TeastC extends React.Component {
  render() {
    return (
      <div>我是类组件</div>
    )
  }
}

function App() {
  const testRef = useRef(null)

  useEffect(() => {
    console.log(testRef.current)
  })
  // useEffect回调 是在dom渲染之后还是之前执行? 之后!
  return (
    <div>
      <TeastC ref={testRef} />
    </div>
  )
}

useContext

一种组件间通信方式, 常用于【祖组件】与【后代组件】间通信

在hooks下如何跨组件传数据

实现步骤

  1. 使用createContext 创建Context对象
  2. 在顶层组件通过Provider 提供数据
  3. 在底层组件通过useContext函数获取数据

代码实现

import { createContext, useContext, useState } from 'react';
// 创建Context对象
const Context = createContext()

function ConA() {
  // 底层组件通过useContext函数获取数据 
  const count = useContext(Context)
  return (
    <div>
      this is ConA
      app传过来的数据是:{count}
      <ConC />
    </div>
  )
}

function ConC() {
  // 底层组件通过useContext函数获取数据 
  const count = useContext(Context)
  return (
    <div>
      this is ConC
      app传过来的数据是:{count}
    </div>
  )
}

function Demo() {
  const [count, setCount] = useState(10)
  return (
    // 顶层组件通过Provider 提供数据 
    <Context.Provider value={count}>
      <div>
        <ConA />
        <button onClick={() => { setCount(count + 1) }}>+</button>
				//提供方修改count数据之后,使用方也会更新这个数据
      </div>
    </Context.Provider>
  )
}
//打印结果: 
this is ConA app传过来的数据是:10
this is ConC app传过来的数据是:10

Context如果要传递的数据,只需要在整个应用初始化的时候传递一次就可以,就可以选择在入口文件index.js里通过Provider 提供数据。

Context如果需要传递数据并且将来还需要再对数据做修改,底层组件也需要跟着一起变,就可以在顶层组件那里通过Provider 提供数据。

今天的分享就到这里啦✨ \textcolor{red}{今天的分享就到这里啦✨} 今天的分享就到这里啦

原创不易,还希望各位大佬支持一下 \textcolor{blue}{原创不易,还希望各位大佬支持一下} 原创不易,还希望各位大佬支持一下

🤞 点赞,你的认可是我创作的动力! \textcolor{green}{点赞,你的认可是我创作的动力!} 点赞,你的认可是我创作的动力!

⭐️ 收藏,你的青睐是我努力的方向! \textcolor{green}{收藏,你的青睐是我努力的方向!} 收藏,你的青睐是我努力的方向!

✏️ 评论,你的意见是我进步的财富! \textcolor{green}{评论,你的意见是我进步的财富!} 评论,你的意见是我进步的财富!

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

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

相关文章

el-switch

目录 在element ui中el-switch开关组件具有先改变开关值再传值的特点。&#xff08;先改后传&#xff09; 1、触发change事件时 2、绑定disabled属性写三元表达式时 3、解决办法 在element ui中el-switch开关组件具有先改变开关值再传值的特点。&#xff08;先改后传&#xf…

cron表达式 详解

corn表达式是&#xff1a;由若干数字、空格、符号按一定的规则&#xff0c;组成的一组字符串&#xff0c;从而表达时间的信息。 好像和正则表达式有点类似哈&#xff0c;都是一个字符串表示一些信息。Cron 表达式生成器&#xff1a; https://www.smart-tools.cn/cron简介Cron 表…

基于Java+MySQL 实现(Web)日程管理系统【100010222】

基于Java的日程管理系统开发 摘要 日程管理在日常生活中是十分普通的一件事情&#xff0c;人们无论在生活中还是工作中都会有大大小小、各种各样的事情安排&#xff0c;如果仅仅靠纸张或者自己记录这些事情&#xff0c;往往会遗忘。针对这样的痛点&#xff0c;本文提供了日程…

HTML小图标的使用(无需下载图标源码)

我们在浏览一个网页中&#xff0c;会遇到很多有趣的小图标&#xff0c;这些小图标与访问者形成了友好的互动&#xff0c;所以我们在开发中都会适当插入一些生动有趣的图标来吸引访问者。插入图标的网站有很多&#xff0c;我这里以阿里巴巴图标库&#xff08;iconfont-阿里巴巴矢…

Div标签里放img和span标签实现垂直水平居中

正常默认布局 代码实现&#xff1a; <div style"width: 400px; height:400px; background-color:blueviolet"><img style"width: 80px; height: 80px;" src"./picture.png"><span style"color:white;">我是span标…

Vue3 使用MD5加密(清晰明了)

概述 最近在想做个cloud项目,gitee上找了个模板项目&#xff0c;前端使用到vue3 typeScript、Element Plus、Vue Router、Pinia、Axios、i18n、Vite等技术&#xff0c;最近使用到vue3 MD5加密&#xff0c;顺便学习一下&#xff0c;在此总结一下&#xff0c;若有不足之处&…

《EDA前端软件开发工程师面试指南》

2023届EDA领域校招总结&#xff0c;完结撒花&#xff01;&#xff01;&#xff01; 目录 前言 一、EDA公司介绍 二、项目面试 1.自我介绍 2.项目深入 3.专业经验 4.成果和技能 5.对面试官有什么问题 三、C面试 1、高频考点 2、其他知识点 3、算法题 四、逻辑综合面…

【前端代码实例】使用HTML5+CSS3+JavaScript制作一个响应式的后台管理系统~带侧边导航栏仪表盘功能

bilibili在线视频演示地址: 【前端代码实例】使用HTML5+CSS3+JavaScript制作一个响应式的后台管理系统~带侧边导航栏仪表盘功能 效果图: 完整代码: <!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><meta…

前端已死?后端已亡?弯弯绕绕,几分真几分假

前段时间&#xff0c;我在掘金分享了一篇GPT-4 性能文章&#xff0c;也许是过于强大带来的威胁性&#xff0c;引来评论区的排队哀嚎&#xff08;如下图&#xff09;&#xff0c;所以“前端已死&#xff0c;后端已亡”这个概念真的成立吗&#xff1f;本文着重探讨前端。 前端和后…

Seurat | 强烈建议收藏的单细胞分析标准流程(基础质控与过滤)(一)

1. 写在前面 作为现在最火的scRNAseq分析包&#xff0c;Seurat当之无愧。&#x1f618; 本期开始我们介绍一下Seurat包的用法&#xff0c;先从基础质控和过滤开始吧。&#x1f973; 2.用到的包 rm(list ls()) library(Seurat) library(tidyverse) library(SingleR) library…

钉钉消息防撤回功能研究与实现-可查看历史消息[文件/图文/管理员/链接 撤回拦截]

研究背景 由于在某个大学进行上课的时候,遇到的某个老师,总是习惯发过的消息,到第二天的时候撤回,我们用聊天工具的其中一个原因,不就是因为可以随时去查看发过的消息吗&#xff0c;&#xff0c;而这位老师的操作,也让包括我在内的很多人感到痛不欲生。 想一想,当自己想要去看下…

Error in mounted hook: TypeError: Cannot read properties of undefined (reading isHiddenDay ) found

Error in mounted hook: TypeError: Cannot read properties of undefined (reading isHiddenDay ) found 无法读取未定义的属性‘isHiddenDay’. 在vue中使用fullcalendar在mounted钩子中渲染报错 背景 我在一个小demo中实现还是好好的&#xff0c;并且用的依赖都是6.x版本的…

初入了解——什么是VUE

个人简介&#xff1a;云计算网络运维专业人员&#xff0c;了解运维知识&#xff0c;掌握TCP/IP协议&#xff0c;每天分享网络运维知识与技能。座右铭&#xff1a;海不辞水&#xff0c;故能成其大&#xff1b;山不辞石&#xff0c;故能成其高。个人主页&#xff1a;小李会科技的…

vue3+ts项目里如何使用状态管理pinia以及数据持久化

我们都知道在vue2项目里搭配状态管理vuex3XX使用&#xff0c;效果极好的。 虽然在vue3项目里&#xff0c;vuex4XX仍能发挥余热&#xff0c;但由于缺乏对于ts的支持&#xff0c;使得类型推断陷入僵局。 所以在vue3ts的项目里&#xff0c;vuex渐被舍弃&#xff0c;pinia取而代之…

微信小程序入门教程 --(保姆级)

一、小程序注册 1、首先&#xff0c;到小程序官网注册自己的小程序账号&#xff0c;以下附有地址和教程&#xff1a; 小程序官网 进入这个地址之后&#xff0c;会看到这样的页面&#xff0c;点击立即注册按钮 2、在接下来的页面&#xff0c;选择小程序 3、然后根据提示完成三…

Web基础 HTML标签 六种超链接标签的使用方式

超链接标签&#xff08;重点&#xff09; 1、链接的语法格式&#xff1a; <a href"跳转目标链接" target"目标窗口的弹出方式"> 文本或图像 </a><a>标签里的a是单词anchor的的缩写&#xff0c;意为:锚。 两个属性的作用如下&#xff…

【前端灵魂脚本语言JavaScript⑤】——JS中数组的使用

&#x1f41a; 作者: 阿伟 &#x1f482; 个人主页: Flyme awei &#x1f40b; 希望大家多多支持&#x1f618;一起进步呀&#xff01; &#x1f4ac; 文章对你有帮助&#x1f449;关注✨点赞&#x1f44d;收藏&#x1f4c2; JavaScript数组的使用 文章目录JavaScript数组的使用…

【Vue2从入门到精通】详解Vue数据双向绑定原理及手动实现双向绑定

文章目录✨什么是数据双向绑定✨数据双向绑定的原理✨Vue数据双向绑定原理✨实现数据双向绑定的步骤✨手动实现自定义组件的双向绑定的步骤✨写在最后✨什么是数据双向绑定 我们先从单向绑定切入单向绑定非常简单&#xff0c;就是把Model绑定到View。 什么是双向绑定呢&#…

基于pytorch+Resnet101加GPT搭建AI玩王者荣耀

本源码模型主要用了SamLynnEvans Transformer 的源码的解码部分。以及pytorch自带的预训练模型"resnet101-5d3b4d8f.pth"本资源整理自网络&#xff0c;源地址&#xff1a;https://github.com/FengQuanLi/ResnetGPT注意运行本代码需要注意以下几点 注意&#xff01;&a…

【Unity】Button基础-按钮更换图片样式

话说&#xff0c;今天修改了一下项目中的内容&#xff0c;发现按钮不怎么好看&#xff0c;想用图片的方式改一改&#xff0c;然后点开Button&#xff0c;忽然发现好多内容都忘记了。。。 Transition&#xff08;过渡方式&#xff09;&#xff1a;按钮在状态改变时自身的过渡方式…