Написали кросс-мультитерминальный проект за 5 минут

внешний интерфейс Chameleon

cml(Хамелеон) Как платформа, которая действительно позволяет набору кодов запускать несколько терминалов, она предоставляет стандартную модель MVVM и разрабатывает различные терминалы унифицированным образом.

В то же время она имеет независимую运行时框架(runtime),数据管理(store),组件库(ui),接口(api).

также,cmlна перекрестке能力加强,能力统一,表现一致В этом отношении проделана большая работа.

Сегодня, чтобы элегантно обновить свои проекты, быстро получить доступ и принести вам богатыйруководство по миграции cml~


Отправить 5-минутный видеоурок


Адрес источника:GitHub.com/ Просто Алон есть/ Цай Мин-лян…

Структура каталогов

Как мини-программы WeChat,cmlсодержит описание всей программыappи несколько описаний соответствующих страницpage.

Структура каталога мини-программы

.
├── components // 包含各个组件
├── pages // 包含各个页面
├── app.js // 包含各个组件
├── app.js  // 应用启动入口
├── app.json // 全局配置
├── app.wxss // 全局样式
└── project.config.json // 项目配置文件

структура каталогов cml

.
├── dist // 各个端构建结果
│   ├── alipay 
│   ├── baidu 
│   ├── wx 
│   ├── web  
│   ├── weex 
│   └── config.json // 跨端配置map映射表
├── node_modules // 第三方库
├── mock // 模拟 接口数据 和 模板数据
├── src  // 源代码开发目录
│   ├── app // 应用启动入口
│   ├── assets // 静态资源
│   ├── components // 包含组件
│   ├── pages  // 包含页面
│   ├── store //数据管理
│   └── router.config.json // 路由配置文件
├── chameleon.config.js // 项目配置文件
└── package.json // npm包配置文件

Как изменить конфигурацию

В малом программном проекте он делится на:

апплет - конфигурация проекта

Может использоваться в корневом каталоге проектаproject.config.jsonфайл для настройки проекта.

Пример конфигурации:

{
  "miniprogramRoot": "./src",
  "debugOptions": {}
}

апплет - глобальная конфигурация

в корневом каталоге апплетаapp.jsonФайл используется для глобальной настройки апплета WeChat, определения пути к файлу подкачки, производительности окна, установки времени ожидания сети, установки нескольких вкладок и т. д.

Пример конфигурации:

{
  "pages": ["pages/index/index", "pages/logs/index"],
  "window": {
    "navigationBarTitleText": "Demo"
  },
  "networkTimeout": {
    "request": 10000,
    "downloadFile": 10000
  }
}

Мини-программа - Конфигурация страницы

Каждая страница апплета также может использовать.jsonфайл для настройки поведения окна этой страницы.

Конфигурация страницы может быть установлена ​​толькоapp.jsonсредняя частьwindowСодержимое элемента конфигурации, элемент конфигурации на странице будет перезаписан.app.jsonизwindowте же элементы конфигурации в .

Пример конфигурации:

{
  "navigationBarBackgroundColor": "#ffffff",
  "navigationBarTextStyle": "black",
  "navigationBarTitleText": "微信接口功能演示",
  "backgroundColor": "#eeeeee",
  "backgroundTextStyle": "light"
}

Точно так же вcmlВ проекте он разделен на:

cml - конфигурация проекта

chameleon.config.jsДля конфигурационного файла проекта можно настроить сборку, например, приводить ли хэш, сжимать ли и т.д.

Пример конфигурации:

// 设置静态资源的线上路径
const publicPath = '//www.static.chameleon.com/static';
// 设置api请求前缀
const apiPrefix = 'https://api.chameleon.com';
// 合并配置
cml.config.merge({
  wx: {
    build: {apiPrefix}
  },
  alipay: {
    build: {apiPrefix}
  },
  baidu: {
    build: {apiPrefix}
  },
  web: {
    dev: {
      hot: true,
      console: true
    },
    build: {
      publicPath: `${publicPath}/web`,
      apiPrefix
    }
  },
  weex: {
    build: {
      publicPath: `${publicPath}/weex`,
      apiPrefix
    }
  }
})

cml — глобальная конфигурация

cmlпроектappв каталогеapp.cmlдокумент<script cml-type="json" />использовал кcmlПриложение выполняет глобальную настройку с возможностью кросс-конечной настройки и дифференциации.

Пример конфигурации:

