Hook使用

使用Xposed对native进行hook 使用Xposed对native进行hook,Dobby框架的使用 阅读详情

Hook

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

React 组件更新逻辑

  • 在使用 Hook 前先要了解,React 组件在什么情况下会刷新

    1. state 或 props 有更新时,当前组件会刷新
    2. 父组件有更新时,当前组件会刷新
  • 但,从上面的情况看,其中有两个问题:

    1. 调用setState(),就会触发组件的重新渲染(无论前后的 state 是否一样,除非继承自PureComponent)
    2. 父组件更新,子组件也会自动的更新(无论子组件是否有必要更新)

Hook 除了能让函数组件使用一些类组件特性外,还自带一些性能优化,使函数组件发挥出强大的优势

Hook 使用注意事项

  1. 只能在函数组件中使用
  2. 不要在循环,条件或嵌套函数中调用 Hook, 确保总是在你的 React 函数的最顶层调用他们
  3. 函数组件每次更新都会从上往下执行完内部所有的代码

基础 Hook

1. useState

State Hook 能让函数组件也能使用 class 组件一样的状态特性,同时发挥函数组件轻便高效的特性,格式:useState(defaultValue),返回最新value与修改 value方法组成的数组

function MyComponent() {
  const [qty, changeQty] = useState(0);

  return (
    <div>
      {qty}
      <button
        onClick={() => {
          changeQty(qty + 1);
        }}
      >
        修改数量
      </button>
    </div>
  );
}

PS: 以前发起ajax请求只能在class组件中使用,有了useState,在函数组件中也能实现了,虽然每次更新qty都会把MyComponent组件中的代码重新执行一遍,但 State Hook 能保证你能拿到的是最新的state,如上面的代码每次都能拿到最新的qty值

2. useEffect

Effect Hook 可以让我们在函数组件中执行一些副作用操作,如 ajax 请求,定时器等。默认情况下,effect 将在每轮渲染结束后执行,React 保证了每次运行 effect 时,DOM 都已经更新完毕

  • 默认 effect

    等效于componentDidMount + componentDidUpdate的效果

        // 
        function MyCompnent(){
            useEffect(()=>{
                // 这里的代码在组件渲染结束后执行(初始化和组件更新)
                // 如:发起ajax请求商品数据
                const {data} = await fetch('/goods').then(res=>res.json())
            })
            return <div></div>
        }
    

    PS:ajax 请求以前在 class 组件中可能需要在componentDidMount和componentDidUpdate两个生命周期函数中编写相同的代码,有了useEffect,只需要写一次就行

  • 指定依赖

    等效于componentDidUpdate的效果,只有在依赖发生改变时才执行effect中的代码

        // 指定依赖(可以为多个依赖)
        function MyCompnent(){
          const [qty, changeQty] = useState(0);
            useEffect(()=>{
                // 这里的代码只有在初始化和qty发生改变时执行
                const {data} = await fetch('/goods').then(res=>res.json())
            },[qty])
            return <div></div>
        }
    
  • 指定空依赖

    依赖为空数组,等效于componentDidMount的效果

      function MyCompnent(){
          useEffect(()=>{
              // 这里的代码只有在初始化时执行
              const {data} = await fetch('/goods').then(res=>res.json())
          },[])
          return <div></div>
      }
    
  • useEffect返回一个函数

    实现componentWillUnmount的效果

        function MyComponent(){
            useEffect(()=>{
                return ()=>{
                    // 这里的代码在组件被销毁后执行
                }
            })
        }
    

3. useMemo

一般用于编写函数组件中无需重复执行的代码,以达到优化性能的目的,返回值为回调函数的结果

  • 执行过程
    1. 回调函数初始化组件时会被执行
    2. 依赖改变时被执行
  • 返回值:依赖改变返回新的值,否则返回缓存值
  const datalist = [
    { name: "goods1", price: 98, qty: 2 },
    { name: "goods2", price: 198, qty: 2 },
    { name: "goods3", price: 998, qty: 1 },
  ];

  function MyCompnent(){
    const [goodslist, changeGoods] = useState(datalist);

    // 只有goodslist有修改时才会重新计算总价,否则返回之前计算的值
    const totalPrice = useMemo(() => {
      return goodslist.reduce((pre, item) => pre + item.price * item.qty, 0);
    }, [goodslist]);
  }

