高阶函数hoc:高阶函数是对其他函数进行操作的函数

高阶组件hof:高阶组件即接受一个或多个组件作为参数并且返回一个组件,本质也就是一个函数,并不是一个组件 。把通用的逻辑放在高阶组件中,对组件实现一致的处理,从而实现代码的复用

高阶函数:指一类函数,防抖,节流

`防抖`: 短时间内频繁触发同一事件时,只有最后一次生效. 例如电梯关门的效果

`节流`: 短时间内频繁触发同一个事件时,在单位时间内,只生效一次。例如lol英雄的大招

箭头函数每次触发都会执行一次。但是执行的不是debounce这个高阶函数返回的闭包函数。

所以:防抖节流不要箭头函数

//utils下tools.js工具import React, { Component } from 'react';
// 高阶函数HOF:eg:防抖节流
// 防抖
export function debounce(func, time ) {var timerid = null;return function(){if (timerid) { //如果定时器存在,则销毁定时器clearTimeout(timerid)}// 创建新的定时器timerid = setTimeout(()=>{func()},time)}
}
// 节流
export function throttle(func, time){var timerid = null;return function(){if(!timerid){ //如果定时器不存在 则创建定时器// 创建新的定时器timerid = setTimeout(()=>{func();// 执行完会清除定时器,然后让timerid回归nullclearTimeout(timerid)timerid = null}, time)}}
}

使用防抖节流

import React, { Component } from 'react';
import './App.css'
//导入工具
import {debounce,throttle} from './utils/tools'
//
import A from './components/A'
import B from './components/B'
import C from './components/C'
class App extends Component {// 发请求了handleChange(){console.log("发送请求");}render() {return (<div className='app'>{/* 防抖演示:错误 */}{/* <input type="text" onChange={()=>{this.handleChange()}}/> */}{/* 防抖演示:正确 */}<input type="text" onChange={debounce(this.handleChange, 300) }/><br /><br /><br />{/* 节流演示:错误 */}{/* <input type="text" onChange={()=>{this.handleChange()}}/> */}{/* 节流演示:正确 */}{/* <input type="text" onChange={this.handleChange}/> */}<input type="text" onChange={throttle(this.handleChange,200)}/><A></A><B></B><C></C></div>);}
}export default App;

高阶组件:复用组件逻辑

高阶组件就是一个函数,它接收一个组件作为输入,然后返回一个新的组件作为结果,且所返回的新组件会进行相对逻辑增强

拖拽

//utils下tools.js工具import React, { Component } from 'react';// 高阶组件(重用拖拽逻辑)
export function DragHOC(Com){return class tools extends Component{constructor(props){super(props);this.state = {top:0,left:0}}handleMouseDown(){// 鼠标移动时,获取鼠标的位置document.onmousemove = (e)=>{this.setState({left:e.pageX,top:e.pageY})}document.onmouseup = ()=>{document.onmousemove = null}}render(){return(<div onMouseDown={()=>{this.handleMouseDown()}} style={{position:'absolute',left:this.state.left + 'px',top:this.state.top + 'px'}}><Com /></div>)}}
}

使用

import React, { Component } from 'react';
import './A.css'
// 导入
import { DragHOC } from '../utils/tools';class A extends Component {render() {return (<div className='a'>a组件</div>);}
}
// 使用
export default DragHOC(A);

装饰器配置才能使用@DragHOC:::自行配置

抛出前处理一下组件 ,A,B,C三个组件

import React, { Component } from 'react';
import './A.css'import { DragHOC } from '../utils/tools';//以装饰器语法,应用高阶组件
@DragHOC
class A extends Component {render() {return (<div className='a'>a组件</div>);}
}//export default DragHOC(A);
export default A;

装饰器配置:

1.

2.

3.

4.

5.

react-5 高阶函数 (HOC)(防抖节流) --- 高阶组件(HOF)(拖拽)相关推荐

  1. 第 3 节 JavaScript高阶函数的使用、v-model、组件化

    第3节 JavaScript高阶函数的使用.v-model.组件化 JavaScript 高阶函数的使用 v-model v-model的使用和原理 v-model 结合 radio 类型使用 v-m ...

  2. python四大高阶函数_详谈Python高阶函数与函数装饰器(推荐)

    一.上节回顾 Python2与Python3字符编码问题,不管你是初学者还是已经对Python的项目了如指掌了,都会犯一些编码上面的错误.我在这里简单归纳Python3和Python2各自的区别. 首 ...

  3. python高阶函数心得体会_Python高阶函数使用总结

    Datawhale干货   作者:皮钱超,厦门大学,Datawhale原创作者 本文约2000字,建议阅读6分钟 审稿人:耿远昊,Datawhale成员,华东师范大学,开源教程<Joyful-P ...

  4. python使用高阶函数实现_18.python高阶函数

    什么是高阶函数:一个函数可以作为参数传给另外一个函数(一个函数可以用来接收另一个函数作为参数),或者一个函数的返回值为另外一个函数(若返回值为该函数本身,则为递归),满足其一则为高阶函数.函数的形参位 ...

  5. python四大高阶函数_Python里的高阶函数

    1.map() 是 Python 内置的高阶函数,它接收一个函数 f 和一个 list,并通过把函数 f 依次作用在 list 的每个元素上,得到一个新的 list 并返回. def f(x): re ...

  6. 廖雪峰讲python高阶函数求导_高阶函数 - 廖雪峰的Python2.7教程 - 广州尚鹏

    高阶函数英文叫Higher-order function.什么是高阶函数?我们以实际代码为例子,一步一步深入概念. 变量可以指向函数 以Python内置的求绝对值的函数abs()为例,调用该函数用以下 ...

  7. 廖雪峰讲python高阶函数求导_高阶函数 · 廖雪峰的Python3.x教程 · 看云

    [TOC] ### 引入 高阶函数英文叫`Higher-order function`.什么是高阶函数?我们以实际代码为例子,一步一步深入概念. ### 变量可以指向函数 以Python内置的求绝对值 ...

  8. scala中的高阶函数_Scala中的高阶函数(HOF)

    scala中的高阶函数 Higher Order Functions (HOF) in Scala are the very core of this functional programming l ...

  9. 什么是高阶函数,常见的高阶函数 有哪些?

    如果一个函数符合下面2个 规范中任何一个,那该函数就是高阶函数 1.若a函数,接收的参数是一个函数,那么a就可以称之为高阶函数 2.若a函数,调用的返回值依然是一个函数,那么a就可以称之为高阶函数. ...

最新文章

  1. java transient关键字_小伙子,你真的搞懂 transient 关键字了吗?
  2. torch_geometric 笔记:global_mean_pool
  3. Ubuntu20.04中安装shutter
  4. 中国少数民族文学馆在内蒙古呼和浩特揭幕
  5. floyd判环算法(龟兔赛跑算法)
  6. 如何在Java中使用QRGen创建QRCode
  7. 0054-软件版本号问题
  8. C语言口令,某一本地口令验证函数(c语言环境,x86_32指令集)包含如下关键代码:某用户的口令保存在字符数组origpassw...
  9. 使用.NET Core进行Linux编程3:简介和第2章
  10. 《Linux命令行与shell脚本编程大全》读书笔记————第一章 初识Linux shell
  11. 解决了昨天差点让人崩溃的问题.
  12. 什么是elastic-job(持续更新)
  13. Excel数据分析学习笔记(三)Excel常用数据分析工具(需要统计学基础)
  14. 李迟2022年4月工作生活总结
  15. DLink无线路由器做交换机配置
  16. 解决安卓apk在其他手机无法安装问题
  17. 5款服装进销存软件测评,教您如何挑选出好用的
  18. PD等多协议快充诱骗触发器SINK(“Power Z 弟弟 Power Low”)DIY
  19. 昔日金屋中的女人,谁都难免面对帝王决然的背影
  20. 【python之re模块学习第2天】正则表达式的应用:贪婪模式与懒惰模式

热门文章

  1. GlusterFS 分布式文件系统
  2. 2016年12月29日
  3. windows利用msys2安装minGW64
  4. Fortify介绍及使用教程
  5. java的@NotNull怎么用
  6. WebDriver高阶API(8)
  7. 解决Wordpress国外主题的fonts.gstatic.com访问慢的问题
  8. 实时日志分析系统-ELK
  9. 贪心策略(一)(选择排序、分割平衡串、买卖股票、跳跃游戏)
  10. 阿里云短信服务 发送短信验证码 区分业务场景