常用hook

Hook 是 React 16.8 的新增特性。它可以让你在不编写 class 的情况下使用 state 以及其他的 React 特性。

理解:hook是react提供的函数API

官方提供的hook


基础hook


useState API

const [state, setState] = useState(initialState);
//返回state值  以及更新state的方法
在初始渲染期间,返回的状态 (state) 与传入的第一个参数 (initialState) 值相同。
setState 函数用于更新 state。它接收一个新的 state 值并将组件的一次重新渲染加入队列。
案例:
//引入 hook
import { useState } from "react";
//16.8
//useState 给函数组件提供state状态值
//useState  返回数组  [state状态值,更新状态值的方法]
export default () => {
  //定义状态  useState参数为初始值
  let [num, setNum] = useState(0);
  console.log("渲染",num);
  //定义+-事件
  //匿名函数写法
  // let handler = () => {};
  function handler(type) {
    switch (type) {
      case "decrement":
        //--
        num--;
        break;
      case "increment":
        //++
        num++;
        break;
    }
    setNum(num);
  }
  return (
    <>
      <button onClick={handler.bind(null, "decrement")}>-</button>
      <div>数量:{num}</div>
      <button onClick={handler.bind(null, "increment")}>+</button>
    </>
  );
};
//state状态值num===初始状态值
//state状态值首次编译创建一次。更新state状态值不会重新定义

//案例中存在num++  后置++  --
//整个程序运行存在异常。

函数组件中定义状态值

 //定义状态  useState参数为初始值
  let [num, setNum] = useState(0);
  let [isShow, setShow] = useState(true);
  let [arr, setArray] = useState([0, 1, 2, 3, 4]);
  let [stu, setStu] = useState({
    name: "小花",
    age: 18,
  });
  let [city, setCity] = useState([{ name: "西安市" }, { name: "咸阳市" }]);
注意使用useState定义数据state
//1.state状态值为普通变量  可以直接修改  可以让函数组件更新
//2.如果函数组件中定义的数据为对象或者数组
   //对象某个key修改
    stu.name = "小黑";
    setStu(stu)
   //数组某个索引值修改
    arr[0] = 11;
    setArray(arr);
   //以上两种写法不会导致函数组件更新
   //底层监听不到当前数据在变化,因为引用链没有断掉。
   建议断链:
    setStu({ ...stu, name: "小黑" });
    arr[0]=11;
    setArray([...arr]);

react中对象检测机制:

React 使用 Object.is 比较算法 来比较 state。 所以需要断链操作。

与 class 组件中的 setState 方法不同,useState 不会自动合并更新对象

函数组件中产生覆盖。

你可以用函数式的 setState 结合展开运算符来达到合并更新对象的效果。

意思是如果需要类似setState 对象合并。 使用函数式来处理。
//函数式写法 useState
  // setStu({ ...stu, name: "小黑" });
    setStu((state) => {
     //业务逻辑代码
      return { ...stu, name: "xiaohei" };
    });

useEffect

类似周期函数 常用hook 主要功能是用来处理副作用

  useEffect(() => {
    console.log("挂载");

  });
  //以上的这种用法 等待jsx模板编译挂载到页面之后执行外部的函数(类似挂载完成)
  //当前函数组件数据更新 可以当作更新完成

  //下面这种写法 外部函数执行一致。 内部返回的函数为处理副作用函数。
  //首次编译 处理副作用函数不执行。()
  useEffect(() => {
    console.log("挂载");
    //返回的函数为处理副作用函数
    return function (){
      console.log("处理副作用");
    }
  });

  //当前函数组件数据更新 函数组件重新编译  useEffect继续执行---先执行上次的副作用处理
  //作用:为防止内存泄漏,清除函数会在组件卸载前执行
  useEffect(() => {
    console.log("挂载");
    //返回的函数为处理副作用函数
    return function () {
      console.log("处理副作用");
    };
  });

  例如:
   useEffect(() => {
    console.log("挂载");
    let time = setInterval(() => {
      console.log("输出");
    }, 1000);
    //返回的函数为处理副作用函数
    return function () {
      console.log("处理副作用");
      clearInterval(time);
    };
  });

  //如果在子组件中使用useEffect 处理副作用
  useEffect(() => {
    console.log("挂载完成或者更新完成");
    //处理副作用和卸载之前
    return () => {
      console.log("处理副作用");
    };
  });
  console.log("渲染");
  //考虑当前组件卸载  处理副作用函数可以当作卸载之前使用
  //useEffect 可以代替组件的挂载完成和更新完成和卸载之前 三个周期。