4. useCallback

与 useMemo 类似,但 useCallback 返回传入的函数,不需要显性返回,一般用于定义事件处理函数

  • 不指定依赖

    不论初始化或者组件更新都返回新的函数

  • 指定依赖

    依赖更新时返回新的函数,否则返回缓存函数

  • 空依赖

    初始化返回函数后并缓存,组件更新时永远返回缓存函数

  const callbackList = []
  function MyCompnent(){
    const [qty, changeQty] = useState(1);

    // callback得到useCallback传入的函数
    const callback = useCallback(() => {
      
    }, [qty]);
    callbackList.push(callback);

    // 对比callbackList中的函数是否为同一个函数
  }

额外的 Hook

  1. useContext

简化context获取方式

  // 父组件
  const MyContext = React.createContext(null);
  <MyContext.Provider value={{ username: "laoxie", age: 18 }}>
    <MyComponent />
  </MyContext.Provider>
  // 子组件
  function MyCompnent() {
    const user = useContext(MyContext); // laoxie
    return <div>{user.username}</div>;
  }

useContext(MyContext) 相当于 class 组件中的 static contextType = MyContext 或者 <MyContext.Consumer>,当组件上层最近的 <MyContext.Provider> 更新时,该 Hook 会触发重渲染

  1. useReducer

简单版redux,可以在不引入redux的情况下使用redux特性

 const initState = [
   { name: "goods1", price: 98, qty: 2 },
   { name: "goods2", price: 198, qty: 2 },
   { name: "goods3", price: 998, qty: 1 },
 ];
 const reducer = (state, action) => {
   switch (action.type) {
     case 'add':
       return [action.goods, ...state];
     case 'remove':
       return state.filter(item => item.name != action.name);
     case 'change'
       return state.map(item=>{
         if(item.name === action.name){
           item.qty = action.qty;
         }
         return item;
       })
     default:
       throw new Error('type error');
   }
 }
 const MyHook = () => {
   const [state, dispatch] = useReducer(reducer, initState);
   return <div>
     <ul>
       {
         state.map(item=><li key={item.name}>{item.name}-{item.price}</li>)
       }
     </ul>
     <button onClick={()=>{
       dispatch({type:'add',goods:{name:'newGoods',price:111,qty:1}})
     }}>添加商品</button>
   </div>
 }

PS: 如果 Reducer Hook 的返回值与当前 state 相同,React 将跳过子组件的渲染及副作用的执行

  1. useRef
    useRef 返回一个可变的 ref 对象,其 .current 属性被初始化为传入的参数,返回的 ref 对象在组件的整个生命周期内保持不变。

  2. useLayoutEffect

  3. useImperativeHandle

  4. useDebugValue

自定义 Hook

自定义 Hook 是一个函数,其名称以 use 开头,这样可以一眼看出其符合 Hook 的规则

  • 函数内部可以调用其他的 Hook
  • 自定义 Hook 解决了以前在 React 组件中无法灵活共享逻辑的问题
	import {useState,useMemo} from 'react';
	function useStorage(key){
		function set(key,val){
			localStorage.setItem(key,JSON.stringify(val));
			setValue(val)
		}
		function get(key){
			return JSON.parse(localStorage.getItem(key));
		}
		const initData = get(key);
		const [value,setValue] = useState(initData);
		return [value,set]
	}

第三方HooK

  • react-router
    • useHistory
    • useLocation
    • useParams
    • useRouteMatch
  • react-redux

    react-redux 7.1新增功能

    • useDispatch
    • useStore
    • useSelector
选择的 Python 解释器无效,请尝试更改解释器以启用 IntelliSense、Lint 分析和调试等功能。请查看输出,详细了解解释器无效的原因。 摘要:在VS Code中配置Anaconda Python解释器时若出现"解释器无效"错误,可通过修改用户设置解决。具体步骤:1) 按Ctrl+Shift+P打开命令面板;2) 搜索并打开用户设置JSON文件;3) 添加conda路径配置项,示例格式为"python.condaPath": "D:\\Anaconda\\setup\\Scripts\\conda.exe";4) 同时启用环境激活选项"python.terminal.act 阅读详情

