5 页面&&组件迁移细节

5.1 template模板迁移

这里以cml的vue 语法为例:cml类vue基础语法

5.1.1 数据绑定、条件渲染、循环、事件绑定的迁移

假设,原有vue项目代码,如下:

  1. <div class="scroller-wrap">
  2. 数据绑定
  3. <div>{{}}</div>
  4. 条件渲染
  5. <div v-if="condition1">v-if</div>
  6. <div v-else-if="condition2">v-else-if</div>
  7. <div v-else>v-else</div>
  8. 循环
  9. <div v-for="(item ,index) in array"></div>
  10. 事件绑定
  11. <div id="tapTest" @click="handleClick">Click me!</div>
  12. </div>

那么,使用 cml的类vue语法后:整体基本上不用变,只需要将标签改成chameleon的内置标签即可参考

  1. <view class="scroller-wrap">
  2. 数据绑定
  3. <view>{{}}</view>
  4. 条件渲染
  5. <view v-if="condition">v-if</view>
  6. <view v-else-if="condition1">v-else-if</view>
  7. <view v-else>v-else</view>
  8. 循环
  9. <view v-for="(item ,index) in array"></view>
  10. 事件绑定
  11. <view id="tapTest" @click="handleClick">Click me!</view>
  12. </view>

5.1.2 chameleon对于语法的扩展支持

指令的扩展 c-show、c-model、c-show 参考
component is 动态组件的扩展 参考
事件绑定支持内联事件传参数 参考

5.1.3 weex的内置组件迁移

以下表格列出weex的内置组件迁移到cml项目中的对应情况,不能在视图层用 weex端特有的组件,需要通过以下标签进行替换

除非是通过多态组件调用的下层组件才可以使用。

chameleon提供的内置组件

chameleon提供的扩展组件

对于weex内置的组件,chameleon提供了大部分与之对应的可以跨端的组件,对应如下,具体使用方式请参考

weex内置组件cml备注
<div><view>支持跨多端
<text><text>支持跨多端
<image><image>支持跨多端
<list><list>支持跨多端
<cell><cell>支持跨多端
<loading><c-loading>支持跨多端
<scroller><scroller>支持跨多端
<slider><carousel>对于轮播图组件,chameleon内置了carousel组件,如果想要用原生的slider,需要在多态组件中通过 origin-slider使用
<textarea><textarea>支持跨多端
<input><input>支持跨多端
<video><video>支持跨多端

chameleon不支持的weex内置组件

weex内置组件在chameleon中的替换方式
<a>可以通过给一个 text标签绑定事件,通过 chameleon-api提供的接口打开页面
<waterfall>该组件不支持跨多端,仅可在多态组件中使用
<web>该组件不支持跨端,仅可在多态组件中使用
<richtext>该组件不支持跨端,仅可在多态组件中使用

根据以上教程,我们可以迁移HelloWorld.vuecomp.vue中的模板内容了

HelloWorld.cml

  1. <template lang='vue'>
  2. <view>
  3. <text>this is helloworld</text>
  4. <comp @parentClick="handleParentClick"></comp>
  5. </view>
  6. </template>

comp.cml

  1. <template lang='vue'>
  2. <view>
  3. <input type="text" v-model="todo" ></input>
  4. <div v-for="(item,index) in todos">
  5. {{item}}
  6. </div>
  7. <div @click="addTodo">addTodo</div>
  8. <view @click="handleClick"><text>触发父组件事件</text></view>
  9. </view>
  10. </template>

5.2 JS内容迁移

5.2.1 生命周期迁移 :和vue保持一致

5.2.2 数据的迁移 参考

5.2.3 weex项目API的迁移

API迁移包括 http请求 路由跳转 本地存储等参考:chameleon-api的文档

5.2.4 weex内置模块的迁移

不能在逻辑层用 weex端特有的内置模块,需要通过以下chameleon-api提供的进行替换

