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

高阶函数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回归null
                clearTimeout(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.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 React 中,高阶组件(Higher-Order Component,HOC)是一种函数,接收一个组件作为参数,并返回一个新的组件HOC 可以用于复用组件逻辑、增强组件功能或包装组件。 以下是一个简单的例子来说明如何创建一个 HOC: ```javascript import React from 'react'; // HOC 接收一个组件作为参数,并返回一个新的增强组件 const withLogger = (WrappedComponent) => { return class extends React.Component { componentDidMount() { console.log('Component is mounted'); } render() { // 返回被包装的组件,并传递所有的 props return <WrappedComponent {...this.props} />; } }; }; // 被包装的组件 const MyComponent = (props) => { return <div>{props.message}</div>; }; // 使用 HOC 包装组件 const EnhancedComponent = withLogger(MyComponent); // 在应用中使用增强后的组件 const App = () => { return <EnhancedComponent message="Hello, World!" />; }; ``` 在上面的例子中,`withLogger` 是一个 HOC,它接收一个组件作为参数,并返回一个新的增强组件。在返回的增强组件中,我们可以添加一些额外的逻辑或功能。在这个例子中,我们在增强组件的 `componentDidMount` 生命周期方法中打印一条日志。 然后,我们创建了一个被包装的组件 `MyComponent`,它接收一个 `message` 属性并进行渲染。 最后,我们使用 `withLogger` HOC 包装了 `MyComponent` 组件,将增强后的组件 `EnhancedComponent` 作为应用的一个子组件进行渲染。 这只是 HOC 的一个简单示例,你可以根据需要创建更复杂的 HOC 来增强组件的功能。HOC 可以帮助我们实现代码的复用和逻辑的封装。但是在使用 HOC 时,也要注意遵循一些最佳实践,例如避免命名冲突、正确传递 props 等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值