<script cml-type="json">
{
  "base": {
    "window": {
      "navigationBarTitleText": "各个端共同title",
    },
    "permission": {
      "scope.userLocation": {
        "desc": "你的位置信息将用于小程序位置接口的效果展示"
      }
    }
  },
  "wx": {
    "window": {
      "backgroundTextStyle":"light",
      "navigationBarBackgroundColor": "#fff",
      "navigationBarTitleText": "差异化 title",
      "navigationBarTextStyle":"black"
    }
  },
  "baidu": {
    "window": {
      "backgroundTextStyle": "light"
    }
  },
  "alipay": {
      "window": {
        "defaultTitle": "Chameleon"
      }
  }
}
</script>

cml - конфигурация страницы/компонента

пройти черезusingComponentsнастроить组件路径Зарегистрируйте указанный компонент.

Пример конфигурации:

<script cml-type="json">
{
  "base": {
    "usingComponents": {
      "navi": "/components/navi/navi",
      "navi-npm": "cml-test-ui/navi/navi"
    }
  },
  "wx": {
  },
  "alipay": {
  },
  "baidu": {
  },
  "web": {
  },
  "weex": {
  }
}
</script>

Как использовать возможности маршрутизации

Маршрутизация конфигурации мини-программы

app.jsonсписок элементов конфигурацииpagesПоле используется для указания, из каких страниц состоит апплет, и каждый элемент соответствует странице.路径+文件名Информация.

Первый элемент массива представляет начальную страницу (домашнюю страницу) апплета. Добавить/уменьшить страницы, нужноpagesМассив изменен.

Если проект имеетpages/index/index.wxml,pages/logs/logs.wxmlДве страницы, вам нужноapp.jsonкитайский язык

{
  "pages": ["pages/index/index", "pages/logs/logs"]
}

Cml настроить маршрутизацию

src/router.config.jsonфайл конфигурации маршрутизации,cmlВстроен набор унифицированных методов управления маршрутизацией для каждого конца. соответственноcmlОтображение конфигурации маршрутизации выглядит следующим образом:

{
  "mode": "history",
  "domain": "https://www.chameleon.com",
  "routes":[
    {
      "url": "/cml/h5/index",
      "path": "/pages/index/index",
      "mock": "index.php"
    },
    {
      "url": "/cml/h5/logs",
      "path": "pages/logs/logs",
      "mock": "logs.php"
    }
  ]
}

В имени файла не нужно писать суффикс файла,cmlФреймворк будет автоматически искать местоположение.cmlфайл для обработки.

Мини-программы используют маршрутизацию

cml использовать маршрутизацию

В соответствии с URI универсального индекса ресурсов адаптивно открывайте один и тот же маршрут PATH в разных средах:

  • Откройте новую страницу: вызовите chameleon-apicml.navigateTo
  • Перенаправление страницы: вызовите chameleon-apicml.redirectTo
  • Возврат страницы: вызов chameleon-apicml.navigateBack
  • Откройте другое перекрестное приложение: вызовите chameleon-api.cml.open
  • Вернитесь к предыдущему кросс-энд-приложению: вызовите chameleon-apicml.close

Как зарегистрироваться

Как зарегистрироваться в программе

Процедура регистрации мини-программы

В проекте апплетаApp()Функция используется для регистрации апплета. принять одинObjectПараметры, определяющие обратный вызов жизненного цикла апплета и т. д.

образец кода

App({
  onLaunch(options) {
    // Do something initial when launch.
  },
  globalData: 'I am global data'
})

программа регистрации cml

образец кода

<script>
import store from '../store/index.js'
import routerConfig from '../router.config.json';

class App {
  data = {
    store,
    routerConfig
  }
  created(res) {
  }
}

export default new App();
</script>

Осторожно вы найдете,

в апплетеapp.json app.js app.wxssиsrc/app/app.cmlСоответствующее соотношение выглядит следующим образом

апплет app.js cml проект src/app/app.cml
app.js <script></script>
app.wxss <style></style>
app.json <script cml-type="json"></script>

Как зарегистрировать страницу

Мини-страница регистрации программы

В проекте апплетаPage(Object)Функция используется для регистрации страницы. принять одинObjectТиповые параметры, которые определяют исходные данные страницы, обратные вызовы жизненного цикла, обработчики событий и т. д.

Образец кода:

