美文网首页
高阶组件装饰器演变过程

高阶组件装饰器演变过程

作者: Small_Song | 来源:发表于2021-02-16 09:52 被阅读0次

高阶组件装饰器

  • 装饰器整个函数的演变过程如下:

** 注意利用函数式组件进行化简!**

import React from 'react'; //1 组件原型
class Reg extends React.Component{
    render(){ return <_Reg service={service} />;
 }
} //2 匿名组件
const Reg = class extends React.Component{
    render(){ return <_Reg service={service} />;
 }
} //3 提参数
function inject(Comp){ return class extends React.Component{
        render(){ return <Comp service={service} />;
 }
    }
} //继续提参数
function inject(service,Comp){ return class extends React.Component{
        render(){ return <Comp service={service} />;
 }
    }
} //4 props
function inject(obj,Comp){ return class extends React.Component{
        render(){ return <Comp {...obj} />;
 }
    }
} //5 柯里化
function inject(obj){ function wrapper(Comp){ return class extends React.Component{
            render(){ return <Comp {...obj} />;
 }
        }
    } return wrapper;
} //变形 + 箭头函数化简 v1
const inject = obj => Comp => {
    class extends React.Component{
        render(){ return <Comp {...obj} />;
 }
    }
} //变形 + 箭头函数化简 + 函数式组件化简 v2
const inject = obj => Comp => { return () => <Comp {...obj} />;
} //finally
const inject = ovj => Comp => props =>  <Comp {...obj}/>;
const inject = ovj => Comp => props =>  <Comp {...obj} {...props}/>;
  • 新建src/utils.js,放入以下内容
import React from 'react';
const inject = obj => Comp => props => <Comp {...obj}{...props}/>;
export {inject};
  • 将登陆注册组建修改一下:
//src/component/login.js修改如下:
import React from 'react';
import '../css/login.css';
import UserService from '../service/user';
import {Link,Redirect} from 'react-router-dom' import {observer} from 'mobx-react';
import {message} from 'antd';
import 'antd/lib/message/style'; //新增
import {inject} from '../utils';

const service = new UserService(); //注意装饰器顺序
**@inject({service})**  //生成{service:service}对象
@observer
export default class Login extends React.Component{
    handleClick(event){
        event.preventDefault();
        let fm = event.target.form; this.props.service.login(
            fm[0].value,fm[1].value
        );
    }
    render(){
        console.log('in login.js') if (this.props.service.loggedin){ return <Redirect to='/about' />; 
 } if (this.props.service.errMsg){
            message.info(this.props.service.errMsg,3,
                ()=> SetTimeout(()=>this.props.service.errMsg=''),1000);
        } return ( <div className="login-page">
                <div className="form">
                    <form className="login-form">
                    <input type="text" placeholder="邮箱"/>
                    <input type="password" placeholder="密码"/>
                    <button onClick={this.handleClick.bind(this)}>登录</button>
                    <p className="message">还未注册? <a href="/reg">注册用户</a></p>
                    </form>
                </div>
            </div>
 ); 
    }
}
//src/component/reg.js修改如下:
import React from 'react';
import {Redirect,Link} from 'react-router-dom';
import '../css/login.css' import UserService from '../service/user';
import {observer} from 'mobx-react';
import {message} from 'antd';
import 'antd/lib/message/style'; //新增
import {inject} from '../utils';

const service = new UserService();

@inject({service}) //生成{service:service}对象并注入组件<Reg />
@observer
export default class Reg extends React.Component{
    handleClick(event){
        event.preventDefault();
        let fm = event.target.form; this.props.service.reg(fm[0].value,fm[1].value,fm[2].value);
    }

    render(){
        console.log('component reg!!') if(this.props.service.loggedin){ return <Redirect to='/'/>;
 } if(this.props.service.errMsg){
            message.info(this.props.service.errMsg,3,()=>{
                setTimeout(()=>this.props.service.errMsg='',1000);
            })
        } return ( <div className="login-page">
                <div className="form">
                    <form className="register-form">
                    <input type="text" placeholder="姓名"/>
                    <input type="text" placeholder="邮箱"/>
                    <input type="password" placeholder="密码"/>
                    <input type="password" placeholder="确认密码"/>
                    <button onClick={this.handleClick.bind(this)}>注册</button>
                    <p className="message">如果已经注册 <Link to="/login">请登录</Link></p>
                    </form>
                </div>
            </div>
 ); 
    }
}

https://www.cnblogs.com/xiaoshayu520ly/p/11442822.html

相关文章

  • 高阶组件装饰器演变过程

    高阶组件装饰器 装饰器整个函数的演变过程如下: ** 注意利用函数式组件进行化简!** 新建src/utils.j...

  • 高阶组件装饰器 演变过程如下:

    import React from 'react'// 1 原始版本class Reg extends React...

  • React高阶组件

    React高阶组件 在开始聊高阶组件之前我们先来看下高阶函数和高阶组件在形式上的差异: 一、什么是装饰器模式: 要...

  • ES7 装饰器模式的配置

    装饰器模式简介 在使用 React 框架编程中,我们用高阶组件的时候,使用时往往需要用高阶组件函数包裹当前组件来导...

  • 装饰器

    [TOC] 函数 函数定义 函数调用 高阶函数 嵌套函数 装饰器 装饰器=高阶函数+嵌套函数 基础装饰器 假设有一...

  • React组件化(二)高阶组件、装饰器、复合组件

    高阶组件 定义:是一个函数,它接收一个组件并返回另一个组件基本使用 装饰器 先安装 git add .git co...

  • Python装饰器

    Python装饰器 装饰器的本质是什么? 装饰器等价于高阶函数,形如myfunc=decorator(myfunc...

  • ts中使用高阶组件

    在TS中,编译器会对装饰器作用的值做签名一致性检查,而我们在高阶组件中一般都会返回新的组件,并且对被作用的组件的 ...

  • python装饰器

    装饰器简述 要理解装饰器需要知道Python高阶函数和python闭包,Python高阶函数可以接受函数作为参数,...

  • react 支持"decorators"装饰器语法

    背景 为了让react项目中的高阶组件支持装饰器语法。下面的步骤基于create-react-app创建的reac...

网友评论

      本文标题:高阶组件装饰器演变过程

      本文链接:https://www.haomeiwen.com/subject/yvrexltx.html