相关推荐

将Apollo高精地图中的车道线叠加在多种导航地图上

本文介绍了将Apollo高精地图车道线叠加到普通导航地图的技术方案。高精地图具备厘米级车道精度和丰富的语义信息,叠加可实现可视化验证、调试分析和数据对比等功能。核心技术包括坐标系统转换(UTM/WGS84/BD09/GCJ02)和数据处理流程,通过Python脚本完成Apollo地图解析、坐标批量转换和多格式输出。文章详细提供了环境准备、工作目录创建和坐标转换脚本等操作步骤,实现了高精地图数据在OpenStreetMap、百度地图和高德地图上的可视化展示。

Hi20240217的博客 1330

Hooks的使用

作用:在函数组件中使用state以及其他的React特性常用的hook:React.useState()、React.useEffect()、React.useRef()

S2763427717的博客 225

别再瞎调了!STM32 Systick延时函数避坑指南(正点原子、野火、慧净代码对比)

本文深入解析STM32 Systick延时函数的实现差异与优化策略,对比正点原子、野火、慧净等主流方案的优缺点。针对us和ms级延时精度问题,提供避坑指南和高级优化技巧,帮助开发者根据项目需求选择最佳方案,提升嵌入式系统的定时控制精度。

weixin_28717807的博客 340

手把手讲解 Android Hook入门Demo

前言 手把手讲解系列文章,是我写给各位看官,也是写给我自己的。文章可能过分详细,但是这是为了帮助到尽量多的人,毕竟工作5,6年,不能老吸血,也到了回馈开源的时候.这个系列的文章:1、用通俗易懂的讲解方式,讲解一门技术的实用价值2、详细书写源码的追踪,源码截图,绘制类的结构图,尽量详细地解释原理的探索过程3、提供Github 的 可运行的D...

weixin_33889665的博客 950

个人信息保护合规审计人员(中级)能力测试试卷

本文是关于个人信息保护合规考试的试题解析,内容涵盖《个人信息保护法》相关规定。试卷包含单选题、多选题、判断题、简答题和案例分析题五种题型,总分100分,考试时间120分钟。试题重点考察个人信息处理的基本原则、敏感个人信息处理要求、合规审计流程、个人信息保护影响评估等内容。通过案例分析题详细解析了人脸识别登录、数据共享、跨境传输等场景下的合规要求。参考答案均严格依据《个人信息保护法》等法律法规,为个人信息处理活动提供了明确的合规指引。

qq_41525079的博客 849

Gartner《构建可扩展数据产品建设框架》心得

数据产品化:从概念到落地的实践指南 当前企业正从传统数据需求模式转向数据产品化新范式。本文系统阐述了数据产品的核心价值、定义分类和实施框架,指出成功关键是将数据包装为可复用、可扩展的产品。Gartner框架强调产品思维,提出4阶段12步实施路径,涵盖设计、工程、发布和监控全流程。文章特别提醒要避免7大常见误区,如简单重命名报表、忽视元数据治理等,建议采取MVP策略,90天内完成从价值验证到产品落地的闭环。实施中需平衡技术选型与业务需求,建立跨职能团队,并通过AARRR模型持续追踪产品价值。

2501_91410404的博客 1002

HOOK的使用

一些HOOK的常用方法

garfield的博客 930

淋巴结病理数字玻片读取与处理代码

Whole-slide images are generally stored in a multi-resolution pyramid structure. 首先安装openslide模块 pip install openslide-python import os.path as osp import openslide from pathlib import Path...

猫头军师兵书 1276

Python中的钩子函数(hooks)介绍使用

python钩子函数的使用、注意事项

zpsimon的博客 5241

2、OTA/gm - C滤波器的架构与设计

