模块开发之react-redux使用装饰器函数Decorator(九)
发布日期:2021-06-29 14:16:19 浏览次数:2 分类:技术文章

本文共 3879 字,大约阅读时间需要 12 分钟。

模块开发之react-redux使用装饰器函数Decorator(九)

前言

这段时间一直搞前端模块开发,使用React框架,配置redux,中间使用react-redux框架连接。注意到在类上添加@符号,甚是不解,后来问其它人,才知道这是ES6新增装饰器函数。

它是一种特殊类型的声明,它可以附加到类声明、方法、参数或者属性上。装饰器由@符号紧接一个函数名称。
但是目前大多数浏览器中以及node环境中都不支持装饰器修饰,故需要babel转成低级别的JS代码。


装饰器函数Decorator

例子

@testableclass MyTestableClass {  // ...}function testable(target) {  target.isTestable = true;}MyTestableClass.isTestable // true

testable是一个函数,接收一个类做为对象,同时在类上添加一个静态对象,@testable修饰在类上,类当作参数传入装饰器函数里。

装饰器函数不仅可以是一个无返回的函数,也可以是返回一个函数的函数。类似如下

function testable(isTestable) {
return function(target) {
target.isTestable = isTestable; }}@testable(true)class MyTestableClass {
}MyTestableClass.isTestable // true

使用@符号放在类上,装饰器函数接收类做为第一个参数,可以对类做一些操作。这就是装饰器函数用来给附着的主体进行装饰,添加额外行为的一种方式。

修饰器本质就是编译时执行的函数,不是运行时执行的函数。

这里只介绍装饰器修饰在类上,其它的类属性和类方法里跳转链接自己学习。

总结一句话就是,使用@符号后面紧跟一个函数,这个函数的第一个参数是类,在函数里可以做一些对类的相关操作,这就是装饰器函数。


react-redux里使用装饰器函数

安装依赖

使用label这个loader支持Decorator功能。

npm install babel-plugin-transform-decorators-legacy --save-dev

项目根目录的.babelrc文件里添加如下(若没有该文件则创建,注意使用dos命令)

{    "plugins": [        "transform-decorators-legacy"    ]}

这样我们就能在项目里使用装饰器函数了。

connect(mapStateToProps, mapDispatchToProps)方法,我们知道connect返回一个函数,这个函数接收一个组件当参数,这个可以当成装饰器函数。

源始的connect使用方式

import { connect } from "react-redux";import { bindActionCreators } from "redux";import userAction from "../action/Action";//action creator路径,换成自己的。class MyReactComponent extends React.Component {
}function mapStateToProps(state){
return state;}function mapDispatchToProps(dispatch){
return bindActionCreators(userAction,dispatch)}export default connect(mapStateToProps, mapDispatchToProps)(MyReactComponent);

userAction是一个action creator。下面的例子中模块引入省略。

最简单的connect装饰器函数

@connect(mapStateToProps, mapDispatchToProps)class MyReactComponent extends React.Component {
}function mapStateToProps(state){
return state;}function mapDispatchToProps(dispatch){
return bindActionCreators(userAction,dispatch)}

或者更简洁的写法,使用Lambda表达式如下

@connect(state => state.user, dispatch => bindActionCreators(userAction, dispatch))class MyReactComponent extends React.Component {
}

稍微复杂的方式

单独将connect(mapStateToProps, mapDispatchToProps)抽出来,存放在一个文件connect.js(名字随便取)中做为模块使用,在组件上直接使用@connect()即可。

//connect.jsimport { connect } from "react-redux";import { bindActionCreators } from "redux";import userAction from "../action/Action";const mapStateToProps = state => stateconst mapDispatchToProps = dispatch => bindActionCreators(userAction, dispatch)export default connect(mapStateToProps, mapDispatchToProps)//MyReactComponent.jsx//组件上import connect from './connect'@connectclass MyReactComponent extends React.Component {
}

再高一级使用方式

假设redux的实例store维护的state对象中维护多个keyvalue,类似下面的

{main:{数据},user:{数据},role:{数据}...}

我们可以将创造connect装饰器函数再抽成一个模块函数,相当于装饰器函数的工厂。

//baseConnectFactory.j//函数工厂模块,可以接收数组import {connect} from 'react-redux'import {bindActionCreators} from 'redux'//stateKey是state里的key,action是传入的action creatorexport default (stateKey,action)=>connect (    state=>{        let s = {}        if(stateKey instanceof Array){            stateKey.forEach(k=>s[k]=state[k])        }else{            s=state[stateKey]        }        return s    },    dispatch=>{        let a = {}        if(action instanceof Array){            action.forEach(act=>a[act.name]=bindActionCreators(act,dispatch))        }else{            a = bindActionCreators(action,dispatch)        }        return a    })//MyReactComponentConnect.js//在需要使用装饰器的地方传入真实数据,构造装饰器函数import connect from './baseConnectFactory'//引入aseConnectFactory.js模块import userAction from '../user/action/Action'//引入action creator模块//导出装饰器函数export default connect (['main','user'],userAction)//MyReactComponent.jsx//组件上import connect from './MyReactComponentConnect'//直接使用装饰器@connectclass MyReactComponent extends React.Component {
}

总结

react-redux的connect装饰器使用方法基本上都是以上的情况。掌握上面的例子,在看别人写的代码或自己写装饰器都随心所意。

转载地址:https://chenyuan.blog.csdn.net/article/details/80862567 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:模块开发之webpack查看日志工具webpack-dashboard和jarvis(十)
下一篇:websocket与STMOP的比较及使用步骤

发表评论

最新留言

做的很好,不错不错
[***.243.131.199]2024年04月07日 14时48分37秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

开源项目|软件包应用作品:通用物联网系统平台 2019-04-29
【经验分享】RT-Thread UART设备驱动框架初体验(中断方式接收带\r\n的数据) 2019-04-29
单片机里面的CPU使用率是什么鬼? 2019-04-29
推荐一个优质Linux技术公众号-作者都是一线Linux代码贡献者们哦 2019-04-29
RT-Thread 编程风格指南 2019-04-29
95后高校电子教师,软硬兼修有趣有料! 2019-04-29
使用 STM32 通用 Bootloader ,让 OTA 更加 Easy 2019-04-29
Cache 的基本概念与工作原理 2019-04-29
装机量超亿台 RISC-V +IoT OS!中科蓝讯与RT-Thread战略合作,共推自主物联网生态发展 2019-04-29
Android程序员必备!面试一路绿灯Offer拿到手软,Android面试题及解析 2019-04-29
Android程序员的春天!12个View绘制流程高频面试题,分享PDF高清版 2019-04-29
深入交流安卓!新鲜出炉的Android面试真题集锦我给你们整理出来了!Android面试题及解析 2019-04-29
深入浅出Android开发!你会的还只有初级工程师的技术吗?一线互联网公司面经总结 2019-04-29
深度剖析原理!超全Android中高级面试复习大纲,含BATJM大厂 2019-04-29
温故而知新!Android开发者该学习哪些东西提高竞争力?成功入职阿里 2019-04-29
火爆知乎的Android面试题-Android-App的设计架构经验谈,大厂内部资料 2019-04-29
看完直接怼产品经理!Android多进程从头讲到尾,跳槽薪资翻倍 2019-04-29
快速从入门到精通!面试的时候突然遇到答不上的问题怎么办?已拿到offer 2019-04-29
Android开发知识体系!腾讯+字节+阿里面经真题汇总,成功入职阿里 2019-04-29
android开发语言!大厂经典高频面试题体系化集合,移动架构师成长路线 2019-04-29