DevEco Studio提供HarmonyOS应用/服务的UI预览界面与源代码文件间的双向预览功能,支持ets文件与预览器界面的双向预览。使用双向预览功能时,需要在预览器界面单击
开启双向预览功能后,支持代码编辑器、UI界面和Component Tree组件树三者之间的联动:
在预览界面还可以通过组件的属性面板修改可修改的属性或样式,在预览界面修改后,预览器会自动同步到代码编辑器中修改源码,并实时的刷新UI界面;同样的,如果在代码编辑器中修改源码,也会实时刷新UI界面,并更新组件树信息及组件属性。
说明
- 如果组件有做数据绑定,则其属性不支持在属性面板修改。
- 如果界面有使用动画效果或者带动画效果组件,则其属性不支持在属性面板修改。
- 多设备预览时,不支持双向预览。
说明
仅API 11及以上版本的Stage工程支持。
在预览场景中,由于代码的运行环境与真机设备上的运行环境不同,调用部分接口时无法获取到有效的返回值(例如获取电池电量信息等,在预览场景下batteryInfo.voltage返回的是一个固定的值0),这样开发者就无法在预览时查看到不同返回值带来的界面变化。因此,Hamock提供了预览场景的模拟功能,在不改变业务运行逻辑的同时,开发者可以模拟UI组件上的属性或方法,或模拟import的模块接口。
使用Hamock在预览场景模拟,需要在工程或模块的oh-package.json5中添加该依赖,然后重新同步工程。
"devDependencies": {
"@ohos/hamock": "1.0.0"
}
Hamock提供了@MockSetup用于修饰Mock方法,仅支持声明式范式的组件。当开发者预览该组件时,预览运行时将在组件初始化时执行被@MockSetup修饰的方法。因此,开发者可以在这个被修饰的方法内重定义组件的方法或重赋值组件的属性,其将在预览时生效。
说明
@MockSetup修饰的方法仅在预览场景会自动触发,并先于组件的aboutToAppear执行。
import { MockSetup } from '@ohos/hamock';
import { MockSetup } from '@ohos/hamock';
@Component
struct Person {
@Prop species: string;
// 在@MockSetup片段中,定义对象属性
@MockSetup
randomName() {
this.species = 'primates'
}
...
// 业务场景调用属性(如果从初始化到调用期间,该属性无变化)
const result = this.species // in previewer, result = primates
}
说明
- ArkUI部分类型属性不支持Mock,如readonly、@ObjectLink。
- 被@Link/@Consume/@Prop/@BuilderParam装饰器修饰的变量,ArkUI语法要求父容器需要有对应属性的定义,因此更推荐开发者通过定义⼀个预览场景父容器(并通过父容器传递合适的数据)来预览这⼀类的组件。
import router from '@ohos.router';
// 定义或导入 routerParam 的返回值类型
interface PageRouterParam {
name: string
}
// 定义 mock 实现
const MockRouter: Record<string, Object> = {
'getParams': () => {
return { name: 'Mocked' } as PageRouterParam;
},
// 复用原始实现
'pushUrl': router.pushUrl,
'replaceUrl': router.replaceUrl,
...
};
export default MockRouter;
说明
- 如果用户在定义Mock的实现时,未复用原始实现,则在预览运⾏时,当业务代码调用到未被Mock的接口方法时,实际将调用到undefined的对象。
- 目标模块与Mock实现代码是⼀对⼀的关系。对同⼀个模块,只⽀持有⼀份Mock实现代码。预览运行时所有页面import该模块都将指向为Mock实现代码。
{
"@ohos.router": { // 待替换的moduleName
"source": "src/mock/module/ohos/router.mock.ets" // mock代码的路径,相对于模块根目录
},
...
}
hilog.debug(DomainNumber, logTag, 'Mock %{public}s', router.getParams()['name']);
// import local module
import LibDefaultExport from '../../../main/ets/utils/CommonUtils'; // get origin default export
import { methodA, ObjectB } from '../../../main/ets/utils/CommonUtils'; // get origin export on demand
class DefaultExportMock extends LibDefaultExport {
// 定义mock实现
public static getName(): String {
return "Mocked Name";
}
};
export {
methodA,
ObjectB,
}
export default DefaultExportMock;
其中CommonUtils.ets文件示例如下:
export default class CommonUtils {
public static getName(): String {
return "origin name";
}
public static getTitle(): String {
return "origin title";
}
}
export const methodA = (): string => {
return "methodA"
}
export const ObjectB: Object = new Object();
说明
{
"utils/CommonUtils.ets": { // 本地module只支持ets/xxx的相对路径,并需明确文件后缀
"source": "src/mock/module/utils/CommonUtils.mock.ts"
},
...
}
hilog.debug(DomainNumber, logTag, 'Mock %{public}s', CommonUtils.getName());
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- pqdy.cn 版权所有 赣ICP备2024042791号-6
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务