本文深入探讨了OTA/gm-C滤波器的两种主要设计方法:基于LC梯形网络的设计与多环反馈(MLF)结构。前者包括元件替代法和信号模拟法,分别通过电感替代或电路方程模拟实现低敏感度滤波器;后者通过积分器级联与反馈网络合成全极点或含任意传输零点的传递函数。文中详细分析了不同结构如IFLF和LF的反馈矩阵、传递函数及性能差异,指出LF结构在敏感度、噪声和整体性能上的优势。同时比较了各类方法的优缺点及适用场景,为高频连续时间集成电路滤波器的设计提供了系统性指导。

fanta的博客 137

看完这篇你就能讲解LLC软开关:一文秒懂 ZVS 和 ZCS 到底啥意思!

想要 MOS 管ZVS 好实现➜ 把工作频率保持在 fr1 或更高。想让整流二极管也ZCS 实现➜ 频率就别高过 fr1。设计磁性元件时,一定要计算好 Lr、Lm、Cr 的值,这直接决定你 fr、fr1 是多少!LLC 的软开关技术不是“魔法”,是电感电容+频率控制的精妙组合;fr1 就像黄金分割点,整流和开关都能“刚刚好”;不是所有软开关都能同时实现,要看你在频率曲线的哪一段!

weixin_43199439的博客 1530

油猴插件hook的基本用法(非常详细)

首先下载油猴插件,进行一些初始配置其中我们可以在里面加上一个参数@run-at编辑好hook代码之后,直接命名好,保存并开启就好啦!就像这样。

2302_80729149的博客 1406

【GameFramework框架】二、GameFramework框架介绍

Game Framework框架是由E大(Ellan Jiang)开源的一款基于Unity的通用游戏框架。Game Framework框架提供了游戏开发中常用的框架基础模块,将基础模型进行了封装,在资源管理和资源更新方面比较完善,可以大大加大开发进程,加快开发速度,并且还在在此此处上保证产品质量。实在是代码开发、框架学习、编程进阶、居家旅行哦不对,是提升自己的最佳实践。Game Framework框架。

优快云博客专家,Unity3D高级软件工程师,《Unity 3D从入门到实战》作者。 5847

React中Hook的使用

1.什么是Hook? Hook是React 16.8的新增属性。可以在不编写calss的情况下使用state以及其他的React特性 2.Hook优势? 其主要是为了解决一下几个常见问题: 在组件之间服用状态逻辑难 复杂组件变的难以理解 class学习及js中this的工作方式 简化周期函数,避免重复代码 … Hook可以让我们无需学习浮躁的函数式和响应式编程,同时也遵循React的精神原则。...

WCBandCTZ的博客 2058

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Hook使用介绍

6.自定义hook 通过自定义hook,可以将组件逻辑提取到可重用的函数的。 到目前为止,在react中两种方式来共享组件组件之间的状态逻辑;render props和高阶组件,Hook可以让你在不增加组件的情况下解决相同问题。 提取自定义Hook ...

LiHUi__优快云的博客 2497

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

React hook 10种 Hook (详细介绍及使用)

React Hook是什么? React官网是这么介绍的: Hook 是 React 16.8 的新增特性。它可以让你在不编写 class 的情况下使用 state 以及其他的 React 特性。 完全可选的 你无需重写任何已有代码就可以在一些组件中尝试 Hook。但是如果你不想,你不必现在就去学习或使用 Hook。 100% 向后兼容的 Hook 不包含任何破坏性改动。 现在可用 H...

@baby张~的博客 1万+

react中关于hook介绍及其使用

前言 最近由于公司的项目开发,就学习了在react关于hook的使用,对其有个基本的认识以及如何在项目中去应用hook。在这篇博客中主要从以下的几个点进行介绍: hook简介 hook中常用api的使用 hook在使用过程中需要去注意的地方 hook中怎样去实现class组件中的声明周期函数 hook 首先介绍关于hook1的含义,以及其所要去面对的一些场景 含义:Hook 是 React 16.8 的新增特性。它可以让你在不编写 class 的情况下使用 state 以及其他的 React 特性。简

domino~~的博客 4322

Net使用Hook之完全介绍

Net使用Hook之完全介绍待续。。

老桥的技术家园 3014

