O with occluded right edge to appear also as a C Web Widget 指南 文档 Toggle darkmode

深入: 管理数据

Web Widget 应用可以自己获取数据,也可以交给容器来获取数据——这完全取决于你的需要:

  • 对于小天气挂件这样的应用,通常由应用自己去获取天气数据
  • 如果应用由可视化编辑器进行可选项设置,那么需要统一的存储这些数据,这通常交给容器来管理数据
  • 如果想通过 SSR 方式渲染应用,数据要尽可能的提前准备好,这通常应该由容器来管理数据

Web Widget 应用程序就是普通的 JavaScript 代码,因此可以使用浏览器提供的诸如 fetch 或者 XMLHttpRequest 等方法来获取应用数据,而本文重点是描述如何通过容器管理应用数据。

通过容器获取数据

通过 datadata-* 属性可以为 Web Widget 应用传递静态的数据:

<web-widget
  src="app.widget.js"
  data-username="web-widget"
  data-email="web-widget@web-widget.js.org">
</web-widget>

Web Widget 应用可以通过生命周期函数获的 data 参数获取到数据。

// app.widget.js
export default () => ({
  async mount({ data }) {
    console.log(data);
  }
});

通过 data-* 只能传递 string 类型的值;使用 data 属性可以使用 JSON 字符串,它将自动解析成 object

手动更新应用的数据

当应用挂载成功后,后续如果想要更新数据,可以执行容器上的 update({ data }) 来触发应用同名的生命周期函数,以便应用自行处理更新后的数据。

<web-widget src="app.widget.js" data="{}"></web-widget>

<script type="module">
  import { HTMLWebWidgetElement } from '@web-widget/container';

  const webWidgetElement = document.querySelector('web-widget');
  webWidgetElement.mount().then(() => {
    webWidgetElement.update({
      data: {/*...*/}
    });
  });
</script>

应用内部自更新数据

应用也可以自己更新数据,通过 container.update({ data }) 更新数据,这样容器可以观察到数据的变化,进而启动一些数据处理的流程。

// app.widget.js
export default () => ({
  async mount({ data, container }) {
    // ...
    element.onclick = () => {
      container.update({ data });
    }

    container.appendChild(element);
  }
});

观察数据变化

document.querySelectorAll('web-widget').forEach(element => {
  element.addEventListener('update', function(event) {
    console.log(event.value);
  });
});