node-swallowjs
Version:
epp portal
82 lines (78 loc) • 2.69 kB
JSX
var FormMixin = {
linkState(attr) {
var dots = attr.name.split('.'),
state = this.state,
name = dots[0];
for(let i=1; i<dots.length; i++) {
let r = /^(.+)\[(\d+)\]$/.exec(name);
if(r) {
name = r[1];
if(state[name]===undefined) state[name] = [];
state = state[name];
name = Number(r[2]);
}
if(state[name]===undefined) state[name] = {};
state = state[name];
name = dots[i];
}
var getter = function() {
return state[name];
};
var setter = function(value) {
state[name] = value;
this.forceUpdate();
}.bind(this);
switch(attr.type) {
case 'checkbox':
case 'radio':
attr.checked = getter()===attr.value;
break;
case 'file':
break;
default:
attr.value = getter();
}
attr.onChange = function(e) {
var that = e.target;
switch(that.type) {
case 'checkbox':
setter(that.checked ? that.value : undefined);
break;
case 'radio':
that.checked && setter(that.value);
break;
case 'file':
var file = that.files[0];
var reader = new FileReader();
switch(that.name){
case 'encodedSignedMark':
reader.onloadend = function(e) {
setter(e.target.result);
};
reader.readAsText(file);
break;
default:
var size = file && file.size/1024;
var types = ["image/png","image/jpeg","image/bmp"];
if(size < 5 || size > 5120 || types.indexOf(file.type)<0){
that.nextElementSibling.innerHTML = "上传的文件,大小或者类型不符合要求";
return;
}
that.nextElementSibling.innerHTML = "";
reader.onloadend = function(e) {
setter(e.target.result.split(',')[1]);
};
reader.readAsDataURL(file);
break;
}
break;
default:
setter(that.value);
}
};
return attr;
},
onSetState(attr) {
return e => this.setState(attr);
}
};