文档管理中心
FAQ应用框架开发Web框架Web开发(ArkWeb)Web组件频繁改变高度卡顿

Web组件频繁改变高度卡顿

问题现象

频繁调整Web组件的高度导致卡顿?

背景知识

onScaleChange:当前页面显示比例的变化时触发该回调。

解决方案

  • 由于高度更新过于频繁,触发了不必要的重渲染或布局计算。
  • 可以使用节流或防抖来限制更新频率,减少性能消耗。

ArkTS代码如下:

收起
自动换行
深色代码主题
复制
  1. import { webview } from '@kit.ArkWeb';
  2. @Component
  3. struct Demo {
  4. public controller: webview.WebviewController = new webview.WebviewController();
  5. changeEvent: (event: OnScaleChangeEvent) => void = () => {
  6. };
  7. build() {
  8. Web({
  9. src: $rawfile('webScaleChange.html'),
  10. controller: this.controller
  11. })
  12. .zoomAccess(true)
  13. .fileAccess(false)
  14. .geolocationAccess(false)
  15. .onScaleChange((event) => {
  16. this.changeEvent(event);
  17. })
  18. .horizontalScrollBarAccess(false)
  19. .verticalScrollBarAccess(false);
  20. }
  21. }
  22. class Util {
  23. // 防抖,在一段时间内函数被多次触发,防抖让函数在一段时间内只执行一次
  24. static debounce(fun: (height: number) => void, delay?: number) {
  25. let timer: number;
  26. return (height: number) => {
  27. clearTimeout(timer);
  28. timer = setTimeout(() => {
  29. fun(height);
  30. }, delay ? delay : 300);
  31. };
  32. }
  33. }
  34. @Entry
  35. @Component
  36. struct Index {
  37. @State webHeight: number = 600; // 当前显示高度
  38. constWebHeight: number = 600; // 基础计算高度
  39. originScale: number = 100; // 初始比例
  40. webController: webview.WebviewController = new webview.WebviewController();
  41. // 创建防抖函数实例(300ms延迟)
  42. debouncedSetHeight: (height: number) => void = Util.debounce((newHeight: number) => {
  43. this.webHeight = newHeight;
  44. console.info(`防抖后高度:${this.webHeight}`);
  45. }, 300);
  46. build() {
  47. Column() {
  48. Demo({
  49. controller: this.webController,
  50. changeEvent: (event: OnScaleChangeEvent) => {
  51. const targetHeight = this.constWebHeight * event.newScale / this.originScale;
  52. this.debouncedSetHeight(targetHeight); // 此处触发防抖函数,替换成this.webHeight = targetHeight则表示不采用防抖函数
  53. }
  54. });
  55. }
  56. .height(this.webHeight)
  57. .width('100%');
  58. }
  59. }

html代码如下:

收起
自动换行
深色代码主题
复制
  1. <!DOCTYPE html>
  2. <html lang="zh">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6. <title>复杂页面示例</title>
  7. <link rel="stylesheet" href="styles.css">
  8. </head>
  9. <body>
  10. <header>
  11. <nav>
  12. <ul>
  13. <li><a href="#home">首页</a></li>
  14. <li><a href="#news">新闻</a></li>
  15. <li><a href="#contact">联系我们</a></li>
  16. <li><a href="#about">关于我们</a></li>
  17. </ul>
  18. </nav>
  19. </header>
  20. <main>
  21. <section id="home">
  22. <h1>欢迎来到我们的网站</h1>
  23. <p>这是一个示例页面,展示了如何创建一个复杂的HTML页面。</p>
  24. </section>
  25. <section id="news">
  26. <h2>最新新闻</h2>
  27. <article>
  28. <h3>新闻标题</h3>
  29. <p>这里是新闻的详细内容。</p>
  30. </article>
  31. </section>
  32. <aside>
  33. <h2>侧边栏</h2>
  34. <p>这里是一些额外的信息或者广告。</p>
  35. </aside>
  36. </main>
  37. <footer>
  38. <p>© 2023 公司名称. 保留所有权利。</p>
  39. </footer>
  40. <script src="script.js"></script>
  41. </body>
  42. </html>
  43. <style>
  44. body {
  45. font-family: Arial, sans-serif;
  46. margin: 0;
  47. padding: 0;
  48. }
  49. header {
  50. background: #333;
  51. color: #fff;
  52. padding: 10px 0;
  53. }
  54. nav ul {
  55. list-style: none;
  56. padding: 0;
  57. }
  58. nav ul li {
  59. display: inline;
  60. margin-right: 10px;
  61. }
  62. nav ul li a {
  63. color: #fff;
  64. text-decoration: none;
  65. }
  66. main {
  67. display: flex; /* 使用Flexbox布局 */
  68. }
  69. section, aside {
  70. padding: 20px;
  71. }
  72. section#home {
  73. flex: 3; /* 主内容区域占据更多空间 */
  74. }
  75. aside {
  76. flex: 1; /* 侧边栏占据较少空间 */
  77. background: #f4f4f4;
  78. }
  79. footer {
  80. text-align: center;
  81. padding: 10px 0;
  82. background: #333;
  83. color: #fff;
  84. }
  85. </style>

可以通过双指捏动手机屏幕来实现页面的放大和缩小,对比观察是否采用防抖函数时的现象差。

说明

防抖函数设置的时延delay指的是改变Column组件高度webHeight的间隔时间。

常见FAQ

Q:使用Web组件页面时,在网页加载过程中,页面底部可能出现闪烁现象。

A:应用可以通过设置与网页背景色相同的Web组件的背景色,避免视觉闪烁。请参阅闪烁原因和优化方法了解详情。

在 FAQ 中进行搜索
请输入您想要搜索的关键词