useCompareEffect

/**
* useCompareEffect
* useEffect只是普通的浅比较,这里做了深比较
* useEffect的依赖是否相同,相同不触发
*/
import { useEffect, useRef } from 'react'
import { isEqual } from 'lodash' export default function useCompareEffect(effect: React.EffectCallback, dependencies?: Object) {
function deepCompareDependencies(value: any) {
const ref = useRef() if (!isEqual(value, ref.current)) {
ref.current = value
} return ref.current
} useEffect(effect, deepCompareDependencies(dependencies))
}

useDependencyEffect

/**
* 组件 componentDidMount 的时候不执行 useEffect 的方法
* 只有依赖变化的时候会执行
*/
import { useRef, useEffect } from 'react' export default function useDependencyEffect(effect: React.EffectCallback, dependencies: any[]) {
const componentDidMount = useRef<boolean>(false) useEffect(() => {
if (componentDidMount.current) {
effect()
}
}, dependencies) /**
* 必须放在最底下
*/
useEffect(() => {
componentDidMount.current = true
}, [])
}

react不支持useState回调,建议采用useEffect,这里做了个useState的回调


/** useStateCallback setstate回调 */
export function useStateCallback<T>(initialState: T | (() => T)): [T, DispatchWithCallback<SetStateAction<T>>] {
const [state, _setState] = useState(initialState); const callbackRef = useRef<Callback<T>>();
const isFirstCallbackCall = useRef<boolean>(true); const setState = useCallback((setStateAction: SetStateAction<T>, callback?: Callback<T>): void => {
callbackRef.current = callback;
_setState(setStateAction);
}, []); useEffect(() => {
if (isFirstCallbackCall.current) {
isFirstCallbackCall.current = false;
return;
}
callbackRef.current?.(state);
}, [state]); return [state, setState];
} // 使用: const [state, setstate] = useStateCallback()

基于ant4 prompt优化

/**
* 离开页面prompt
*/
import React, { SetStateAction, useMemo, useState, useCallback, useRef, useEffect, ReactNode } from 'react'
import { Prompt, useHistory } from 'umi';
import { Modal } from 'antd'; type Callback<T> = (value?: T) => void;
type DispatchWithCallback<T> = (value: T, callback?: Callback<T>) => void; /** useStateCallback setstate回调 */
export function useStateCallback<T>(initialState: T | (() => T)): [T, DispatchWithCallback<SetStateAction<T>>] {
const [state, _setState] = useState(initialState); const callbackRef = useRef<Callback<T>>();
const isFirstCallbackCall = useRef<boolean>(true); const setState = useCallback((setStateAction: SetStateAction<T>, callback?: Callback<T>): void => {
callbackRef.current = callback;
_setState(setStateAction);
}, []); useEffect(() => {
if (isFirstCallbackCall.current) {
isFirstCallbackCall.current = false;
return;
}
callbackRef.current?.(state);
}, [state]); return [state, setState];
} interface Iprops {
isPrompt: boolean
content?: string
} export default function UsePrompt(props: Iprops) {
const [promptStatus, setpromptStatus] = useStateCallback(props.isPrompt)
const history = useHistory()
useEffect(() => {
setpromptStatus(props.isPrompt)
}, [props.isPrompt]) return (<>
<Prompt
when={promptStatus}
message={location => { Modal.confirm({
title: '提示',
content: props.content || '确认离开吗?系统可能不会保存当前表单',
okText: '确认',
cancelText: '取消',
onOk: () => {
setpromptStatus(false, () => {
history.push(location.pathname)
return false
})
}
});
return false;
}}
/>
</>)
}

React Hook~部分实用钩子的更多相关文章

  1. 【React 资料备份】React Hook

    Hooks是React16.8一个新增项,是我们可以不用创建class组件就能使用状态和其他React特性 准备工作 升级react.react-dom npm i react react-dom - ...

  2. React Hook上车

    React Hook 是 v16.8 的新功能,自诞生以来,受到广泛的好评,在 React 版本更新中具有里程碑的意义.现在都2020年了,再不上车 React Hook 就真的 out 了... H ...

  3. 【译】值得推荐的十大React Hook 库

    十大React Hook库 原文地址:https://dev.to/bornfightcompany/top-10-react-hook-libraries-4065 原文作者:Juraj Pavlo ...

  4. React Hook 入门使用

    React Hook 是什么 1.没有比官网说的更好的 HOOK 1. React Hook 官方 2. 用我们自己的话说,它是一个钩子函数,用来处理组件间的状态的一个方法,暂时理解为一个高阶函数吧. ...

  5. React报错之React Hook useEffect has a missing dependency

    正文从这开始~ 总览 当useEffect钩子使用了一个我们没有包含在其依赖数组中的变量或函数时,会产生"React Hook useEffect has a missing depende ...

  6. React报错之React hook 'useState' is called conditionally

    正文从这开始~ 总览 当我们有条件地使用useState钩子时,或者在一个可能有返回值的条件之后,会产生"React hook 'useState' is called conditiona ...

  7. React报错之React Hook 'useEffect' is called in function

    正文从这开始~ 总览 为了解决错误"React Hook 'useEffect' is called in function that is neither a React function ...

  8. React报错之React hook 'useState' cannot be called in a class component

    正文从这开始~ 总览 当我们尝试在类组件中使用useState 钩子时,会产生"React hook 'useState' cannot be called in a class compo ...

  9. [React] Detect user activity with a custom useIdle React Hook

    If the user hasn't used your application for a few minutes, you may want to log them out of the appl ...

随机推荐

  1. 一文说通Blazor for Server-Side的项目结构

    用C#代替Javascript来做Web应用,是有多爽?   今天聊聊 Blazor. Blazor 是一个 Web UI 框架.这个框架允许开发者使用 C# 来创建可运行于浏览器的具有完全交互 UI ...

  2. 机器学习实战基础(二十四):sklearn中的降维算法PCA和SVD(五) PCA与SVD 之 重要接口inverse_transform

    重要接口inverse_transform  在上周的特征工程课中,我们学到了神奇的接口inverse_transform,可以将我们归一化,标准化,甚至做过哑变量的特征矩阵还原回原始数据中的特征矩阵 ...

  3. python 装饰器(七):装饰器实例(四)类装饰器装饰类以及类方法

    类装饰器装饰类方法 不带参数 from functools import wraps import types class CatchException: def __init__(self,orig ...

  4. 空间金字塔池化 ssp-net

    <Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition>,这篇paper提出了空间金字 ...

  5. python技巧 namedtuple

    python的namedtuple可以创建一个带字段名的元祖和一个带名字的类 In [1]: from collections import namedtuple ...: ...: nginx=na ...

  6. Presto原理及安装

    背景 MapReduce不能满足大数据快速实时adhoc查询计算的性能要求,Facebook2012年开发,2013年开源 是什么 基于内存的并行计算,Facebook推出的分布式SQL交互式查询引擎 ...

  7. 理解js中的原型,原型对象,原型链

    目录 理解原型 理解原型对象 实例属性与原型属性的关系 更简单的原型语法 原型的动态性 原型链 理解原型 我们创建的每一个函数都有一个prototype(原型)属性,这个属性是一个指针,指向一个对象, ...

  8. Docker部署LNMP完整教程

    在Docker中部署LNMP环境可以分为以下几个步骤: 安装Docker 创建镜像 创建Dockerfile build Docerfile 复制/修改配置文件 运行镜像,并映射端口 为了方便分布式部 ...

  9. 用c#自己实现一个简单的JSON解析器

    一.JSON格式介绍 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.相对于另一种数据交换格式 XML,JSON 有着很多优点.例如易读性更好,占用空间更 ...

  10. Elasticsearch7.X ILM索引生命周期管理(冷热分离)

    Elasticsearch7.X ILM索引生命周期管理(冷热分离) 一.“索引生命周期管理”概述 Elasticsearch索引生命周期管理指:Elasticsearch从设置.创建.打开.关闭.删 ...