文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

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

2024-12-03 11:59

关注

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

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

https://harmonyos.51cto.com/

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. "container"
  3.     "top"
  4.         "topItem"
  5.             {{t1}} 
  6.         
 
  •         "topItem"
  •             {{t2}} 
  •         
  •  
  •         "topItem"
  •             {{t3}} 
  •          
  •      
  • ... 
  •  
    1. export default { 
    2.     data: { 
    3.         t1: "吃饭"
    4.         t2: "睡觉"
    5.         t3: "打豆豆" 
    6.     } 

     

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

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

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

    1. "content"
    2.     "contentItem"
    3.         for="{{array}}"
    4.             "item"
    5.                 {{$idx}}: {{$item}} 
    6.              
    7.          
    8.      
    9.  
    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.     "tabBar"
    3.         for="{{ tabBar }}"
    4.             "cell" onclick="changeMenu($idx)"
    5.                 "image"
    6.                     "{{ barIdx == $idx ? $item.img2: $item.img1 }}"
    7.                  
    8.                 "text"
    9.                     "{{ barIdx == $idx ? 'a' : 'b' }}"
    10.                         {{ $item.text }} 
    11.                      
    12.                  
    13.              
    14.          
    15.      

    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.     "pager" index="0" class="pager" onchange="changePage" indicator="false"
    3.     --4个div作为4页--> 
    4.      

    1.  
    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/

     

    来源:鸿蒙社区内容投诉

    免责声明:

    ① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

    ② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

    软考中级精品资料免费领

    • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

      难度     813人已做
      查看
    • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

      难度     354人已做
      查看
    • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

      难度     318人已做
      查看
    • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

      难度     435人已做
      查看
    • 2024年上半年系统架构设计师考试综合知识真题

      难度     224人已做
      查看

    相关文章

    发现更多好内容

    猜你喜欢

    AI推送时光机
    位置:首页-资讯-后端开发
    咦!没有更多了?去看看其它编程学习网 内容吧
    首页课程
    资料下载
    问答资讯