useEffect 外部处理函数:与 componentDidMount、componentDidUpdate 不同的是,在浏览器完成布局与绘制之后,传给 useEffect 的函数会延迟调用。

演示useEffect的使用场景

类似挂载:

export default () => {
  //类似挂载完成周期  useEffect的函数是在挂载页面之后延迟执行
  useEffect(()=>{
    console.log("执行");
  });
  console.log("渲染");
  return (
    <>
      <div>测试</div>
    </>
  );
};

类似更新:

export default () => {
  let [num, setNum] = useState(0);
  useEffect(() => {
    console.log("执行");
  });

  let update = () => {
    num++;
    setNum(num);
  };
  console.log("渲染");
  return (
    <>
      <div>测试-{num}</div>
      <button onClick={update}>更新</button>
    </>
  );
};
//修改当前组件state 组件更新   执行useEffect中函数--功能类似更新完成

类似卸载之前:

官方解释是卸载之前处理副作用函数。处理当前组件副作用。

import { useEffect } from "react";

export default () => {
  useEffect(() => {
    console.log("执行");
    return function () {
      console.log("处理副作用");
    };
  });
  console.log("渲染");
  return (
    <>
      <div>菜单</div>
    </>
  );
};
//子组件首次挂载产生一个副作用处理函数
//直接子组件卸载  执行上次产生的副作用函数(类似卸载之前)

effect 的条件执行

默认情况下,effect 会在每轮组件渲染完成后执行。这样的话,一旦 effect 的依赖发生变化,它就会被重新创建。

在函数组件中具体到某个状态发生变化useEffect才执行。

给useEffect添加条件(让useEffect存在依赖项,依赖项发生变化的时候useEffect才重新定义执行)

useEffect 参数二:[]
用法:
  useEffect(() => {
    console.log("执行");
    //定义计时器
    let timer = setInterval(() => {
      console.log("计时器");
    }, 500);
    return function () {
      console.log("处理副作用");
      clearInterval(timer);
    };
  }, [num]);
  //依赖[]
  useEffect(() => {
    console.log("执行");
    //定义计时器
    let timer = setInterval(() => {
      console.log("计时器");
    }, 500);
    return function () {
      console.log("处理副作用");
      clearInterval(timer);
    };
  }, []);
  //依赖值为空 默认首次挂载之后执行其余不执行
  //存在多个依赖项
  useEffect(() => {
    console.log("执行");
    //定义计时器
    let timer = setInterval(() => {
      console.log("计时器");
    }, 500);
    return function () {
      console.log("处理副作用");
      clearInterval(timer);
    };
  }, [num,name]);

useEffect用法


调网络为例:
//引入获取验证码接口
import { useEffect } from "react";
import { getCaptcha } from "../network/user";
export default () => {
  useEffect(async () => {
    let res = await getCaptcha();
    console.log(res);
  }, []);
  return (
    <>
      <div>登录界面</div>
    </>
  );
};
//官方警告
//引入获取验证码接口
import { useEffect } from "react";
import { getCaptcha } from "../network/user";
export default () => {
  useEffect(() => {
    async function request() {
      let res = await getCaptcha();
      console.log(res);
    }
    request();
  }, []);
  return (
    <>
      <div>登录界面</div>
    </>
  );
};

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

壹沓科技完成近2亿元B轮融资:构建数字机器人,实现业务超自动化

