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. 记一次开发CefSharp做浏览器时关闭页面上时未释放遇到的小问题

    问题:当CefSharp放在List里,然后用了Remove移除,CefSharp是否还存在. 我将Cefsharp做成UserControl控件,然后在Main页面里采用List<UserCo ...

  2. Xshell如何连接

    Xshell如何连接

  3. Google 出品的 Java 编码规范,强烈推荐,既权威又科学

    这份文档是 Google Java 编程风格规范的完整定义.当且仅当一个Java源文件符合此文档中的规则, 我们才认为它符合Google的Java编程风格.原文:google.github.io/st ...

  4. jmeter设置HTTP代理,录制APP脚本

    1.打开jmeter,“工作台”右键——“添加”——“非测试元件”——“HTTP代理服务器” 2.设置端口号,手机需与这里的端口号一致 3.新建线程组,“测试计划”右键——“添加”——“Threads ...

  5. nginx限制访问域名,禁止IP访问

    有些时候我们希望系统只能通过固定的域名访问,禁止IP或者恶意绑定的域名访问. 下面的nginx配置,假如host变量不是指定的域名,将返回403. server { listen 80; server ...

  6. scrapy(三):post请求

    -- coding: utf-8 -- ''' QiuBai.py 爬虫文件 ''' -- coding: utf-8 -- import scrapy class PostSpider(scrapy ...

  7. Linux06 /Python web项目部署

    Linux06 /Python web项目部署 目录 Linux06 /Python web项目部署 1. 部署方式 2. 纯后端代码部署/CRM为例 1. 部署方式 2. crm项目详细部署步骤 3 ...

  8. electron代码审计

    解包 Electron跨平台程序破解https://www.52pojie.cn/thread-563895-1-1.html Electron封装的跨平台程序破解的一般思路: 安装npm(至于如何安 ...

  9. 原来不只是fastjson,这个你每天都在用的类库也被爆过反序列化漏洞!

    GitHub 15.8k Star 的Java工程师成神之路,不来了解一下吗! GitHub 15.8k Star 的Java工程师成神之路,真的不来了解一下吗! GitHub 15.8k Star ...

  10. Python Ethical Hacking - Bypass HTTPS(1)

    HTTPS: Problem: Data in HTTP is sent as plain text. A MITM can read and edit requests and responses. ...