组件

cml 项目一切皆组件。组件(Component)是视图的基本组成单元。

框架为开发者提供了一系列基础组件,开发者可以通过组合这些基础组件进行快速开发。

如:

  1. <template>
  2. <view>
  3. <view>view 基础组件</view>
  4. <text>text 基础组件</text>
  5. </view>
  6. </template>

同时,cml 支持简洁的组件化编程。

自定义组件

开发者可以将页面内的功能模块抽象成自定义组件,以便在不同的页面中重复使用。自定义组件在使用时与基础组件非常相似。

如何创建自定义组件

小程序创建自定义组件

代码示例:

  1. Component({
  2. properties: {
  3. // 这里定义了innerText属性,属性值可以在组件使用时指定
  4. innerText: {
  5. type: String,
  6. value: "default value"
  7. }
  8. },
  9. data: {
  10. // 这里是一些组件内部数据
  11. someData: {}
  12. },
  13. methods: {
  14. // 这里是一个自定义方法
  15. customMethod() {}
  16. }
  17. });
cml 创建自定义组件

示例代码

  1. <script>
  2. class MyComponent {
  3. props = {
  4. // 这里定义了innerText属性,属性值可以在组件使用时指定
  5. innerText: {
  6. type: String,
  7. value: "default value"
  8. }
  9. };
  10. data = {
  11. // 这里是一些组件内部数据
  12. someData: {}
  13. };
  14. methods = {
  15. // 这里是一个自定义方法
  16. customMethod() {}
  17. };
  18. computed = {};
  19. watch = {};
  20. }
  21. export default new MyComponent();
  22. </script>

如何使用自定义组件

使用已注册的自定义组件前,首先要进行引用声明。此时需要提供每个自定义组件的标签名和对应的自定义组件文件路径。

小程序使用自定义组件

代码示例:

page.json 中进行引用声明

  1. {
  2. "usingComponents": {
  3. "component-tag-name": "path/to/the/custom/component"
  4. }
  5. }

page.wxml 中使用

  1. <view>
  2. <!-- 以下是对一个自定义组件的引用 -->
  3. <component-tag-name inner-text="Some text"></component-tag-name>
  4. </view>
cml 使用自定义组件

代码示例:

page.cml<script cml-type='json' />进行引用声明

  1. <script cml-type="json">
  2. {
  3. "base": {
  4. "usingComponents": {
  5. "component-tag-name": "path/to/the/custom/component"
  6. }
  7. }
  8. }
  9. </script>

page.cml<template />使用

  1. <template>
  2. <view>
  3. <!-- 以下是对一个自定义组件的引用 -->
  4. <component-tag-name inner-text="Some text"></component-tag-name>
  5. </view>
  6. </template>

如何实现父子组件事件通信

事件系统是组件间通信的主要方式之一。自定义组件可以触发任意的事件,引用组件的页面可以监听这些事件。

小程序组件通信

代码示例:

  1. <!-- 页面 page.wxml -->
  2. <view>
  3. <my-component bindcustomevent="onMyEvent"></my-component>
  4. </view>
  1. // 页面 page.js
  2. Page({
  3. methods: {
  4. onMyEvent(e) {
  5. console.log(e.detail); // 自定义组件触发事件时提供的detail对象
  6. }
  7. }
  8. });
  1. <!-- 组件 my-component.wxml -->
  2. <view>
  3. <button bindtap="onTap">点击这个按钮将触发“myevent”事件</button>
  4. </view>
  1. // 组件 my-component.js
  2. Component({
  3. methods: {
  4. onTap() {
  5. this.triggerEvent("customevent", {}); // 触发 自定义组件事件
  6. }
  7. }
  8. });
cml 组件通信

代码示例:

  1. <!-- 页面 page.cml -->
  2. <template>
  3. <view>
  4. <my-component c-bind:customevent="onMyEvent"></my-component>
  5. </view>
  6. </template>
  7. <script>
  8. class Index {
  9. methods = {
  10. // 这里是一个自定义方法
  11. onMyEvent(e) {
  12. console.log(e.detail); // 自定义组件触发事件时提供的detail对象
  13. }
  14. };
  15. }
  16. export default new Index();
  17. </script>
  18. <script cml-type="json">
  19. {
  20. "base": {
  21. "usingComponents": {
  22. "my-component": "path/to/the/custom/component"
  23. }
  24. }
  25. }
  26. </script>
  1. <!-- 页面 path/to/the/custom/component.cml -->
  2. <template>
  3. <view>
  4. <button c-bind:tap="onTap">点击这个按钮将触发“myevent”事件</button>
  5. </view>
  6. </template>
  7. <script>
  8. class MyComponent {
  9. methods = {
  10. // 这里是一个自定义方法
  11. onTap() {
  12. this.$cmlEmit("customevent", {}); // 触发 自定义组件事件
  13. }
  14. };
  15. }
  16. export default new MyComponent();
  17. </script>
  18. <script cml-type="json">
  19. {
  20. }
  21. </script>

组件使用总结

和小程序一样,cml框架 提供了大量内置组件扩展组件,抹平多端差异,便于开发者通过组合这些组件,创建出强大的应用程序。

扩展组件需要额外引入。如:

  1. <script cml-type="json">
  2. {
  3. "base": {
  4. "usingComponents": {
  5. "c-dialog": "cml-ui/components/c-dialog/c-dialog"
  6. }
  7. }
  8. }
  9. </script>

在执行 cml build 构建打包时,cml 框架 会按需打包引用的内置组件和扩展组件,为代码瘦身。

内置组件扩展组件 都是支持跨多端的,对于一些没有提供的某个端的组件,可以通过组件多态来实现。

如果希望使用小程序端的原生组件,那么可以在原生标签前加上 origin-*cml框架会渲染原生组件参考

注意:origin-* 只能在灰度区文件中使用!!

如在 map.wx.cml 文件中使用原生地图组件 <map/>

  1. <!-- map.wx.cml -->
  2. <template>
  3. <origin-map
  4. id="map"
  5. longitude="113.324520"
  6. latitude="23.099994"
  7. controls="{{controls}}"
  8. bindcontroltap="controltap"
  9. style="width: 100%; height: 300px;"
  10. ></origin-map>
  11. </template>