RPA中国获悉&#xff0c;全球领先的数字机器人公司壹沓科技近期宣布完成近2亿元B轮融资&#xff0c;本轮融资由鼎晖VGC(创新与成长基金)领投&#xff0c;创享欢聚投资基金、IDG资本、钟鼎资本跟投&#xff0c;指数资本继续担任独家财务顾问。 壹沓科技CEO卞晓瑜表示&#xff1…

栈、队列、优先级队列的模拟实现

优先级队列的模拟实现栈stack的模拟实现push()pop()top()size()empty()swap()stack总代码队列queue的模拟实现push()pop()front()back()empty()size()swap()queue总代码优先级队列(堆)push()pop()top()empty()size()swap()priority_queue总代码deque的了解栈 在CSTL中栈并不属…

吃透Java面试题,建议收藏

本文已经收录到Github仓库&#xff0c;该仓库包含计算机基础、Java基础、多线程、JVM、数据库、Redis、Spring、Mybatis、SpringMVC、SpringBoot、分布式、微服务、设计模式、架构、校招社招分享等核心知识点&#xff0c;欢迎star~ Github地址&#xff1a;https://github.com/…

LeetCode:27. 移除元素

&#x1f34e;道阻且长&#xff0c;行则将至。&#x1f353; &#x1f33b;算法&#xff0c;不如说它是一种思考方式&#x1f340;算法专栏&#xff1a; &#x1f449;&#x1f3fb;123 一、&#x1f331;27. 移除元素 题目描述&#xff1a;给你一个数组 nums 和一个值 val&am…

Chapter6.2:其他根轨迹及综合实例分析

该系列博客主要讲述Matlab软件在自动控制方面的应用&#xff0c;如无自动控制理论基础&#xff0c;请先学习自动控制系列博文&#xff0c;该系列博客不再详细讲解自动控制理论知识。 自动控制理论基础相关链接&#xff1a;https://blog.csdn.net/qq_39032096/category_10287468…

使用vite创建vue3工程

定义 什么是vite&#xff1f;-----新一代前端构建工具 优势 开发环境中&#xff0c;无需打包操作&#xff0c;可快速的冷启动---最牛的地方轻量快速的热重载&#xff08;HMR&#xff09;---一修改代码就局部刷新&#xff0c;webpack也具备&#xff0c;但vite更快真正的按需编…

【数据结构与算法】用队列实现栈

文章目录&#x1f60e;前言如何用队列实现栈&#xff1f;用队列实现栈整体的实现代码&#x1f60e;写在最后&#x1f60e;前言 &#x1f63c;前面我们相继实现了 栈 和 队列 &#xff0c;是不是愁没有练手的地方呢&#xff1f;别担心&#xff0c;本章带大家用队列来实现一个栈&…

synchronized 加锁 this 和 class 的区别

synchronized 是 Java 语言中处理并发问题的一种常用手段&#xff0c;它也被我们亲切的称之为“Java 内置锁”&#xff0c;由此可见其地位之高。然而 synchronized 却有着多种用法&#xff0c;当它修饰不同对象时&#xff0c;其意义也是不同的&#xff0c;下面我们一起来看。 ​…

云原生时代顶流消息中间件Apache Pulsar部署实操之Pulsar IO与Pulsar SQL

文章目录Pulsar IO (Connector连接器)基础定义安装Pulsar和内置连接器连接Pulsar到Cassandra安装cassandra集群配置Cassandra接收器创建Cassandra Sink验证Cassandra Sink结果删除Cassandra Sink连接Pulsar到PostgreSQL安装PostgreSQL集群配置JDBC接收器创建JDBC Sink验证JDBC …

【网络】网络层协议——IP

目录网络层IP协议IP基础知识IP地址IP报头格式网段划分CIDR特殊的IP地址IP地址的数量限制私有IP地址和公有IP地址路由IP总结网络层 在复杂的网络环境中确定一个合法的路径。 IP协议 IP协议作为整个TCP/IP中至关重要的协议&#xff0c;主要负责将数据包发送给最终的目标计算机…

多线程 (六) 单例模式

