常见问题
以下整理了一些在使用 Handie 时可能常见或比较有特点的问题以及官方答复,在提问之前建议找找有没有类似的问题。若无特殊说明,与视图库/框架相关的示例代码用 Vue 编写。
想复用由 createView()
创建的视图时页面显示空白
假设在 animation
模块下有个用 createView()
创建的动画列表:
// `domain/animation/views/animation-list/index.ts`
// ...
export default createView(context, {
name: 'AnimationListView',
category: 'list',
renderType: 'table',
fields: [/* ... */],
actions: [/* ... */],
search: [/* ... */],
});
并且在路由配置中对其进行了关联:
// `entry/routes/animation.ts`
// ...
export default [
{
name: 'animationList',
path: 'animations',
component: () => import("@/domain/animation/views/animation-list"),
},
];
在另外一个页面中的某个区域也要显示动画列表,想要进行复用,于是乎:
// `domain/animation/views/index.ts`
export { default as AnimationListView } from './animation-list';
在浏览器页面刷新后,会看到原本正常显示的动画列表页的主体区域一片空白……
造成这个问题的根本原因是代码执行顺序——
在应用入口文件中 createApp()
时会对 Handie 运行所必需的各种资源进行注册:
// `entry/index.ts`
// ...
import components from '../shared/components';
import modules from '../domain';
import routes from './routes';
// ...
createApp({
components,
metadata: { modules },
routes,
// ...
});
然而,资源注册之前在 import modules from '../domain';
时就已经执行了 animation
模块下创建动画列表的 createView()
,这时是找不到要被渲染的公用视图部件的,就显示了空白。
复用动画列表的正确方式是:
- 用返回视图描述器的工厂函数替代
createView()
; - 创建一个代理用的 UI 组件,里面用视图渲染器去渲染改造好的视图,并将路由配置指向该组件;
- 在其他要复用的地方同样使用视图渲染器去渲染。