// index.js
Page({
  data: {
    text: 'This is page data.'
  },
  changeText: function(e) {
    // sent data change to view
    this.setData({
      text: 'CML'
    })
  }
})

cml-страница регистрации

образец кода

<script>
class Index {
  data = {
    text: 'Chameleon'
  }
  methods = {
    changeText: function(e) {
      // sent data change to view
      this.text = 'CML';
    }
  }
  computed = {}
  watch = {}
};
export default new Index();
</script>

Как зарегистрировать компоненты

Компонент регистрации мини-программы

В проекте апплетаComponent(Object)Конструкторы можно использовать для определения компонентов, вызываяComponentКонструктор может указывать свойства, данные, методы и т. д. компонента.

образец кода

Component({
  properties: {
    myProperty: { // 属性名
      type: String, // 类型(必填)
      value: '' // 属性初始值(可选)
    },
    myProperty2: String // 简化的定义方式
  },
  data: {
    text: ''
  }, // 私有数据,可用于模板渲染

  // 生命周期函数,可以为函数,或一个在methods段中定义的方法名
  attached() { }, 
  ready() { },
  methods: {
    onMyButtonTap() {
      this.setData({
        // 更新属性和数据的方法与更新页面数据的方法类似
        text: 'wx'
      })
    }
  }
})

компонент реестра cml

образец кода

<script>
class MyComponent {
  props = {
    myProperty: { // 属性名
      type: String, // 类型(必填)
      default: '' // 属性初始值(可选)
    },
    myProperty2: String // 简化的定义方式
  }
  data =  {
    text: ''
  } // 私有数据,可用于模板渲染

  beforeMount() {}
  mounted() {}
  methods = {
    onMyButtonTap() {
      this.text = 'cml'
    }
  }
  computed = {}
  watch = {}
};
export default new MyComponent();
</script>

Как объявить жизненный цикл

Унификация определения жизненного цикла приложения на каждом конце является важным компонентом кросс-энд фреймворка, а также единственным способом миграции.

жизненный цикл объявления апплета

допустимыйApp(Object),Page(Object),Component(Object)входящийObjectпараметр, который указывает обратный вызов жизненного цикла апплета и т. д.

пример кода

// index.js
Page({
  onLoad(options) {
    // Do some initialize when page load.
  },
  onReady() {
    // Do something when page ready.
  },
  onShow() {
    // Do something when page show.
  },
  onHide() {
    // Do something when page hide.
  },
  onUnload() {
    // Do something when page close.
  },
  onShareAppMessage() {
    // return custom share data when user share.
  }
})

Жизненный цикл объявления cml

существует.cmlдокумент<script />Экземпляр объекта, возвращаемый блоком кода, определяющим обратный вызов жизненного цикла.

образец кода

<script>
class Index {
  beforeCreate(query) {
    // data数据挂载到this根节点上之前,以及methods所有方法挂载到实例根节点之前
    // 注意:只用页面的 beforeCreate钩子 会返回页面query
    console.log('App beforeCreate: 打开当前页面路径中的参数是 ', query)
  }
  created() {
    // data,methods里面的这些events挂载完成
    console.log('App created')
  }
  beforeMount() {
    // 开始挂载已经编译完成的cml到对应的节点时
    console.log('App beforeMount')
  }
  mounted() {
    // cml模板编译完成,且渲染到dom中完成,在整个生命周期中只执行一次
    console.log('App mounted')
  }
  beforeDestroy() {
    // 实例销毁前
    console.log('App beforeDestroy')
  }
  destroyed() {
    // 实例销毁后
    console.log('App destroyed')
  }
};
export default new Index();
</script>

Картирование жизненного цикла приложения

Апплетыapp.jsЖизненный цикл в -> cmlsrc/app/app.cml

Апплеты chameleon
onLaunch beforeCreate
onShow mounted
onHide destroyed

Отображение жизненного цикла страницы

АпплетыPage()Жизненный цикл в -> cmlsrc/pages/mypage/mypage.cml

Апплеты chameleon
onLoad beforeCreate
onShow mounted
onUnload destroyed
onReady Полиморфизм жизненного цикла
onHide Полиморфизм жизненного цикла
onShareAppMessage Полиморфизм жизненного цикла

Отображение жизненного цикла компонентов

АпплетыComponent()Жизненный цикл в -> cmlsrc/components/mycomponent/mycomponent.cml

Апплеты chameleon
created created
attached beforeMount
ready mounted
detached destroyed

Сводка жизненного цикла