&#x1f389;&#x1f389;&#x1f389;点进来你就是我的人了 博主主页&#xff1a;&#x1f648;&#x1f648;&#x1f648;戳一戳,欢迎大佬指点!人生格言&#xff1a;当你的才华撑不起你的野心的时候,你就应该静下心来学习! 欢迎志同道合的朋友一起加油喔&#x1f9be;&am…

蓝桥杯刷题冲刺 | 倒计时19天

作者&#xff1a;指针不指南吗 专栏&#xff1a;蓝桥杯倒计时冲刺 &#x1f43e;马上就要蓝桥杯了&#xff0c;最后的这几天尤为重要&#xff0c;不可懈怠哦&#x1f43e; 文章目录1.抓住那头牛2.排列序数1.抓住那头牛 题目 链接&#xff1a; 抓住那头牛 - C语言网 (dotcpp.com…

网络安全之防火墙

目录 网络安全之防火墙 路由交换终归结底是联通新设备 防御对象&#xff1a; 定义&#xff1a; 防火墙的区域划分&#xff1a; 包过滤防火墙 --- 访问控制列表技术 --- 三层技术 代理防火墙 --- 中间人技术 --- 应用层 状态防火墙 --- 会话追踪技术 --- 三层、四层 UTM …

CrossOver零知识学习1 —— 初识

本文部分内容参考CrossOver22全新版功能简介 免费mac虚拟机工具_CoCo玛奇朵的博客-CSDN博客 特此致谢&#xff01; 一、CrossOver简介 CrossOver是由CODE WEAVERS公司开发的类虚拟机软件&#xff0c;目的是使Linux和Mac OS X操作系统和Window系统兼容。CrossOver英文原意为“…

强烈推荐:0基础入门网安必备《网络安全知识图谱》

蚁景网安学院一直专注于网安实战技能培养&#xff0c;提供全方位的网安安全学习解决方案。我们集聚专业网安技术大佬资源&#xff0c;倾力打造了这本更全面更系统的“网络安全知识图谱”&#xff0c;让大家在网络安全学习路上不迷茫。 在这份网安技能地图册里&#xff0c;我们对…

01 | Msyql系统架构

目录MySQL系统架构连接器查询缓存分析器优化器执行器MySQL系统架构 大体来说&#xff0c;MySQL分为Server层和引擎层两部分。 Server层包含链接器、查询缓存、分析器、优化器和执行器&#xff0c;而引擎层负责的是数据的存储和读取&#xff0c;支持InnoDB、Myisam、Memory等多…

CSS实现文字凹凸效果

使用两个div分别用来实现凹凸效果&#xff1b;text-shadow语法 text-shadow: h-shadow v-shadow blur color; h-shadow&#xff1a;必需。水平阴影的位置。允许负值。 v-shadow &#xff1a;必需。垂直阴影的位置。允许负值。 blur&#xff1a;可选&#xff0c;模糊的距离。 co…

【C语言】你真的了解结构体吗

引言✨我们知道C语言中存在着整形(int、short...)&#xff0c;字符型(char)&#xff0c;浮点型(float、double)等等内置类型&#xff0c;但是有时候&#xff0c;这些内置类型并不能解决我们的需求&#xff0c;因为我们无法用这些单一的内置类型来描述一些复杂的对象&#xff0c…

k8s部署prometheus

k8s部署prometheus 版本说明&#xff1a; k8s&#xff1a;1.24.4 prometheus&#xff1a;release-0.12&#xff08;https://github.com/prometheus-operator/kube-prometheus.git&#xff09; 本次部署采用operator的方式将prometheus部署到k8s中&#xff0c;需对k8s和prom…

springboot+vue驾校管理系统 idea科目一四预约考试,练车

加大了对从事道路运输经营活动驾驶员的培训管理力度&#xff0c;但在实际的管理过程中&#xff0c;仍然存在以下问题&#xff1a;(1)管理部门内部人员在实际管理过程中存在人情管理&#xff0c;不进行培训、考试直接进行发证。(2)从业驾驶员培训机构不能严格执行管理部门的大纲…