React Hook 的使用限制有哪些?

这些限制主要是为了保证React能正确地追踪各个Hook之间的状态。为了帮助开发者遵守这些规则,React团队提供了一个ESLint插件:eslint-plugin-react-hooks,这个插件可以帮助检测你的代码是否违反了这些规则。:不要在普通的JavaScript函数中调用Hook。你可以在React的函数组件中调用Hook,也可以在你的自定义Hook中调用其他Hook。:当你想在两个函数间共享一些状态逻辑时,你可以创建你自己的自定义Hook,然后在那里调用其他的Hook。

csdn_Levy的博客 466

react hook 使用规则

Hook 规则 Hook是 React 16.8 的新增特性。它可以让你在不编写 class 的情况下使用 state 以及其他的 React 特性。 Hook 本质就是 JavaScript 函数,但是在使用它时需要遵循两条规则。我们提供了一个linter 插件来强制执行这些规则: 只在最顶层使用 Hook 不要在循环,条件或嵌套函数中调用 Hook,确保总是在你的 React 函数的最顶层调用他们。遵守这条规则,你就能确保 Hook 在每一次渲染中都按照同样的顺序被调用。这让 React ...

wx479的博客 1540

pytorch中hook的使用

在pytorch中,可以利用Hook获取、改变网络中间某一层变量的值和梯度,从而便捷地分析网络,而不用专门改变网络结构。 一、torch.Tensor中的hook 在使用pytorch时,只有叶节点(即直接指定数值的节点,而不是由其他变量计算得到的节点,比如网络输入)的梯度会保留,其余中间节点梯度在反向传播完成后就会自动释放以节省显存。 比如: import torch x=torch.Tensor([1,2]).requires_grad_(True) y=torch.Tensor([3,4]).req

kking_edc的博客 776

JS Hook 基本使用

JS Hook 基本使用

LI4836的博客 3115

Vue的hook的使用?

Vue Hook是组合式API的核心,分为内置Hook(如onMounted、watch)和自定义Hook(以use开头命名)。内置Hook用于生命周期管理和响应式操作,自定义Hook可实现逻辑复用(如useRequest请求封装)。相比Vue2的mixins,Hook具有逻辑隔离、类型安全等优势。使用时需注意:只能在setup中调用、命名规范、避免响应式丢失、及时清理资源。Vue Hook基于响应式依赖追踪,比React Hooks使用更简便。

854

TypeScript 中使用React Hook

从 React V 16.8.0 和 React Native 0.59.0 版本开始, 引入了React Hook的概念。React Hook 在开发支持就考虑到了类型,所以很多Hook函数可以直接推断出他们的参数、返回值等类型,但也有一些场景需要我们显示声明类型。阅读本文前你需要了解React Hook 的基本用法,参考这里。下面会总结一下我们如何在 TypeScript 中使用React H...

大前端码农的博客 4316

React Hook的使用

前言 JavaScript是世界上最流行的语言之一,React和Vue是JS最流行的两个框架。但各有优缺点,本文将详细对比两大框架 目录前言一、React Hook是什么?二、React目前提供的Hook三、Hook的使用1、useState2、useEffect & useLayoutEffect3、useMemo & useCallback4、useRef5、useContext6、useReducer四、hooks使用禁忌五、总结 一、React Hook是什么? 二、React目前提

程序员良仔 639

如何使用Frida在Android上进行hook

前言 我们对Android应用进行hook最常用的就是Xposed,它相对来说更加完善,而且有强大的社区和丰富的插件。而Frida则于Xposed不同,它是一款轻量级的Hook框架,可用于多平台,相同的是它依然需要root环境。本文就以Android为例来详细说说如何安装并使用它。 PC端 首选要在电脑上安装Frida,官方的安装步骤是

公众号:BennuCTech 5750

hook中ref使用

hook使用ref 父组件: 引入 useRef 声明ref的名字 const dateRef = useRef() 复值给组件 ref={dateRef} 使用 dateRef...

weixin_33842328的博客 8580
下一篇: 关于promise,以及请求优化
luofei_create
博客等级 码龄6年 3万+粉丝 22原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值