Merge branch hotfix/code-generator-initial-state into release/1.0.0

Title: fix: 🐛 schema 中没有 state 的定义, 出码后的 Rax/React 组件应有个默认的空的 state 

即使 schema 中没有 state 的定义,根据 React 和 Rax 的 class 组件的规范,也应该有一个空的 state 的 -- 否则在访问数据源, this.state.xxx 或 this.setState 等相关的一些 API 的时候会报错的。

Link: https://code.aone.alibaba-inc.com/ali-lowcode/ali-lowcode-engine/codereview/4083908
This commit is contained in:
rongbin.arb 2020-11-12 22:55:11 +08:00
commit 3853302678
4 changed files with 48 additions and 49 deletions

View File

@ -32,33 +32,31 @@ const pluginFactory: BuilderComponentPluginFactory<PluginConfig> = (config?) =>
const ir = next.ir as IContainerInfo; const ir = next.ir as IContainerInfo;
const scope = Scope.createRootScope(); const scope = Scope.createRootScope();
if (ir.state) { const state = ir.state || {};
const state = ir.state; const fields = Object.keys(state).map<string>((stateName) => {
const fields = Object.keys(state).map<string>((stateName) => { // TODO: 这里用什么 handlers?
// TODO: 这里用什么 handlers? const value = generateCompositeType(state[stateName], scope);
const value = generateCompositeType(state[stateName], scope); return `${stateName}: ${value}`;
return `${stateName}: ${value}`; });
});
if (cfg.implementType === 'inConstructor') { if (cfg.implementType === 'inConstructor') {
next.chunks.push({ next.chunks.push({
type: ChunkType.STRING, type: ChunkType.STRING,
fileType: cfg.fileType, fileType: cfg.fileType,
name: CLASS_DEFINE_CHUNK_NAME.ConstructorContent, name: CLASS_DEFINE_CHUNK_NAME.ConstructorContent,
content: `this.state = { ${fields.join(',')} };`, content: `this.state = { ${fields.join(',')} };`,
linkAfter: [...DEFAULT_LINK_AFTER[CLASS_DEFINE_CHUNK_NAME.ConstructorContent]], linkAfter: [...DEFAULT_LINK_AFTER[CLASS_DEFINE_CHUNK_NAME.ConstructorContent]],
}); });
} else if (cfg.implementType === 'insMember') { } else if (cfg.implementType === 'insMember') {
next.chunks.push({ next.chunks.push({
type: ChunkType.STRING, type: ChunkType.STRING,
fileType: cfg.fileType, fileType: cfg.fileType,
name: CLASS_DEFINE_CHUNK_NAME.InsVar, name: CLASS_DEFINE_CHUNK_NAME.InsVar,
content: `state = { ${fields.join(',')} };`, content: `state = { ${fields.join(',')} };`,
linkAfter: [...DEFAULT_LINK_AFTER[CLASS_DEFINE_CHUNK_NAME.InsVar]], linkAfter: [...DEFAULT_LINK_AFTER[CLASS_DEFINE_CHUNK_NAME.InsVar]],
}); });
}
// TODO: hooks state??
} }
// TODO: hooks state??
return next; return next;
}; };

View File

@ -32,32 +32,29 @@ const pluginFactory: BuilderComponentPluginFactory<PluginConfig> = (config?) =>
const ir = next.ir as IContainerInfo; const ir = next.ir as IContainerInfo;
const scope = Scope.createRootScope(); const scope = Scope.createRootScope();
if (ir.state) { const state = ir.state || {};
const { state } = ir; const fields = Object.keys(state).map<string>((stateName) => {
const fields = Object.keys(state).map<string>((stateName) => { const value = generateCompositeType(state[stateName], scope);
const value = generateCompositeType(state[stateName], scope); return `${stateName}: ${value},`;
return `${stateName}: ${value},`; });
if (cfg.implementType === 'inConstructor') {
next.chunks.push({
type: ChunkType.STRING,
fileType: cfg.fileType,
name: CLASS_DEFINE_CHUNK_NAME.ConstructorContent,
content: `this.state = { ${fields.join('')} };`,
linkAfter: [...DEFAULT_LINK_AFTER[CLASS_DEFINE_CHUNK_NAME.ConstructorContent]],
});
} else if (cfg.implementType === 'insMember') {
next.chunks.push({
type: ChunkType.STRING,
fileType: cfg.fileType,
name: CLASS_DEFINE_CHUNK_NAME.InsVar,
content: `state = { ${fields.join('')} };`,
linkAfter: [...DEFAULT_LINK_AFTER[CLASS_DEFINE_CHUNK_NAME.InsVar]],
}); });
if (cfg.implementType === 'inConstructor') {
next.chunks.push({
type: ChunkType.STRING,
fileType: cfg.fileType,
name: CLASS_DEFINE_CHUNK_NAME.ConstructorContent,
content: `this.state = { ${fields.join('')} };`,
linkAfter: [...DEFAULT_LINK_AFTER[CLASS_DEFINE_CHUNK_NAME.ConstructorContent]],
});
} else if (cfg.implementType === 'insMember') {
next.chunks.push({
type: ChunkType.STRING,
fileType: cfg.fileType,
name: CLASS_DEFINE_CHUNK_NAME.InsVar,
content: `state = { ${fields.join('')} };`,
linkAfter: [...DEFAULT_LINK_AFTER[CLASS_DEFINE_CHUNK_NAME.InsVar]],
});
}
} }
return next; return next;
}; };
return plugin; return plugin;

View File

@ -20,6 +20,8 @@ import __$$projectUtils from '../../utils';
import './index.css'; import './index.css';
class Home$$Page extends Component { class Home$$Page extends Component {
state = {};
_methods = this._defineMethods(); _methods = this._defineMethods();
_context = this._createContext(); _context = this._createContext();

View File

@ -20,6 +20,8 @@ import __$$projectUtils from '../../utils';
import './index.css'; import './index.css';
class Home$$Page extends Component { class Home$$Page extends Component {
state = {};
_methods = this._defineMethods(); _methods = this._defineMethods();
_context = this._createContext(); _context = this._createContext();