从微信小程序到鸿蒙JS开发【02】-数据绑定&tabBar&swiper

开发
文章由鸿蒙社区产出,想要了解更多内容请前往:51CTO和华为官方战略合作共建的鸿蒙技术社区https://harmonyos.51cto.com/#zz

[[380592]]

想了解更多内容,请访问:

51CTO和华为官方合作共建的鸿蒙技术社区

https://harmonyos.51cto.com/#zz

1、鸿蒙的数据绑定

微信小程序的数据绑定是类似于Vue的,wxml文件用 {{ }} 和对应js文件中的data对象中的属性进行绑定。

  1. <view class="city"
  2.     {{ now.location.name }}市 
  3. </view

  1. data: { 
  2.     now: { 
  3.       location: { 
  4.         name"南京" 
  5.       }, 
  6.   } 

  

那么鸿蒙中是否也是这样绑定呢?尝试在hml文件的div标签中使用 {{ }} 绑定js文件中的属性值,但却什么都没有显示。

  1. <!--错误代码--> 
  2. <div class="container"
  3.     <div class="top"
  4.         <div class="topItem"
  5.             {{t1}} 
  6.         </div> 
  7.         <div class="topItem"
  8.             {{t2}} 
  9.         </div> 
  10.         <div class="topItem"
  11.             {{t3}} 
  12.         </div> 
  13.     </div> 
  14. ... 
  15. </div> 
  1. export default { 
  2.     data: { 
  3.         t1: "吃饭"
  4.         t2: "睡觉"
  5.         t3: "打豆豆" 
  6.     } 

 

其实是因为div标签中直接放文字是不会显示的,需要将文字放在标签中才会显示出来。将hml文件做些更改,可以看到数据已被绑定到页面中了。

  1. <div class="container"
  2.     <div class="top"
  3.         <div class="topItem"
  4.             <text> 
  5.                 {{t1}} 
  6.             </text> 
  7.         </div> 
  8.         <div class="topItem"
  9.             <text> 
  10.                 {{t2}} 
  11.             </text> 
  12.         </div> 
  13.         <div class="topItem"
  14.             <text> 
  15.                 {{t3}} 
  16.             </text> 
  17.         </div> 
  18.     </div> 
  19. ... 
  20. </div> 

在一个数组中循环取值的方式和微信小程序也是类似的,可用一个标签作为逻辑控制块,其属性有for和if。需注意循环的每一项索引为$idx,值为$item。需要使用'$'去引用,且没有类似于wx:for-item等属性去改变变量名。若要重命名,可写为for="{{ (index, value) in ... }}

  1. <div class="content"
  2.     <div class="contentItem"
  3.         <block for="{{array}}"
  4.             <div class="item"
  5.                 <text>{{$idx}}: {{$item}}</text> 
  6.             </div> 
  7.         </block> 
  8.     </div> 
  9. </div> 
  1. export default { 
  2.     data: { 
  3.         t1: "吃饭"
  4.         t2: "睡觉"
  5.         t3: "打豆豆"
  6.         array: [1, 3, 5, 7, 9, 2, 4, 6, 8] 
  7.     } 

2、自定义tabBar

在微信小程序中可以直接在app.json中定义一个tabBar。

  1. "tabBar": { 
  2.     "color""#333333"
  3.     "backgroundColor""#fdfdfd"
  4.     "selectedColor""#E20A0B"
  5.     "list": [ 
  6.       { 
  7.         "pagePath""pages/weather/weather"
  8.         "text""天气"
  9.         "iconPath""icon/weather.png"
  10.         "selectedIconPath""icon/weather1.png" 
  11.       }, 
  12.     ... 
  13.     ] 

 

鸿蒙没有这种在json中继承的配置项,但我们可以用flex布局自己写一个,甚至可以加上动画等更丰富的功能。考虑到每一个菜单项有选中和未选中两种状态,各需准备两张图片。将图片放在/entry/src/main/js/default/common文件夹中,并在js文件中定义菜单栏数据。此处需要注意虽然在目录结构上common文件夹和页面js文件存在父级目录的关系,但在js加载时common被认定为同一级目录,图片目录定义处需注意。

  1. export default { 
  2.     data: { 
  3.         tabBar: [ 
  4.             { 
  5.                 text: "天气"
  6.                 img1: "./common/icon/weather.png"
  7.                 img2: "./common/icon/weather1.png" 
  8.             }, 
  9.             { 
  10.                 text: "每日新闻"
  11.                 img1: "./common/icon/news.png"
  12.                 img2: "./common/icon/news1.png" 
  13.             }, 
  14.             { 
  15.                 text: "本地新闻"
  16.                 img1: "./common/icon/local.png"
  17.                 img2: "./common/icon/local1.png" 
  18.             }, 
  19.             { 
  20.                 text: "查询"
  21.                 img1: "./common/icon/search2.png"
  22.                 img2: "./common/icon/search1.png" 
  23.             } 
  24.         ], 
  25.         barIdx: 0, 
  26.     } 

 

页面设计上,采用position: fixed;将菜单栏固定在页面底部,并结合flex布局使页面美观。判断当前选中哪一项,则可以使用三元表达式。

  1. <!-- 底部菜单栏 --> 
  2.     <div class="tabBar"
  3.         <block for="{{ tabBar }}"
  4.             <div class="cell" onclick="changeMenu($idx)"
  5.                 <div class="image"
  6.                     <image src="{{ barIdx == $idx ? $item.img2: $item.img1 }}"></image> 
  7.                 </div> 
  8.                 <div class="text"
  9.                     <text class="{{ barIdx == $idx ? 'a' : 'b' }}"
  10.                         {{ $item.text }} 
  11.                     </text> 
  12.                 </div> 
  13.             </div> 
  14.         </block> 
  15.     </div> 

  1. /*底部菜单*/ 
  2. .tabBar { 
  3.     width: 100%; 
  4.     height: 170px; 
  5.     position: fixed; 
  6.     bottom: 0px; 
  7.     border-top: 1px solid #444444; 
  8.     display: flex; 
  9.     justify-content: space-around; 
  10.     align-items: center; 
  11.     background-color: #f5f5f5; 
  12. .cell { 
  13.     width: 20%; 
  14.     height: 160px; 
  15.     display: flex; 
  16.     flex-direction: column
  17. .image { 
  18.     width: 100%; 
  19.     height: 110px; 
  20.     display: flex; 
  21.     justify-content: center; 
  22.     align-items: center; 
  23. .image>image { 
  24.     width: 90px; 
  25.     height: 90px; 
  26. .a { 
  27.     color: #0074DD; 
  28. .b { 
  29.     color: #333333; 
  30. .text { 
  31.     width: 100%; 
  32.     height: 50px; 
  33.     display: flex; 
  34.     justify-content: center; 
  35.     align-items: center; 
  36. .text>text { 
  37.     font-size: 35px; 

div的点击事件处理属性为onclick,其不会像微信小程序一样自动传入一个事件对象,而需要我们自行定义传入的参数。如上的onclick="changeMenu($idx)"就是鸿蒙传入点击事件的方法。这个函数只需要改变barIdx的值便可以实现点击切换tabBar对应项的颜色和图片,达到“四两拨千斤”的效果。

  1. changeMenu(idx) { 
  2.         this.barIdx = idx; 

 这里又出现了和微信小程序的不同处,微信小程序改变data中的值需要使用wx.setData()函数进行设置,而鸿蒙中直接使用this.key = value即可。

点一下其他菜单项:

 

3、结合swiper进行翻页

tabBar完成了,但这个菜单栏是写在一个页面中的,要怎样进行翻页呢?有一个在一个js页面中实现“翻页”的方式,就是结合swiper。和微信小程序中的swiper组件一样,它是一个可滑动的组件,多用于轮播图、滚动通知等。

鸿蒙的swiper需要定义一个页面唯一的id属性,用于点击事件联动页面滑动。index属性为当前的索引值。

  1. <!-- 划页swiper --> 
  2.     <swiper id="pager" index="0" class="pager" onchange="changePage" indicator="false"
  3.     <!--4个div作为4页--> 
  4.     </swiper> 

  1. /*划页swiper*/ 
  2. .pager { 
  3.     width: 100%; 
  4.     height: 100%; 
  5. .pager>div { 
  6.     display: flex; 
  7.     flex-direction: column

 现需要实现两个功能,滑动swiper实现tabBar联动样式变化,以及点击tabBar中的项联动swiper页面滑动。更改changeMenu方法:

  1. changeMenu(idx) { 
  2.     this.barIdx = idx; 
  3.     this.$element("pager").swipeTo({ 
  4.         index: idx 
  5.     }); 

 鸿蒙通过this.$element(id)找到页面中对应id的组件,如为swiper组件则可使用swipeTo()方法实现滑动,其index属性则为滑动到的页面索引值(0开始)。

changePage方法,只需要改变barIdx的值即可。通过swiper的onchange属性绑定方法名,滑动到的index的值会作为event.index被传入。

  1. changePage(event) { 
  2.     this.barIdx = event.index

 大功告成。

©著作权归作者和HarmonyOS技术社区共同所有,如需转载,请注明出处,否则将追究法律责任。

想了解更多内容,请访问:

51CTO和华为官方合作共建的鸿蒙技术社区

https://harmonyos.51cto.com/#zz

 

责任编辑:jianghua 来源: 鸿蒙社区
相关推荐

2021-02-21 11:09:18

鸿蒙HarmonyOS应用开发

2021-02-23 12:25:26

鸿蒙HarmonyOS应用开发

2021-03-02 09:29:29

鸿蒙HarmonyOS应用开发

2021-02-20 09:52:02

鸿蒙HarmonyOS应用开发

2021-02-23 12:23:57

鸿蒙HarmonyOS应用开发

2021-02-22 14:56:55

鸿蒙HarmonyOS应用开发

2021-02-25 10:01:19

鸿蒙HarmonyOS应用开发

2021-02-04 13:49:41

鸿蒙HarmonyOS应用开发

2021-02-23 09:52:42

鸿蒙HarmonyOS应用开发

2021-02-07 09:17:24

鸿蒙HarmonyOS应用开发

2021-02-25 15:13:08

鸿蒙HarmonyOS应用开发

2021-02-24 09:36:03

鸿蒙CSS应用开发

2016-11-04 10:48:37

信小程序

2017-05-08 15:03:07

微信小程序开发实战

2016-11-04 10:49:48

微信小程序

2016-09-27 16:38:24

JavaScript微信Web

2016-09-28 18:10:59

微信程序MINA

2016-09-27 20:36:23

微信HttpWeb

2016-11-04 10:30:17

微信小程序

2018-09-11 10:32:07

云开发小程序开发者
点赞
收藏

51CTO技术栈公众号