首页 > 其他分享 >第四章、react高级

第四章、react高级

时间:2022-11-09 23:44:58浏览次数:48  
标签:React return render 高级 react extends 组件 class 第四章

目录

九、高阶组件和组件补充

1、认识高阶组件
import React from 'react';
import ReactDOM from 'react-dom/client';
import App from './layout/App';

const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(<App name="黄婷婷"/>);
import React from "react";

/**
 * 1、高阶函数的维基百科定义:至少满足以下条件之一
 *     - 接收一个或多个函数作为输入
 *     - 输出一个函数
 * 2、那么什么是高阶组件呢
 *     - 高阶组件的英文是Higher-Order Components,简称为HOC
 *     - 官方的定义:高阶组件是参数为组件,返回值为新组件的函数
 *     - 我们可以进行如下的解析
 *         ~ 首先,高阶组件本身不是一个组件,而是一个函数
 *         ~ 其次,这个函数的参数是一个组件,返回值也是一个组件
 * 3、高阶组件的定义
 *     - 高阶组件的调用过程类似于这样:
 *       const EnhancedComponent = higherOrderComponent(WrappedComponent)
 * 4、devtools的组件展示名称默认取class后的类名,如果class后没有类名则取父类class的类名。
 *   也可以手动取组件的展示名称:
 *       - class App {};App.displayName = '展示名称';
 *       - const App = class {};App.displayName = '展示名称';
 */
class App extends React.PureComponent {
  render() {
    return (<div>
      姓名:{this.props.name}
    </div>)
  }
}

function enhanceComponent(WrappedComponent) {
  return class NewComponent extends React.PureComponent {
    render() {
      return <WrappedComponent {...this.props}/>
    }
  }
}

const EnhanceComponent = enhanceComponent(App)
export default EnhanceComponent
2、高阶组件应用-增强props
import React from "react";

export default class App extends React.PureComponent {
  render() {
    return (<EnhanceComponent name="阿尔萨斯"/>)
  }
}

class Home extends React.PureComponent {
  render() {
    return (<div>
      <div>姓名:{this.props.name}</div>
      <div>年龄:{this.props.age}</div>
    </div>)
  }
}

function enhanceComponent(WrappedComponent) {
  return props => {
    return (<Home {...props} age={18}/>)
  }
}

const EnhanceComponent = enhanceComponent(App)
import React from "react";

const UserContext = React.createContext({
  name: "希尔瓦娜斯",
  age: 19
})

export default class App extends React.PureComponent {
  render() {
    return (<EnhanceComponent/>)
  }
}

class Home extends React.PureComponent {
  render() {
    return (<div>
      <div>姓名:{this.props.name}</div>
      <div>年龄:{this.props.age}</div>
    </div>)
  }
}

function enhanceComponent(WrappedComponent) {
  return props => {
    return (<UserContext.Consumer>
      {
        value => {
          return <Home {...props} {...value}/>
        }
      }
    </UserContext.Consumer>)
  }
}

const EnhanceComponent = enhanceComponent(App)
3、高阶组件应用-登录鉴权操作
import React from "react";

function withAuth(WrappedComponent) {
  return class AuthCartPage extends React.PureComponent {
    render() {
      const {isLogin} = this.props
      if (isLogin) {
        // 注意:组件名一定要大写开头
        return <WrappedComponent {...this.props}/>
      } else {
        return <LoginPage {...this.props}/>
      }
    }
  }
}

class CartPage extends React.PureComponent {
  render() {
    return (<div>CartPage</div>)
  }
}

const AuthCartPage = withAuth(CartPage);

class LoginPage extends React.PureComponent {
  render() {
    return (<div>LoginPage</div>)
  }
}

export default class App extends React.PureComponent {
  render() {
    return (<div>
      <AuthCartPage isLogin={false}/>
    </div>)
  }
}
4、高阶组件应用-生命周期劫持
import React from "react";

function withRenderTime(WrappedComponent) {
  return class extends React.PureComponent {
    UNSAFE_componentWillMount() {
      this.beginTime = Date.now()
    }

    render() {
      return (<WrappedComponent {...this.props}/>)
    }

    componentDidMount() {
      this.endTime = Date.now()
      const interval = this.endTime - this.beginTime
      console.log(`${WrappedComponent.name}渲染时间:${interval}`)
    }
  }
}

class Home extends React.PureComponent {
  render() {
    return (<div>Home</div>)
  }
}

class About extends React.PureComponent {
  render() {
    return (<div>About</div>)
  }
}