каждыйcmlпример (App,Page,Component) пройти ряд процессов инициализации при его создании ——

Например, вам нужно настроить мониторинг данных, скомпилировать шаблоны и смонтировать экземпляры вCML节点и обновлять при изменении данныхCML节点Ждать. В то же время во время этого процесса также запускаются некоторые функции, называемые хуками жизненного цикла, что дает разработчикам возможность добавлять собственный код на разных этапах.

cmlзаApp,页面Page,组件ComponentПредоставляет ряд событий жизненного цикла для обеспечения упорядоченного выполнения приложений.

Кроме того, если вы хотите использовать определенный конечный жизненный цикл, вы можете использовать его с точки зрения бизнеса.Полиморфизм жизненного цикла.

Как данные реагируют на представления

Сегодня двусторонняя привязка данных и односторонний поток данных проникли в повседневную жизнь разработчиков, а режим разработки MVMM является стандартной структурой.

привязка данных,условный рендеринг,Рендеринг спискаКак это написано?

образец кода

Апплет отвечает данными

<!--wxml-->
<view class="scroller-wrap">
    <!--数据绑定-->
  <view>{{message}}</view>
  <!--条件渲染-->
  <view wx:if="{{view == 'WEBVIEW'}}">WEBVIEW</view>
  <view wx:elif="{{view == 'APP'}}">APP</view>
  <view wx:else="{{view == 'MINA'}}">MINA</view>
    <!--列表渲染-->
  <view wx:for="{{array}}" wx:for-index="index" wx:for-item="item">{{item}}</view>
</view>
// page.js
Page({
  data: {
    message: 'Hello MINA!',
    view: 'MINA',
    array: [1, 2, 3, 4, 5]
  },
  onLoad() {
    this.setData({
      message: 'wx'
    })
  }
})

cml отвечает данными

<template>
<!--index.cml-->
<view class="scroller-wrap">
    <!--数据绑定-->
  <view>{{message}}</view>
  <!--条件渲染-->
  <view c-if="{{view == 'WEBVIEW'}}">WEBVIEW</view>
  <view c-else-if="{{view == 'APP'}}">APP</view>
  <view c-else="{{view == 'MINA'}}">MINA</view>
    <!--列表渲染-->
  <view c-for="{{array}}" c-for-index="index" c-for-item="item">{{item}}</view>
</view>
</template>
<script>
class Index {
  data =  {
    message: 'Hello MINA!',
    view: 'MINA',
    array: [1, 2, 3, 4, 5]
  }

  beforeCreate () {
    this.message = 'cml'
  }
};
export default new Index();
</script>

Сводка ответов данных

cmlСреда выполнения предоставляет кросс-конечную реагирующую систему привязки данных (привязка данных).При изменении данных необходимо изменить только данные на логическом уровне, и слой представления будет обновлен соответствующим образом.

просто нужноview<-->modelИнтерактивная часть логики с простой миграцией может превратить ее в кросс-многотерминальную систему ответа на данные.

событие взаимодействия

cmlподдерживать некоторые основныесобытие, чтобы обеспечить эффект каждого конца (类型,绑定,事件对象) работает стабильно.

образец кода

событие использования апплета

<!--wxml-->
<view id="tapTest" data-hi="WeChat" bindtap="tapName">Click me!</view>
// page.js
Page({
  tapName(event) {
    console.log(event)
  }
})

событие использования cml

<template>
  <view id="tapTest" data-hi="WeChat" c-bind:tap="tapName">
    <text>Click me!</text>
  </view>
</template>
<script>
class Index {
  methods = {
    tapName(e) {
      // 打印事件对象
      console.log('事件对象:', e);
    }
  }
}
export default new Index();
</script>

Сводка по использованию события

В то же время он также поддерживаетпользовательское событие, для связи между родительским и дочерним компонентами.

Кроме того, если вы хотите использовать стороннее событие,cmlЭто не ограничит вашу бесплатную игру, вы можете использовать ее в коммерческих целях.полиморфизм компонентовилиполиморфизм интерфейсаДифференцированные функции реализации.

компоновка и внешний вид

Описание каждого конца布局和外观изКаскадные таблицы стилей (CSS)Реализации различаются, включая, помимо прочего,布局,盒模型,定位,文本.

так,cmlрама встроеннаяБазовый стиль кросс-конечной согласованностиспособность.

И определяет спецификацию стиля, используемую для описания страницы.CMSS(Chameleon Style Sheet).