除非是通过多态组件调用的下层组件才可以直接使用。

weexcml备注
animationchameleon-api中的 createAnimation参考
cliboardchameleon-api中的 clipBoard参考
domchameleon-api中的 getRect参考
globalEvent暂不支持
metachameleon-api中的 getSystemInfo参考:可以通过这个API获取到视口的值然后给页面宽高赋值
modalchameleon-api中的showToast参考
navigatorchameleon-api中的 路由导航参考
picker扩展组件中的 c-picker参考
storagechameleon-api中的数据存储参考
streamchameleon-api中的网络请求参考
webview暂不支持
websocketschameleon-api中的websockets参考

5.2.5 事件的触发机制,映射如下:

vue项目cml
this.$emit(xxx,xxx)this.$cmlEmit(xxx,xxx)
事件对象参数
chameleon对web native wx各个端的事件对象进行了统一代理 参考;
对于灰度区组件(多态组件) 各个端的事件对象还是对应端的事件对象,chameleon框架不会对灰度区origin-开头的标签和第三方组件 标签上绑定的事件进行事件代理
cml支持的类vue语法 ,只有在文档中列出的语法才支持多端,其他没有列出的语法仅可以在web端使用,跨端没有支持,比如 v-htm class的对象语法 数组语法等
不支持的事件

longpress appear disappear 事件暂不支持

事件冒泡
chameleon生成的weex项目默认都是开启了支持事件冒泡的机制
同时扩展了阻止事件冒泡的语法;

vue语法(仅仅支持 .stop)

  1. <view @click.stop="handleClick"></view>

cml语法

  1. <view c-catch:click="handleClick"></view>

总结

1 由于chameleon是跨多端的框架,所以在weex端特有的环境变量,比如weex.config等在chameleon中是不支持的

2 对于weex的内置模块,比如animation等,在chameleon-api中基本上都有对应,参考上文weex内置模块的迁移

根据以上教程,我们可以迁移HelloWorld.vuecomp.vue中的js内容了

HelloWorld.cml

  1. <template lang='vue'>
  2. <view>
  3. <text>this is helloworld</text>
  4. <comp @parentClick="handleParentClick"></comp>
  5. </view>
  6. </template>
  7. <script>
  8. import lodash from 'lodash'
  9. class HelloWorld {
  10. methods = {
  11. handleParentClick(...args){
  12. console.log('parentClick',...args)
  13. }
  14. }
  15. }
  16. export default new HelloWorld();
  17. </script>

comp.cml

  1. <script>
  2. class Comp {
  3. data = {
  4. todo:'todo1',
  5. todos:[]
  6. }
  7. methods = {
  8. addTodo(){
  9. this.todos.push(this.todo)
  10. },
  11. handleClick(){
  12. this.$cmlEmit('parentClick',{
  13. value:1
  14. })
  15. }
  16. }
  17. }
  18. export default new Comp();
  19. </script>

5.3 style内容的迁移

weex样式官方文档

5.3.1 页面布局的迁移

使用 flexbox进行样式布局

关于样式的使用教程 参考

模板上的样式语法 参考

vue样式语法规范参考

5.3.2 样式单位的迁移

如果样式想要适配多端,需要将单位改成cpx;

根据以上教程,我们可以迁移HelloWorld.vuecomp.vue中的js内容了

HelloWorld.cml

  1. .demo-com {
  2. display: flex;
  3. flex-direction: column;
  4. align-items: center;
  5. height:400cpx;
  6. justify-content: center;
  7. }
  8. .title {
  9. align-self: center;
  10. color: #61c7fc;
  11. font-size: 72cpx;
  12. margin-bottom: 20cpx;
  13. }

以上,简单的介绍了weex项目迁移到chameleon的步骤,如果还有任何疑问,欢迎随时在chameleon官方微信和官方QQ群里进行反馈,我们将随时解答你的困惑,再次感谢你对chameleon的支持~

​ Best wishes

​ Chameleon 团队