mirror of
https://github.com/alibaba/lowcode-engine.git
synced 2026-03-02 07:20:38 +00:00
feat: 低代码组件支持实时修改属性
This commit is contained in:
parent
7168a903ce
commit
e7b4e2cc9c
@ -1,6 +1,6 @@
|
|||||||
import { BuiltinSimulatorRenderer, Component, DocumentModel, Node, NodeInstance } from '@ali/lowcode-designer';
|
import { BuiltinSimulatorRenderer, Component, DocumentModel, Node, NodeInstance } from '@ali/lowcode-designer';
|
||||||
import { ComponentSchema, NodeSchema, NpmInfo, RootSchema, TransformStage } from '@ali/lowcode-types';
|
import { ComponentSchema, NodeSchema, NpmInfo, RootSchema, TransformStage } from '@ali/lowcode-types';
|
||||||
import { Asset, cursor, isElement, isESModule, isReactComponent, setNativeSelection } from '@ali/lowcode-utils';
|
import { Asset, compatibleLegaoSchema, cursor, isElement, isESModule, isPlainObject, isReactComponent, setNativeSelection } from '@ali/lowcode-utils';
|
||||||
import LowCodeRenderer from '@ali/lowcode-rax-renderer';
|
import LowCodeRenderer from '@ali/lowcode-rax-renderer';
|
||||||
import { computed, obx } from '@recore/obx';
|
import { computed, obx } from '@recore/obx';
|
||||||
import DriverUniversal from 'driver-universal';
|
import DriverUniversal from 'driver-universal';
|
||||||
@ -493,7 +493,7 @@ export class SimulatorRendererContainer implements BuiltinSimulatorRenderer {
|
|||||||
|
|
||||||
createComponent(schema: NodeSchema): Component | null {
|
createComponent(schema: NodeSchema): Component | null {
|
||||||
const _schema: any = {
|
const _schema: any = {
|
||||||
...schema,
|
...compatibleLegaoSchema(schema),
|
||||||
};
|
};
|
||||||
_schema.methods = {};
|
_schema.methods = {};
|
||||||
_schema.lifeCycles = {};
|
_schema.lifeCycles = {};
|
||||||
@ -513,8 +513,10 @@ export class SimulatorRendererContainer implements BuiltinSimulatorRenderer {
|
|||||||
|
|
||||||
class LowCodeComp extends Rax.Component {
|
class LowCodeComp extends Rax.Component {
|
||||||
render() {
|
render() {
|
||||||
|
const extraProps = getLowCodeComponentProps(this.props);
|
||||||
// @ts-ignore
|
// @ts-ignore
|
||||||
return createElement(LowCodeRenderer, {
|
return createElement(LowCodeRenderer, {
|
||||||
|
...extraProps,
|
||||||
schema: _schema,
|
schema: _schema,
|
||||||
components,
|
components,
|
||||||
designMode: renderer.designMode,
|
designMode: renderer.designMode,
|
||||||
@ -620,4 +622,18 @@ function findComponent(libraryMap: LibraryMap, componentName: string, npm?: NpmI
|
|||||||
return getSubComponent(library, paths);
|
return getSubComponent(library, paths);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function getLowCodeComponentProps(props: any) {
|
||||||
|
if (!props || !isPlainObject(props)) {
|
||||||
|
return props;
|
||||||
|
}
|
||||||
|
const newProps: any = {};
|
||||||
|
Object.keys(props).forEach(k => {
|
||||||
|
if (['children', 'componentId', '__designMode', '_componentName', '_leaf'].includes(k)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
newProps[k] = props[k];
|
||||||
|
});
|
||||||
|
return newProps;
|
||||||
|
}
|
||||||
|
|
||||||
export default new SimulatorRendererContainer();
|
export default new SimulatorRendererContainer();
|
||||||
|
|||||||
@ -12,6 +12,8 @@ import {
|
|||||||
setNativeSelection,
|
setNativeSelection,
|
||||||
buildComponents,
|
buildComponents,
|
||||||
getSubComponent,
|
getSubComponent,
|
||||||
|
compatibleLegaoSchema,
|
||||||
|
isPlainObject,
|
||||||
} from '@ali/lowcode-utils';
|
} from '@ali/lowcode-utils';
|
||||||
import { RootSchema, ComponentSchema, TransformStage, NodeSchema } from '@ali/lowcode-types';
|
import { RootSchema, ComponentSchema, TransformStage, NodeSchema } from '@ali/lowcode-types';
|
||||||
// import { isESModule, isElement, acceptsRef, wrapReactClass, cursor, setNativeSelection } from '@ali/lowcode-utils';
|
// import { isESModule, isElement, acceptsRef, wrapReactClass, cursor, setNativeSelection } from '@ali/lowcode-utils';
|
||||||
@ -396,7 +398,7 @@ export class SimulatorRendererContainer implements BuiltinSimulatorRenderer {
|
|||||||
|
|
||||||
createComponent(schema: NodeSchema): Component | null {
|
createComponent(schema: NodeSchema): Component | null {
|
||||||
const _schema: any = {
|
const _schema: any = {
|
||||||
...schema,
|
...compatibleLegaoSchema(schema),
|
||||||
};
|
};
|
||||||
_schema.methods = {};
|
_schema.methods = {};
|
||||||
_schema.lifeCycles = {};
|
_schema.lifeCycles = {};
|
||||||
@ -415,8 +417,10 @@ export class SimulatorRendererContainer implements BuiltinSimulatorRenderer {
|
|||||||
|
|
||||||
class LowCodeComp extends React.Component {
|
class LowCodeComp extends React.Component {
|
||||||
render() {
|
render() {
|
||||||
|
const extraProps = getLowCodeComponentProps(this.props);
|
||||||
// @ts-ignore
|
// @ts-ignore
|
||||||
return createElement(LowCodeRenderer, {
|
return createElement(LowCodeRenderer, {
|
||||||
|
...extraProps, // 防止覆盖下面内置属性
|
||||||
schema: _schema,
|
schema: _schema,
|
||||||
components,
|
components,
|
||||||
designMode: renderer.designMode,
|
designMode: renderer.designMode,
|
||||||
@ -543,4 +547,18 @@ function checkInstanceMounted(instance: any): boolean {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function getLowCodeComponentProps(props: any) {
|
||||||
|
if (!props || !isPlainObject(props)) {
|
||||||
|
return props;
|
||||||
|
}
|
||||||
|
const newProps: any = {};
|
||||||
|
Object.keys(props).forEach(k => {
|
||||||
|
if (['children', 'componentId', '__designMode', '_componentName', '_leaf'].includes(k)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
newProps[k] = props[k];
|
||||||
|
});
|
||||||
|
return newProps;
|
||||||
|
}
|
||||||
|
|
||||||
export default new SimulatorRendererContainer();
|
export default new SimulatorRendererContainer();
|
||||||
|
|||||||
@ -412,7 +412,7 @@ export function parseData(schema: any, self: any): any {
|
|||||||
return schema;
|
return schema;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* 全匹配{{开头,}}结尾的变量表达式,或者对象类型JSExpression,且均不支持省略this */
|
/* 全匹配{{开头,}}结尾的变量表达式,或者对象类型JSExpression,支持省略this */
|
||||||
export function parseExpression(str: any, self: any) {
|
export function parseExpression(str: any, self: any) {
|
||||||
try {
|
try {
|
||||||
const contextArr = ['"use strict";', 'var __self = arguments[0];'];
|
const contextArr = ['"use strict";', 'var __self = arguments[0];'];
|
||||||
@ -431,7 +431,8 @@ export function parseExpression(str: any, self: any) {
|
|||||||
if (inSameDomain() && (window.parent as any).__newFunc) {
|
if (inSameDomain() && (window.parent as any).__newFunc) {
|
||||||
return (window.parent as any).__newFunc(tarStr)(self);
|
return (window.parent as any).__newFunc(tarStr)(self);
|
||||||
}
|
}
|
||||||
return new Function(tarStr)(self);
|
const code = `with($scope || {}) { ${tarStr} }`;
|
||||||
|
return new Function('$scope', code)(self);
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
debug('parseExpression.error', err, str, self);
|
debug('parseExpression.error', err, str, self);
|
||||||
return undefined;
|
return undefined;
|
||||||
|
|||||||
@ -21,3 +21,4 @@ export * from './unique-id';
|
|||||||
export * from './build-components';
|
export * from './build-components';
|
||||||
export * from './appHelper';
|
export * from './appHelper';
|
||||||
export * from './misc';
|
export * from './misc';
|
||||||
|
export * from './schema';
|
||||||
|
|||||||
@ -2,6 +2,15 @@
|
|||||||
import { isI18NObject } from './is-object';
|
import { isI18NObject } from './is-object';
|
||||||
import get from 'lodash.get';
|
import get from 'lodash.get';
|
||||||
import { ComponentMeta } from '@ali/lowcode-designer';
|
import { ComponentMeta } from '@ali/lowcode-designer';
|
||||||
|
interface Variable {
|
||||||
|
type: 'variable';
|
||||||
|
variable: string;
|
||||||
|
value: any;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function isVariable(obj: any): obj is Variable {
|
||||||
|
return obj && obj.type === 'variable';
|
||||||
|
}
|
||||||
|
|
||||||
export function isUseI18NSetter(prototype: any, propName: string) {
|
export function isUseI18NSetter(prototype: any, propName: string) {
|
||||||
const configure = prototype?.options?.configure;
|
const configure = prototype?.options?.configure;
|
||||||
|
|||||||
45
packages/utils/src/schema.ts
Normal file
45
packages/utils/src/schema.ts
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
import { isJSBlock } from '@ali/lowcode-types';
|
||||||
|
import { isVariable } from './misc';
|
||||||
|
import { isPlainObject } from './is-plain-object';
|
||||||
|
|
||||||
|
export function compatibleLegaoSchema(props: any) {
|
||||||
|
if (!props) {
|
||||||
|
return props;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Array.isArray(props)) {
|
||||||
|
return props.map(k => compatibleLegaoSchema(k));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!isPlainObject(props)) {
|
||||||
|
return props;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isJSBlock(props)) {
|
||||||
|
if (props.value.componentName === 'Slot') {
|
||||||
|
return {
|
||||||
|
type: 'JSSlot',
|
||||||
|
title: (props.value.props as any)?.slotTitle,
|
||||||
|
name: (props.value.props as any)?.slotName,
|
||||||
|
value: props.value.children,
|
||||||
|
};
|
||||||
|
} else {
|
||||||
|
return props.value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (isVariable(props)) {
|
||||||
|
return {
|
||||||
|
type: 'JSExpression',
|
||||||
|
value: props.variable,
|
||||||
|
mock: props.value,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
const newProps: any = {};
|
||||||
|
Object.keys(props).forEach((key) => {
|
||||||
|
if (/^__slot__/.test(key) && props[key] === true) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
newProps[key] = compatibleLegaoSchema(props[key]);
|
||||||
|
});
|
||||||
|
return newProps;
|
||||||
|
}
|
||||||
@ -1,45 +1,10 @@
|
|||||||
import {
|
|
||||||
isPlainObject,
|
|
||||||
} from '@ali/lowcode-utils';
|
|
||||||
import { Node } from '@ali/lowcode-designer';
|
import { Node } from '@ali/lowcode-designer';
|
||||||
import { isJSBlock } from '@ali/lowcode-types';
|
import { compatibleLegaoSchema } from '@ali/lowcode-utils';
|
||||||
import { isVariable } from '../utils';
|
|
||||||
import { designerCabin } from '@ali/lowcode-engine';
|
import { designerCabin } from '@ali/lowcode-engine';
|
||||||
|
|
||||||
const { getConvertedExtraKey } = designerCabin;
|
const { getConvertedExtraKey } = designerCabin;
|
||||||
|
|
||||||
export function upgradePropsReducer(props: any) {
|
export const upgradePropsReducer = compatibleLegaoSchema;
|
||||||
if (!props || !isPlainObject(props)) {
|
|
||||||
return props;
|
|
||||||
}
|
|
||||||
if (isJSBlock(props)) {
|
|
||||||
if (props.value.componentName === 'Slot') {
|
|
||||||
return {
|
|
||||||
type: 'JSSlot',
|
|
||||||
title: (props.value.props as any)?.slotTitle,
|
|
||||||
name: (props.value.props as any)?.slotName,
|
|
||||||
value: props.value.children,
|
|
||||||
};
|
|
||||||
} else {
|
|
||||||
return props.value;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (isVariable(props)) {
|
|
||||||
return {
|
|
||||||
type: 'JSExpression',
|
|
||||||
value: props.variable,
|
|
||||||
mock: props.value,
|
|
||||||
};
|
|
||||||
}
|
|
||||||
const newProps: any = {};
|
|
||||||
Object.keys(props).forEach((key) => {
|
|
||||||
if (/^__slot__/.test(key) && props[key] === true) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
newProps[key] = upgradePropsReducer(props[key]);
|
|
||||||
});
|
|
||||||
return newProps;
|
|
||||||
}
|
|
||||||
|
|
||||||
export function upgradePageLifeCyclesReducer(props: any, node: Node) {
|
export function upgradePageLifeCyclesReducer(props: any, node: Node) {
|
||||||
const lifeCycleNames = ['didMount', 'willUnmount'];
|
const lifeCycleNames = ['didMount', 'willUnmount'];
|
||||||
|
|||||||
@ -1,14 +1,5 @@
|
|||||||
import { designer } from '@ali/lowcode-engine';
|
import { designer } from '@ali/lowcode-engine';
|
||||||
|
export { isVariable } from '@ali/lowcode-utils';
|
||||||
interface Variable {
|
|
||||||
type: 'variable';
|
|
||||||
variable: string;
|
|
||||||
value: any;
|
|
||||||
}
|
|
||||||
|
|
||||||
export function isVariable(obj: any): obj is Variable {
|
|
||||||
return obj && obj.type === 'variable';
|
|
||||||
}
|
|
||||||
|
|
||||||
export function getCurrentFieldIds() {
|
export function getCurrentFieldIds() {
|
||||||
const fieldIds: any = [];
|
const fieldIds: any = [];
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user