IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> JavaScript知识库 -> 模拟React 的PropTypes,检查props参数,并附初始值。 -> 正文阅读

[JavaScript知识库]模拟React 的PropTypes,检查props参数,并附初始值。

闲来无聊,按照自己平时使用React 的PropTypes,使用class,Proxy,Reflect简单实现了一个自己的PropTypes。 只是个人学习用,有不对的地方欢迎指教,不喜勿喷。

// 检查是否符合条件类
class PropTypes{
    static any = ''
    static object = 'Object'
    static bool = 'Boolean'
    static string = 'String'
    static number = 'Number'
    static array = 'Array'
    static func = 'Function'
    static propEqual(value,type){
        return type ? Object.prototype.toString.call(value) === '[object ' + type + ']' :true;
    }
    static checkType(param = {},proptypes = {}){
        let arr = []
        for(let key in proptypes){
             if(!PropTypes.propEqual(param[key] , proptypes[key])){
                    arr.push(`props参数${key}应该为${proptypes[key]}格式`)                 
             }
        }
        return arr;
    }
}
// 代理重新生成props的值,只能查看,不能修改
 function proxyObject(target = {}) {
     return new Proxy(target,{
         set() {
             console.log('不允许修改props的参数')
         },
         get(obj, prop) {
             return Reflect.get(obj, prop)
         }
     })
 }
// 这里代理类的构造函数,调用构造函数前检查props参数的类
// 其实也可以写到类的构造函数里,用这种方法如果还有类需要检查props参数,就不用再写一遍了
function constructProxy(target){
    return new Proxy(target,{
        construct(a,b,{propTypes={},defaultProps={}}={}){
            let props = b[0] || {};
            props = proxyObject({...defaultProps,...props})
            let warn = PropTypes.checkType(props,propTypes);
            if(warn.length>0){
                console.warn(warn.join('\r\n'))
                console.warn('参数不一致会发生未知的错误,请检查传递的参数')
            }
         return Reflect.construct(target, [props])
        }
    })
}
// 使用构造函数代理生成的class Component

var Component = constructProxy(class {
    constructor(props){
        console.dir(new.target)
        this.props = props;
    }
})
// react有一个基类,所有的组件都继承Component类,这里简单的模拟了一下
// Com类
class Com extends Component{
     constructor(props){
        super(props)
        console.log(this.props.a) // 可以读取 输出c
        this.props.a = ''// 修改会报错
     }
 }
 // Com的props参数类型
 Com.propTypes = {
   a:PropTypes.number,
   b:PropTypes.bool
 }
 // Com的props默认参数
 Com.defaultProps = {
    a:'c'
 }
 new Com()
  JavaScript知识库 最新文章
ES6的相关知识点
react 函数式组件 & react其他一些总结
Vue基础超详细
前端JS也可以连点成线(Vue中运用 AntVG6)
Vue事件处理的基本使用
Vue后台项目的记录 (一)
前后端分离vue跨域,devServer配置proxy代理
TypeScript
初识vuex
vue项目安装包指令收集
上一篇文章      下一篇文章      查看所有文章
加:2021-08-29 08:59:40  更:2021-08-29 09:00:28 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/27 6:23:32-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码
数据统计