const TimeHome = withRenderTime(Home);
const TimeAbout = withRenderTime(About);

export default class App extends React.PureComponent {
  render() {
    return (<div>
      <TimeHome/>
      <TimeAbout/>
    </div>)
  }
}
5、ref的转发
import React from "react";

class Home extends React.PureComponent {
  render() {
    return (<div>Home</div>)
  }
}

const Profile = React.forwardRef(function (props, ref) {
  return (<div ref={ref}>Profile</div>)
})

export default class App extends React.PureComponent {
  constructor(props) {
    super(props);
    this.titleRef = React.createRef()
    this.homeRef = React.createRef()
    this.profileRef = React.createRef()
  }

  render() {
    return (<div>
      <div ref={this.titleRef}>hello world</div>
      <Home ref={this.homeRef}/>
      <Profile ref={this.profileRef}/>
      <button onClick={e => this.printRef()}>打印ref</button>
    </div>)
  }

  printRef() {
    console.log(this.titleRef.current)
    console.log(this.homeRef.current)
    console.log(this.profileRef.current)
  }
}
6、Portals的使用
import React from "react";
import ReactDOM from "react-dom"

// ui框架dialog的实现原理
class Modal extends React.PureComponent {
  render() {
    const div = document.createElement("div");
    Object.assign(div.style, {
      position: "fixed",
      left: "50%",
      top: "50%",
      transform: "translate(-50%,-50%)"
    })
    document.body.appendChild(div)
    return ReactDOM.createPortal(
      this.props.children,
      div
    )
  }
}

class Home extends React.PureComponent {
  render() {
    return (<div>
      <div>Home</div>
      <Modal>
        <div>Title</div>
      </Modal>
    </div>)
  }
}

export default class App extends React.PureComponent {
  render() {
    return (<div>
      <Home/>
    </div>)
  }
}

标签:React,return,render,高级,react,extends,组件,class,第四章
From: https://www.cnblogs.com/linding/p/16875593.html

相关文章

  • React组件基础三
    一.props用法组件是封闭的,要接收外部数据应该通过props来实现props的作用:接收传递给组件的数据传递数据:给组件标签添加属性接收数据:函数组件通过参数props接收......
  • react在create-react-app中使用hooks常见注意事项
    useState它的作用就是声明状态变量useState注意点:初始参数只在组件的首次渲染的时候使用,再次更新是会被忽略每次通过setXxx修改状态都会引起组件重新渲染useS......
  • react初始化代码下载太慢的解决方案
    react官方提供的初始方式:npxcreate-react-appmy-appcdmy-appnpmstart 这个方式的第一句npxcreate-react-appmy-app是从官网  https://registry.npmjs.......
  • React Native -- FlatList 之 下拉刷新,上拉加载
    FlatList组件importReact,{FC,useEffect,useState,useRef}from'react';import{ActivityIndicator,FlatListasRNFlastList,FlatListProps}from'react-......
  • Intellij IDEA高级使用技巧,快捷键、插件、项目搭建、部署等
    IntellijIDEA高级使用技巧,快捷键、插件、项目搭建、部署等​​一、快捷键​​​​二、必备插件​​​​2.1、lombok​​​​2.2、Codota,代码提示,如图,帮助我们认识很多对象......
  • React 中 ref 的使用
    官方文档传送门Refs&DOMuseRefuseImperativeHandle在类组件中使用ref1.React.createRefclassAppextendsReact.Component{constructor(props){......
  • Mysql中常用的高级脚本,批量等操作(脚本维护,数据导入/导出/清洗/迁移,备份等等操作),持续
    写在前面这里总结下Mysql中积累的一些批量操作Mysql系统中内置了两个很重要的数据库Mysql、information_schema、sys还有performance_schema,后续我们自创的DB都在这四个表......
  • react进阶用法完全指南
    React调用回调函数,正确设置this指向的三种方法通过bindthis.increment=this.increment.bind(this);通过箭头函数<buttononClick={this.multi}>点我*10</button......
  • React组件通信
    react因为组件化,使得组件间通信十分的重要。本文就来简单介绍一些常见的react组件间传递的内容。我将归纳为以下几种关系来详述:父组件与子组件之间,子组件与父组件之间,发......
  • react组件深度解读
    五、React核心是组件在React中,我们使用组件(有状态、可组合、可重用)来描述UI。在任何编程语言中,你都可以将组件视为简单的函数。React组件也一样,它的输入是props......