From 7e7071f74ff6d7c07c0dbf2ddafb11fb64bfa46e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8D=A3=E5=BD=AC?= Date: Tue, 21 Jul 2020 14:54:21 +0800 Subject: [PATCH 01/14] =?UTF-8?q?=E4=BF=AE=E6=94=B9rax=20ref?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/rax-render/src/engine/base.jsx | 101 ++++++++++++------------ packages/rax-render/src/utils/index.js | 4 +- 2 files changed, 52 insertions(+), 53 deletions(-) diff --git a/packages/rax-render/src/engine/base.jsx b/packages/rax-render/src/engine/base.jsx index 101438235..a10ca50bb 100644 --- a/packages/rax-render/src/engine/base.jsx +++ b/packages/rax-render/src/engine/base.jsx @@ -24,7 +24,7 @@ import { import VisualDom from '../comp/visualDom'; import AppContext from '../context/appContext'; -// import CompWrapper from '../hoc/compWrapper'; +import CompWrapper from '../hoc/compWrapper'; const debug = Debug('engine:base'); const DESIGN_MODE = { @@ -85,31 +85,30 @@ export default class BaseEngine extends Component { console.warn(e); } - reloadDataSource = () => - new Promise((resolve, reject) => { - debug('reload data source'); - if (!this.__dataHelper) { - this.__showPlaceholder = false; - return resolve(); - } - this.__dataHelper - .getInitData() - .then((res) => { + reloadDataSource = () => new Promise((resolve, reject) => { + debug('reload data source'); + if (!this.__dataHelper) { this.__showPlaceholder = false; - if (isEmpty(res)) { - this.forceUpdate(); - return resolve(); - } - this.setState(res, resolve); - }) - .catch((err) => { - if (this.__showPlaceholder) { + return resolve(); + } + this.__dataHelper + .getInitData() + .then((res) => { this.__showPlaceholder = false; - this.forceUpdate(); - } - reject(err); - }); - }); + if (isEmpty(res)) { + this.forceUpdate(); + return resolve(); + } + this.setState(res, resolve); + }) + .catch((err) => { + if (this.__showPlaceholder) { + this.__showPlaceholder = false; + this.forceUpdate(); + } + reject(err); + }); + }); __setLifeCycleMethods = (method, args) => { const lifeCycleMethods = getValue(this.props.__schema, 'lifeCycles', {}); @@ -125,8 +124,8 @@ export default class BaseEngine extends Component { __bindCustomMethods = (props = this.props) => { const { __schema } = props; const customMethodsList = Object.keys(__schema.methods || {}) || []; - this.__customMethodsList && - this.__customMethodsList.forEach((item) => { + this.__customMethodsList + && this.__customMethodsList.forEach((item) => { if (!customMethodsList.includes(item)) { delete this[item]; } @@ -216,8 +215,7 @@ export default class BaseEngine extends Component { } } - const { __appHelper: appHelper, __components: components = {}, __componentsMap: componentsMap = {} } = - this.props || {}; + const { __appHelper: appHelper, __components: components = {}, __componentsMap: componentsMap = {} } = this.props || {}; const { engine } = this.context || {}; if (isJSExpression(schema)) { return parseExpression(schema, self); @@ -228,9 +226,7 @@ export default class BaseEngine extends Component { } if (Array.isArray(schema)) { if (schema.length === 1) return this.__createVirtualDom(schema[0], self, parentInfo); - return schema.map((item, idx) => - this.__createVirtualDom(item, self, parentInfo, item && item.__ctx && item.__ctx.lunaKey ? '' : idx), - ); + return schema.map((item, idx) => this.__createVirtualDom(item, self, parentInfo, item && item.__ctx && item.__ctx.lunaKey ? '' : idx),); } // 解析占位组件 @@ -290,11 +286,11 @@ export default class BaseEngine extends Component { // 容器类组件的上下文通过props传递,避免context传递带来的嵌套问题 const otherProps = isFileSchema(schema) ? { - __schema: schema, - __appHelper: appHelper, - __components: components, - // __componentsMap: componentsMap, - } + __schema: schema, + __appHelper: appHelper, + __components: components, + // __componentsMap: componentsMap, + } : {}; if (engine && engine.props.designMode) { otherProps.__designMode = engine.props.designMode; @@ -309,15 +305,16 @@ export default class BaseEngine extends Component { }, }); // 对于可以获取到ref的组件做特殊处理 - if (acceptsRef(Comp)) { - otherProps.ref = (ref) => { - const refProps = props.ref; - if (refProps && typeof refProps === 'string') { - this[refProps] = ref; - } - engine && engine.props.onCompGetRef(schema, ref); - }; + if (!acceptsRef(Comp)) { + Comp = CompWrapper(Comp); } + otherProps.ref = (ref) => { + const refProps = props.ref; + if (refProps && typeof refProps === 'string') { + this[refProps] = ref; + } + engine && engine.props.onCompGetRef(schema, ref); + }; // scope需要传入到组件上 if (scopeKey && this.__compScopes[scopeKey]) { @@ -345,12 +342,12 @@ export default class BaseEngine extends Component { ); } - const renderComp = (props) => engine.createElement( - Comp, + const renderComp = (props) => + engine.createElement( + Comp, props, - (!isFileSchema(schema) - && !!schema.children - && + (!isFileSchema(schema) + !!schema.children && this.__createVirtualDom( isJSExpression(schema.children) ? parseExpression(schema.children, self) : schema.children, self, @@ -358,8 +355,8 @@ export default class BaseEngine extends Component { schema, Comp, }, - )) || - null, + )) + || null, ); // 设计模式下的特殊处理 if (engine && [DESIGN_MODE.EXTEND, DESIGN_MODE.BORDER].includes(engine.props.designMode)) { @@ -457,7 +454,7 @@ export default class BaseEngine extends Component { if (isEmpty(params)) { return checkProps(this.__createVirtualDom(data, self, { schema, Comp })); } - return checkProps(function() { + return checkProps(function () { const args = {}; if (Array.isArray(params) && params.length) { params.map((item, idx) => { diff --git a/packages/rax-render/src/utils/index.js b/packages/rax-render/src/utils/index.js index 802d5733d..e6119969b 100644 --- a/packages/rax-render/src/utils/index.js +++ b/packages/rax-render/src/utils/index.js @@ -268,7 +268,9 @@ export function generateI18n(locale = 'zh-CN', messages = {}) { * @param {*} Comp 需要判断的组件 */ export function acceptsRef(Comp) { - return !!Comp; + return ( + (Comp.$$typeof && Comp.$$typeof === REACT_FORWARD_REF_TYPE) || (Comp.prototype && Comp.prototype.isReactComponent) + ); } /** From 635b2e00914b88e5b8c1d88b6a31d9eb7a5c8999 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8D=A3=E5=BD=AC?= Date: Tue, 21 Jul 2020 15:23:34 +0800 Subject: [PATCH 02/14] =?UTF-8?q?=E6=96=B0=E5=A2=9Eref=E6=A3=80=E6=B5=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/rax-render/src/engine/base.jsx | 2 +- packages/rax-render/src/utils/index.js | 4 +--- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/packages/rax-render/src/engine/base.jsx b/packages/rax-render/src/engine/base.jsx index a10ca50bb..016a21dbb 100644 --- a/packages/rax-render/src/engine/base.jsx +++ b/packages/rax-render/src/engine/base.jsx @@ -346,7 +346,7 @@ export default class BaseEngine extends Component { engine.createElement( Comp, props, - (!isFileSchema(schema) + (!isFileSchema(schema) && !!schema.children && this.__createVirtualDom( isJSExpression(schema.children) ? parseExpression(schema.children, self) : schema.children, diff --git a/packages/rax-render/src/utils/index.js b/packages/rax-render/src/utils/index.js index e6119969b..9100f9619 100644 --- a/packages/rax-render/src/utils/index.js +++ b/packages/rax-render/src/utils/index.js @@ -268,9 +268,7 @@ export function generateI18n(locale = 'zh-CN', messages = {}) { * @param {*} Comp 需要判断的组件 */ export function acceptsRef(Comp) { - return ( - (Comp.$$typeof && Comp.$$typeof === REACT_FORWARD_REF_TYPE) || (Comp.prototype && Comp.prototype.isReactComponent) - ); + return Comp && Comp.prototype && Comp.prototype.setState; } /** From 95bf33149d457675d9b4d57a74cb2b3b7f7f7911 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=93=8D=E6=8C=87?= Date: Tue, 21 Jul 2020 15:31:11 +0800 Subject: [PATCH 03/14] feat: rax render --- packages/demo/public/index.html | 2 +- packages/demo/public/rax.json | 2 +- packages/demo/public/raxAssets.json | 428 +++++++++++++++--- packages/demo/src/vision/index.ts | 15 +- packages/rax-provider/package.json | 5 +- packages/rax-render/src/engine/base.jsx | 7 +- packages/rax-render/src/engine/index.jsx | 5 +- packages/rax-render/src/hoc/compFactory.js | 4 +- packages/rax-render/src/hoc/compWrapper.js | 35 +- packages/rax-render/src/utils/index.js | 2 +- packages/rax-simulator-renderer/package.json | 1 + .../src/renderer-view.tsx | 9 +- .../rax-simulator-renderer/src/renderer.ts | 8 +- packages/react-renderer/package.json | 2 - packages/utils/src/is-element.ts | 1 + 15 files changed, 415 insertions(+), 111 deletions(-) diff --git a/packages/demo/public/index.html b/packages/demo/public/index.html index 5a4ed76dd..7b1286b5e 100644 --- a/packages/demo/public/index.html +++ b/packages/demo/public/index.html @@ -16,7 +16,7 @@ - +