amis
Version:
一种MIS页面生成工具
172 lines (171 loc) • 7.82 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.SchemaRenderer = void 0;
var tslib_1 = require("tslib");
var difference_1 = tslib_1.__importDefault(require("lodash/difference"));
var omit_1 = tslib_1.__importDefault(require("lodash/omit"));
var react_1 = tslib_1.__importDefault(require("react"));
var LazyComponent_1 = tslib_1.__importDefault(require("./components/LazyComponent"));
var factory_1 = require("./factory");
var Root_1 = require("./Root");
var helper_1 = require("./utils/helper");
var defaultOmitList = [
'type',
'name',
'$ref',
'className',
'data',
'children',
'ref',
'visible',
'visibleOn',
'hidden',
'hiddenOn',
'disabled',
'disabledOn',
'component',
'detectField',
'required',
'requiredOn',
'syncSuperStore'
];
var SchemaRenderer = /** @class */ (function (_super) {
tslib_1.__extends(SchemaRenderer, _super);
function SchemaRenderer(props) {
var _this = _super.call(this, props) || this;
_this.refFn = _this.refFn.bind(_this);
_this.renderChild = _this.renderChild.bind(_this);
_this.reRender = _this.reRender.bind(_this);
return _this;
}
SchemaRenderer.prototype.componentWillMount = function () {
this.resolveRenderer(this.props);
};
SchemaRenderer.prototype.componentWillReceiveProps = function (nextProps) {
var props = this.props;
if (props.schema &&
nextProps.schema &&
(props.schema.type !== nextProps.schema.type ||
props.schema.$$id !== nextProps.schema.$$id)) {
this.resolveRenderer(nextProps);
}
};
// 限制:只有 schema 除外的 props 变化,或者 schema 里面的某个成员值发生变化才更新。
SchemaRenderer.prototype.shouldComponentUpdate = function (nextProps) {
var props = this.props;
var list = difference_1.default(Object.keys(nextProps), [
'schema',
'scope'
]);
if (difference_1.default(Object.keys(props), ['schema', 'scope']).length !==
list.length ||
helper_1.anyChanged(list, this.props, nextProps)) {
return true;
}
else {
var list_1 = Object.keys(nextProps.schema);
if (Object.keys(props.schema).length !== list_1.length ||
helper_1.anyChanged(list_1, props.schema, nextProps.schema)) {
return true;
}
}
return false;
};
SchemaRenderer.prototype.resolveRenderer = function (props, skipResolve) {
if (skipResolve === void 0) { skipResolve = false; }
var schema = props.schema;
var path = props.$path;
if (schema && schema.$ref) {
schema = tslib_1.__assign(tslib_1.__assign({}, props.resolveDefinitions(schema.$ref)), schema);
path = path.replace(/(?!.*\/).*/, schema.type);
}
if (!skipResolve) {
var rendererResolver = props.env.rendererResolver || factory_1.resolveRenderer;
this.renderer = rendererResolver(path, schema, props);
}
return { path: path, schema: schema };
};
SchemaRenderer.prototype.getWrappedInstance = function () {
return this.ref;
};
SchemaRenderer.prototype.refFn = function (ref) {
this.ref = ref;
};
SchemaRenderer.prototype.renderChild = function (region, node, subProps) {
if (subProps === void 0) { subProps = {}; }
var _a = this.props, schema = _a.schema, $path = _a.$path, env = _a.env, rest = tslib_1.__rest(_a, ["schema", "$path", "env"]);
if (schema && schema.$ref) {
var result = this.resolveRenderer(this.props, true);
schema = result.schema;
$path = result.path;
}
var omitList = defaultOmitList.concat();
if (this.renderer) {
var Component = this.renderer.component;
Component.propsList &&
omitList.push.apply(omitList, Component.propsList);
}
return Root_1.renderChild("" + $path + (region ? "/" + region : ''), node || '', tslib_1.__assign(tslib_1.__assign(tslib_1.__assign({}, omit_1.default(rest, omitList)), subProps), { data: subProps.data || rest.data, env: env }));
};
SchemaRenderer.prototype.reRender = function () {
this.resolveRenderer(this.props);
this.forceUpdate();
};
SchemaRenderer.prototype.render = function () {
var _this = this;
var _a = this.props, $path = _a.$path, schema = _a.schema, rest = tslib_1.__rest(_a, ["$path", "schema"]);
if (schema === null) {
return null;
}
if (schema.$ref) {
var result = this.resolveRenderer(this.props, true);
schema = result.schema;
$path = result.path;
}
var theme = this.props.env.theme;
if (Array.isArray(schema)) {
return Root_1.renderChildren($path, schema, rest);
}
else if (schema.children) {
return react_1.default.isValidElement(schema.children)
? schema.children
: schema.children(tslib_1.__assign(tslib_1.__assign({}, rest), { $path: $path, render: this.renderChild, forwardedRef: this.refFn }));
}
else if (typeof schema.component === 'function') {
var isSFC = !(schema.component.prototype instanceof react_1.default.Component);
return react_1.default.createElement(schema.component, tslib_1.__assign(tslib_1.__assign(tslib_1.__assign({}, rest), schema), { $path: $path, ref: isSFC ? undefined : this.refFn, forwardedRef: isSFC ? this.refFn : undefined, render: this.renderChild }));
}
else if (Object.keys(schema).length === 0) {
return null;
}
else if (!this.renderer) {
return (react_1.default.createElement(LazyComponent_1.default, tslib_1.__assign({}, rest, { getComponent: function () { return tslib_1.__awaiter(_this, void 0, void 0, function () {
var result;
return tslib_1.__generator(this, function (_a) {
switch (_a.label) {
case 0: return [4 /*yield*/, rest.env.loadRenderer(schema, $path, this.reRender)];
case 1:
result = _a.sent();
if (result && typeof result === 'function') {
return [2 /*return*/, result];
}
else if (result && react_1.default.isValidElement(result)) {
return [2 /*return*/, function () { return result; }];
}
this.reRender();
return [2 /*return*/, function () { return factory_1.loadRenderer(schema, $path); }];
}
});
}); }, "$path": $path, retry: this.reRender })));
}
var renderer = this.renderer;
schema = factory_1.filterSchema(schema, renderer, rest);
var defaultData = schema.data, restSchema = tslib_1.__rest(schema, ["data"]);
var Component = renderer.component;
return (react_1.default.createElement(Component, tslib_1.__assign({}, theme.getRendererConfig(renderer.name), restSchema, helper_1.chainEvents(rest, restSchema), { defaultData: defaultData, "$path": $path, ref: this.refFn, render: this.renderChild })));
};
SchemaRenderer.displayName = 'Renderer';
return SchemaRenderer;
}(react_1.default.Component));
exports.SchemaRenderer = SchemaRenderer;
//# sourceMappingURL=./SchemaRenderer.js.map