当前位置: 首页 > news >正文

Hook--2.useRef、useCallback、useContext、useReducer

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

目录

文章目录

1.useRef

2.useCallback

(2.1)useCallback语法格式

3.useMemo 

(3.1)useMemo的作用

(3.2)useMemo的语法格式

4.useContext

(4.1)useContext的基本用法

         (4.2)useContext用法

1.useContext可以帮助我们跨越组件层级直接传递变量,实现数据共享。

2.Context的作用就是对它所包含的组件树提供全局共享数据的一种技术。

5.useReducer



1.useRef

1.1、useRef的作用:

        (1)useRef 用来获取DOM元素对象

        (2)保存数据

1.2、useRef的使用示例如下:

import React,{useRef} from 'react';
export default function App() {
  const box = useRef()
    return (
        <div>
            <div ref={box}>useRef</div>
            <button onClick={() => console.log(box)}>+1</button>
        </div>
    )
}

结果如下:

useRef的简单示例如下:

import React,{useRef,useEffect} from "react";
import ReactDOM from 'react-dom'

function App(){ 
  const box = useRef()
  const age=useRef()
  useEffect(()=>{
    box.current.innerHTML="张三"
    age.current.innerHTML="20"
  },[])
    return (
        <div>
            <h1>个人信息</h1>
            当前姓名:<span ref={box}></span>
            <br></br>
            当前年龄:<span ref={age}></span>
           
        </div>
    )
}
export default App;

效果如下:

2.useCallback

useCallback是用来优化性能的,

useCallback返回一个函数,只有在依赖项变化的时候才会更新(返回一个新的函数)。

useCallback就是把我们在函数组件内部定义的函数保存起来,当组件重新渲染时还是使用之前的,就不会被重新定义一次。

(2.1)useCallback语法格式

语法格式如下:

import {useCallback} from "react"
const memoizedCallback = useCallback(callback, dependencies)

useCallback接收两个参数,第一个参数是需要被记住的函数第二个参数是这个函数的dependencies,只有dependencies数组里面的元素的值发生变化时useCallback才会返回新定义的函数,否则useCallback都会返回之前定义的函数。

3.useMemo 

(3.1)useMemo的作用

传递一个创建函数和依赖项,创建函数会需要返回一个值,只有在依赖项发生改变的时候,才会重新调用此函数,返回一个新的值。

(3.2)useMemo的语法格式

import {useMemo} from "react"
const memoizedValue = useMemo(() => valueNeededToBeMemoized, dependencies)

useMemo接收一个函数,该函数的返回值就是需要被记住的变量,当useMemo的第二个参数dependencies数组里面的元素的值没有发生变化的时候,memoizedValue使用的就是上一次的值。

useMemo 和useCallback综合案例如下:

父组件:
import React,{useState,useEffect,useCallback} from 'react'
import ReactDOM from 'react-dom'
import Box1 from "./components/Box1.jsx"

function App(){
  let [person,changePerson]=useState({name:"",birth:"",sex:""})
  useEffect(()=>{
         let arr=[
          {name:"李四",birth:"2001",sex:"男"},
          {name:"张三",birth:"2001",sex:"男"},
          {name:"marry",birth:"2008",sex:"女"}]
         changePerson(arr[0])
  },[])
  return (
    <div>
        <Box1 {...person}></Box1>
    </div>
  )
  
}
export default App;
//子组件:
import React,{useCallback} from 'react'
export default function Box1(props) {
 let test=useCallback((p)=>{

    let age=new Date().getFullYear() -new Date(p.birth).getFullYear() 
    if(age>18){
        return "成年"
    }
    return "未成年"
 },[])
 
 let canMarry=test(props)
  return (
    <div>
        <h2>个人信息</h2>
        <h3>{props.msg}</h3>
        <h3>姓名:{props.name}</h3>
        <h3>性别:{props.sex}</h3>
        <h3>出生年份:{props.birth}</h3>
        <h3>是否成人:{canMarry}</h3>
    </div>
  )
}

效果如下:

4.useContext

我们知道React中组件之间传递参数的方式是props,假如我们在父级组件中定义了某些状态,而这些状态需要在该组件深层次嵌套的子组件中被使用的话就需要将这些状态以props的形式层层传递,这就造成了props drilling的问题。为了解决这个问题,React允许我们使用Context来在父级组件和底下任意层次的子组件之间传递状态。在函数组件中我们可以使用useContext Hook来使用Context。

(4.1)useContext的基本用法

(1)根组件导入并调用createContext方法,得到Context对象,并导出

import { createContext } from 'react'
export const Context = createContext()

(2)在根组件中使用 Provider 组件包裹需要接收数据的后代组件,并通过 value 属性提供要共享的数据

return (
  <Context.Provider value={ 这里放要传递的数据 }>
  	需要接收数据的后代组件
  </Provider>
)

(3)需要获取公共数据的后代组件:导入useContext,并按需导入根组件中导出的Context对象;调用useContext(第一步中导出的Context) 得到value的值

import React, { useContext } from 'react'
import { Context } from './index'
const 函数组件 = () => {
    const 公共数据 = useContext(Context) // 这里的公共数据就是根组件value的值
    return ( 函数组件的内容 )
}

(4.2)useContext用法

1.useContext可以帮助我们跨越组件层级直接传递变量,实现数据共享。

2.Context的作用就是对它所包含的组件树提供全局共享数据的一种技术。

5.useReducer

useReducer用最简单的话来说就是允许我们在函数组件里面像使用redux一样通过reducer和action来管理我们组件状态的变换。

const [state, dispatch] = useReducer(reducer, initialArg, init?)

相关文章:

  • 台州 网站建设/买卖平台
  • 营销型网站建设公司哪家好哪个好/自媒体视频剪辑培训班
  • js导入wordpress/惠州seo按天计费
  • 用自己的电脑建设网站/百度seo优化策略
  • 左右结构网站/广东清远今天疫情实时动态防控
  • 昆明做网站ynlongtou/admin5站长网
  • 实例展示如何使用JMeter操作Elasticsearch
  • leetcode 474一和零
  • 2022年全国大学生数学建模美赛E题NPP数据获取
  • UG12.0无法正常启动0xc000007b修复教程
  • Linux入门基本命令的使用。
  • 刷爆leetcode第六期 0017
  • 一、CNN奠基作——AlexNet
  • STM32:PWM驱动舵机
  • 云物理机ironic对接ceph云盘ceph-iscsi-gateway
  • 阿里巴巴面试题- - -多线程并发篇(四十一)
  • C中常见的字符函数和字符串函数讲解
  • SpringBoot正常启动后,却无法访问