Как импортировать внешние стили

использовать@importоператор может импортировать внешние таблицы стилей,@importДалее следует относительный путь к внешней таблице стилей, которую необходимо импортировать, с;Указывает конец оператора.

Мини-программа импортирует внешние стили

Образец кода:

/** common.wxss **/
.small-p {
  padding:5px;
}
/** app.wxss **/
@import "common.wxss";
.middle-p {
  padding:15px;
}

cml импортировать внешние стили

Подробная документация

Образец кода:

/** common.css **/
.small-p {
  padding: 5px;
}
<!-- app.cml -->
<style>
  @import './common.css';
  .middle-p {
    padding:15 cpx;
  }
</style>

Сводка по использованию стиля

В то же время, чтобы унифицировать единицы размера для нескольких терминалов, эффект рендеринга согласован, а страница имеет адаптивный макет.cmlЕдиное внедрение проектаcpxВ качестве единицы размера предусмотрено, что в качестве стандарта используется экран 750px (полноэкранный) визуальный рисунок.

Более того, способность каждой боковой таблицы стилей иметьне совсем, является одной из основных позиций для миграции проекта.

Кроме того, если вы хотите использовать стили, специфичные для сторон,cmlЭто не ограничит вашу бесплатную игру, вы можете использовать ее в коммерческих целях.полиморфизм стиля

Примечание. Поскольку приложение-хамелеон является многотерминальнымweb native 小程序рамка, при необходимости поперекnative, необходимо использоватьflexboxСделай макет стиля! ! !

компоненты

cmlВсе в проекте является компонентом. Компонент является базовой единицей представления.

Фреймворк предоставляет разработчикам наборосновные компоненты, разработчики могут комбинировать этиосновные компонентыЗаймитесь быстрым развитием.

как:

<template>
  <view>
    <view>view 基础组件</view>
    <text>text 基础组件</text>
  </view>
</template>

в то же время,cmlПоддержка краткого программирования компонентов.

пользовательский компонент

Разработчики могут абстрагировать функциональные модули на страницах в настраиваемые компоненты для повторного использования на разных страницах. Пользовательские компоненты очень похожи на базовые компоненты при использовании.

Как создавать пользовательские компоненты

Апплеты создают пользовательские компоненты

Пример кода:

Component({
  properties: {
    // 这里定义了innerText属性,属性值可以在组件使用时指定
    innerText: {
      type: String,
      value: 'default value',
    }
  },
  data: {
    // 这里是一些组件内部数据
    someData: {}
  },
  methods: {
    // 这里是一个自定义方法
    customMethod() {}
  }
})
cml создать пользовательский компонент

образец кода

<script>
class MyComponent {
  props = {
    // 这里定义了innerText属性,属性值可以在组件使用时指定
    innerText: {
      type: String,
      value: 'default value',
    }
  }
  data = {
    // 这里是一些组件内部数据
    someData: {}
  }
  methods = {
    // 这里是一个自定义方法
    customMethod() {}
  }
  computed = {}
  watch = {}
};
export default new MyComponent();
</script>

Как использовать пользовательские компоненты

Прежде чем использовать зарегистрированный пользовательский компонент, сначала сделайте объявление ссылки. На этом этапе вам необходимо указать имя тега каждого пользовательского компонента и соответствующий путь к файлу пользовательского компонента.

Апплеты используют пользовательские компоненты

Пример кода:

существуетpage.jsonсделать справочное заявление в

{
  "usingComponents": {
    "component-tag-name": "path/to/the/custom/component"
  }
}

существуетpage.wxmlиспользуется в

<view>
  <!-- 以下是对一个自定义组件的引用 -->
  <component-tag-name inner-text="Some text"></component-tag-name>
</view>
cml с использованием пользовательских компонентов

Пример кода:

существуетpage.cmlсередина<script cml-type='json' />сделать справочное заявление

<script cml-type="json">
{
  "base": {
      "usingComponents": {
        "component-tag-name": "path/to/the/custom/component"
      }
  }
}
</script>

существуетpage.cmlсередина<template />использовать

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

Как реализовать связь событий между родительским и дочерним компонентами

Система событий является одним из основных средств связи между компонентами. Пользовательские компоненты могут запускать произвольныесобытие, страница, ссылающаяся на компонент, может прослушивать эти события.

связь компонента апплета

Пример кода:

