九、高阶组件和组件补充
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>)
}
}
原文地址:http://www.cnblogs.com/linding/p/16875593.html
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,请务用于商业用途!
3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员!
8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载
声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性