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

【前端知识】React 基础巩固(四十六)——自定义Hook的应用

React 基础巩固(四十六)——自定义Hook的应用

一、自定义Hook的应用

自定义Hook本质上只是一种函数代码逻辑的抽取,严格意义上而言,它并不算React的特性。

  1. 实现组件创建/销毁时打印日志

    import React, { memo, useEffect, useState } from "react";function useLogLife(name) {useEffect(() => {console.log(`${name}组件创建`);return () => {console.log(`${name}组件销毁`);};}, []);
    }const Home = memo(() => {useLogLife("Home");return <h1>Home Page</h1>;
    });const About = memo(() => {useLogLife("About");return <h1>About Page</h1>;
    });export default memo(function App() {const [isShow, setIsShow] = useState(true);useLogLife("App");return (<div><h1>App Component</h1><button onClick={(e) => setIsShow(!isShow)}>切换</button>{isShow && <Home />}{isShow && <About />}</div>);
    });

    image-20230802004528738

  2. 实现Context共享

    封装TokenContextUserContext 两个Context在自定义HookuseUserToken中,通过使用userUserToken同时获取两个Context的内容:

    import React, { memo, useContext } from "react";
    import { useUserToken } from "./hooks";const Home = memo(() => {const [user, token] = useUserToken();console.log(user, token);return <h1>Home Page</h1>;
    });const About = memo(() => {const [user, token] = useUserToken();console.log(user, token);return <h1>About Page</h1>;
    });export default memo(function App() {return (<div><h1>App Component</h1><Home /><About /></div>);
    });

    image-20230802010608705

  3. 实现获取滚动位置

    封装滚动监听事件:

    import { useEffect, useState } from "react";function useScrollPosition() {const [scrollX, setScrollX] = useState(0);const [scrollY, setScrollY] = useState(0);useEffect(() => {function handleScroll() {console.log(window.scrollX, window.scrollY);setScrollX(window.scrollX);setScrollY(window.scrollY);}window.addEventListener("scroll", handleScroll);return () => {window.removeEventListener("scroll", handleScroll);};}, []);return [scrollX, scrollY];
    }export default useScrollPosition;

    通过useScrollPosition自定义Hook进行复用:

    import React, { memo } from "react";
    import "./style.css";
    import { useScrollPosition } from "./hooks";
    const Home = memo(() => {const [scrollX, scrollY] = useScrollPosition();console.log("Home", scrollX, scrollY);return (<h1>Home Page: {scrollX} --- {scrollY}</h1>);
    });const About = memo(() => {const [scrollX, scrollY] = useScrollPosition();console.log("About", scrollX, scrollY);return (<h1>About Page: {scrollX} --- {scrollY}</h1>);
    });
    export default memo(function App() {return (<div className="app"><h1>App Component</h1><Home /><About /></div>);
    });

    image-20230802011725567

  4. localStorage数据存储

    封装useLocalStorage自定义Hook:

    import { useEffect, useState } from "react";function useLocalStorage(key) {const [data, setData] = useState(() => {const item = localStorage.getItem(key);if (!item) return "";return JSON.parse(item);});useEffect(() => {localStorage.setItem(key, JSON.stringify(data));}, [data]);return [data, setData];
    }
    export default useLocalStorage;

    通过useLocalStorage来实现localStorage数据的自动化存储,并进行复用。即,一旦需要本地存储的值发生变化,便对localStorage进行对应的更新:

    import React, { memo, useEffect, useState } from "react";
    import "./style.css";
    import { useLocalStorage } from "./hooks";export default memo(function App() {// 通过key,直接从localStorage获取数据const [token, setToken] = useLocalStorage("token");function setTokenHandle() {setToken("new token");}const [avatarUrl, setAvatarUrl] = useLocalStorage("avatarUrl");function setAvatarUrlHandle() {setAvatarUrl("new url");}return (<div className="app"><h1>App Component</h1><h1>token:{token}</h1><button onClick={setTokenHandle}>设置token</button><h1>Avatar:{avatarUrl}</h1><button onClick={setAvatarUrlHandle}>设置avatarUrl</button></div>);
    });

    image-20230802014858739

http://www.lryc.cn/news/110592.html

相关文章:

  • Swish - Mac 触控板手势窗口管理工具[macOS]
  • 【雕爷学编程】MicroPython动手做(31)——物联网之Easy IoT 2
  • C# 简单模拟 程序内部 消息订阅发布功能
  • 第六章 支持向量机
  • Docker基本操作之删除容器Container和删除镜像IMAGE
  • vue 3.0 + element-ui MessageBox弹出框的 让文本框显示文字 placeholder
  • QT生成可执行文件的步骤
  • 一分钟学会JS获取当前年近五年的年份
  • 14 springboot项目——首页跳转实现
  • IL汇编语言读取控制台输入和转换为整数
  • 什么是跨链 DeFi?
  • Linux下C/C++的gdb工具与Python的pdb工具常见用法之对比
  • 从入门到专业:探索Python中的判断与循环技巧!
  • mqtt、tcp、http的区别
  • 边写代码边学习之RNN
  • 在linux调试进程PID的方法
  • 【并发编程】线程安全的栈容器
  • ES嵌套查询和普通查询的高亮显示区别
  • Greenplum集群部署
  • 电教智能云数据可视化平台开发电能优化日志实录
  • JSX语法基础总结
  • socker套接字
  • No111.精选前端面试题,享受每天的挑战和学习
  • 【Apollo学习笔记】—— 相机仿真
  • 【数据结构】——线性表的相关习题
  • SpringBoot集成Elasticsearch8.x(8)|(新版本Java API Client的Painless语言脚本script使用)
  • SpringBoot复习:(19)Condition接口和@Conditional注解
  • K8s中的Controller
  • 【MFC】03.常用复杂控件的使用-笔记
  • Autosar诊断实战系列14-NRC优先级解析