<!-- 页面 page.wxml -->
<view>
  <my-component bindcustomevent="onMyEvent"></my-component>
</view>
// 页面 page.js
Page({
  methods: {
    onMyEvent(e) {
      console.log(e.detail) // 自定义组件触发事件时提供的detail对象
    }
  }
})
<!-- 组件 my-component.wxml -->
<view>
  <button bindtap="onTap">点击这个按钮将触发“myevent”事件</button>
</view>
// 组件 my-component.js
Component({
  methods: {
    onTap() {
      this.triggerEvent('customevent', {}) // 触发 自定义组件事件
    }
  }
})
Связь компонента cml

Пример кода:

<!-- 页面 page.cml -->
<template>
  <view>
    <my-component c-bind:customevent="onMyEvent"></my-component>
  </view>
</template>
<script>
class Index {
  methods = {
    // 这里是一个自定义方法
    onMyEvent(e) {
      console.log(e.detail) // 自定义组件触发事件时提供的detail对象
    }
  }
};
export default new Index();
</script>
<script cml-type="json">
{
  "base": {
      "usingComponents": {
        "my-component": "path/to/the/custom/component"
      }
  }
}
</script>
<!-- 页面 path/to/the/custom/component.cml -->
<template>
  <view>
    <button c-bind:tap="onTap">点击这个按钮将触发“myevent”事件</button>
  </view>
</template>
<script>
class MyComponent {
  methods = {
    // 这里是一个自定义方法
    onTap() {
      this.$cmlEmit('customevent', {}) // 触发 自定义组件事件
    }
  }
};
export default new MyComponent();
</script>
<script cml-type="json">
{}
</script>

Сводка по использованию компонентов

Как апплет,cml框架обеспечивает многоВстроенные компонентыиКомпоненты расширения, сглаживая различия между несколькими терминалами, чтобы разработчики могли создавать мощные приложения, комбинируя эти компоненты.

Компоненты расширения необходимо вводить дополнительно. как:

<script cml-type="json">
{
  "base": {
      "usingComponents": {
        "c-dialog": "cml-ui/components/c-dialog/c-dialog"
      }
  }
}
</script>

в исполненииcml buildПри сборке пакетаcml 框架Упомянутые встроенные компоненты и компоненты расширения будут упакованы по запросу, чтобы уменьшить размер кода.

Встроенные компонентыиКомпоненты расширенияВсе они поддерживают кросс-мультитерминал.Для некоторых компонентов, которые не предусмотрены на определенном терминале, можно передатьполиморфизм компонентовреализовать.

Если вы хотите использовать нативные компоненты на стороне апплета, вы можете добавить нативную метку передorigin-*,cmlФреймворк будет отображать нативные компонентыСсылаться на

Уведомление:origin-*только вфайл в градациях серогов использовании! !

как вmap.wx.cmlИспользуйте собственный компонент карты в файле<map/>:

<!-- map.wx.cml -->
<template>
  <origin-map
    id="map"
    longitude="113.324520"
    latitude="23.099994"
    controls="{{controls}}"
    bindcontroltap="controltap"
    style="width: 100%; height: 300px;"
  ></origin-map>
</template>

Как вызвать возможности интерфейса платформы

В апплете вы можете использовать родной WeChatAPI, такие как получение информации о пользователе, локальное хранилище, платежные функции и т. д.

образец кода

try {
  wx.setStorageSync('name', 'Hanks')
} catch (e) {
  console.error(e)
}

Точно так же в проекте cml это можно вызвать так:

образец кода

import cml from 'chameleon-api'
cml.setStorage('name', 'Hanks').then((res)=>{
  console.log(res)
},function(e){
  console.error(e)
})

Сводка по использованию интерфейса

cmlПлатформа предоставляет множество полиморфных интерфейсов, которые могут вызывать собственные возможности, предоставляемые каждым концом, такие как системная информация, информация об узлах элементов, эффекты анимации, локальное хранилище, сетевые запросы, географические местоположения и т. д. Пожалуйста, обратитесь кAPIдокументация.

chameleon-apiВсе предоставленные интерфейсы поддерживаются на нескольких терминалах.Для некоторых собственных интерфейсов определенного терминала, которые не предоставляются, вы можете передатьполиморфизм интерфейсазвонить.

Перенести экземпляр

нижеприведенный各端(vue、weex、小程序)迁移cml指南а такжеcml 导出组件到各端指南Конкретная документация по миграции для: