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. F5隐写工具使用

      0x00 前言 今天在实验吧看到一个图片隐写的题目,用了stegslove和winHex分析一通发现并没有什么有效信息.看了评论区大佬的提示说用到了F5隐写工具,所以百度教程用了一下,发现确实解决 ...

  2. ant design pro 当中改变ant design 组件的样式和 数据管理

    ant design pro 简介 官网简介 链接 https://pro.ant.design/docs/getting-started-cn 项目结构 https://github.com/ant ...

  3. robotframework日志输出中文乱码以及robotframework常用关键字-笔者亲测

    一.环境说明 python版本:3.7.3 robotframework版本:3.1 robotframwork-ride版本:1.7.4.2 二.问题描述

  4. mongodb(五):聚合操作(python)

    pymongo的聚合操作 数据类型样式 /* 1 */ { "_id" : ObjectId("5e5a32fe2a89d7c2fc05b9fc"), &quo ...

  5. 机器学习实战基础(十九):sklearn中数据集

    sklearn提供的自带的数据集   sklearn 的数据集有好多个种 自带的小数据集(packaged dataset):sklearn.datasets.load_<name> 可在 ...

  6. tensorflow实现lstm中遇到的函数记录

    函数一:initializer=tf.random_uniform_initializer(-0.1, 0.1, seed=123) tf.random_uniform_initializer 参数: ...

  7. Nslookup命令的使用 - [详细]

    用法一.查询IP地址 nslookup最简单的用法就是查询域名对应的IP地址,包括A记录和CNAME记录,如果查到的是CNAME记录还会返回别名记录的设置情况.其用法是: nslookup 域名 # ...

  8. bzoj3673可持久化并查集 by zky&&bzoj3674可持久化并查集加强版

    bzoj3673可持久化并查集 by zky 题意: 维护可以恢复到第k次操作后的并查集. 题解: 用可持久化线段树维护并查集的fa数组和秩(在并查集里的深度),不能路径压缩所以用按秩启发式合并,可以 ...

  9. ATX学习(一)-atx-server

    今天无意中发现了ATX手机设备管理平台,瞬间勾引起了我极大的兴趣,这里对学习过程中的情况做个记录. 1.搭建环境 先按照作者步骤搭建环境出来吧,哇,突然发现ATX搭建环境很方便(一会就搭建好了)   ...

  10. 老司机带你玩转面试(5):Redis 集群模式 Redis Cluster

    前文回顾 建议前面文章没看过的同学先看下前面的文章: 「老司机带你玩转面试(1):缓存中间件 Redis 基础知识以及数据持久化」 「老司机带你玩转面试(2):Redis 过期策略以及缓存雪崩.击穿. ...