闲来无聊,按照自己平时使用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;
}
}
function proxyObject(target = {}) {
return new Proxy(target,{
set() {
console.log('不允许修改props的参数')
},
get(obj, prop) {
return Reflect.get(obj, prop)
}
})
}
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])
}
})
}
var Component = constructProxy(class {
constructor(props){
console.dir(new.target)
this.props = props;
}
})
class Com extends Component{
constructor(props){
super(props)
console.log(this.props.a)
this.props.a = ''
}
}
Com.propTypes = {
a:PropTypes.number,
b:PropTypes.bool
}
Com.defaultProps = {
a:'c'
}
new Com()
|