HarmonyOS鸿蒙Next应用开发踩坑记之路由跳转

HarmonyOS鸿蒙Next应用开发踩坑记之路由跳转 本来打算先搞地图方面的开发,但是遇到一些问题,已经在官方论坛发帖求助了:关于JS UI开发的一些问题

大家如果对鸿蒙应用开发有兴趣,也去帮我催催官方吧。这两天Mac OS发布了最新的版本,鸿蒙的开发工具也发布了mac版本,这两件事稍许冲淡了我在鸿蒙应用开发中遇到的不快。今天就来继续做一下路由跳转。

这个功能就在之前的项目基础上做,请参考我之前的文章:鸿蒙系统应用开发之JS实现一个简单的List

要做路由,首先要在config.json中加上page:

{
  "js": [
    {
      "pages": [
        "pages/index/index",
        "pages/music/index" //新增的页面
      ],
      "name": "default",
      "window": {
        "designWidth": 720,
        "autoDesignWidth": false
      }
    }
  ]
}

js是在config的module中,js UI项目生成的时候会已经有了。接下来就在js/page文件夹下增加这个music文件夹,需要新建的文件和index下一致。

然后我们就开始改造之前的index部分。

这个时候出现了问题,我要怎么把频道id传给这个函数呢?翻了下文档,我发现官方并没有明确说明箭头函数或者bind方法能不能用。那我就姑且当作可以吧。尝试之后,两个都不行……

这个onclick里面只能放函数名……

好吧,于是我修改了一下:

<text class="item" onclick="goto" id="{{$item.channel_id}}">{{$item.name}}</text>

然后在index.js里面增加goto方法:

goto(e){
  router.push({
    uri:'pages/music/index',
    params:{
      channelId: e.target.attr.id
    }
  })
},

这个事件响应总是要传一个event对象的,从event对象上拿到target,就可以拿到这个id了。哦,别忘记在index.js引入router:

import router from '@system.router';

然后用push方法跳转到相应的页面,可以把参数带过去,params下的channelId会直接放在music/index的data里面。

import fetch from '@system.fetch';
export default {
  data: {
    title: "",
    data:{
      items:[]
    },
  },
  onInit() {
    let me = this;
    fetch.fetch({
      url:"https://douban.fm/j/v2/playlist?channel="+this.channelId+"&amp;kbps=192&amp;client=s%3Amainsite%7Cy%3A3.0&amp;app_name=radio_website&amp;version=100&amp;type=n",
      responseType: 'json',
      header:{
        Cookie: 'flag="ok"; bid=yG56A3KHR9A; dbcl2="224225133:WtwFP8gIv98"; ck=ctOj',
        UserAgent: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 11_0_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36'
      },
      success: function(response) {
        console.info('response data:' + JSON.stringify(JSON.parse(response.data).song));
        me.data.items = JSON.parse(response.data).song;
      },
      fail: function(data, code) {
        console.info('fail callback');
      },
    })
  }
}

接下来就是在music/index.hml里展现出来了。

<div class="container">
  <list>
    <list-item for="{{data.items}}" class="list_item">
      <image src="{{$item.picture}}" class="image"></image>
      <text class="item" id="{{$item.s_id}}">{{$item.title}}</text>
    </list-item>
  </list>
</div>

页面的结构没有问题,不过样式我调整了半天。这里最主要的问题就是image标签,这是hml里面自带的组件,根据使用下来的感受,这个image组件跟原生的img标签可是完全不一样的:

.image{
  height: 50px;
  width: 50px;
  object-fit: contain; /*设置图片的缩放形式*/
}

最好是强行设置宽高,目前我还没太搞清楚这里面的样式问题。

最后的结果就是:

因为远程调试,也没有办法播放音乐,所以就不做播放功能了,先去尝试一下其他组件吧。


更多关于HarmonyOS鸿蒙Next应用开发踩坑记之路由跳转的实战教程也可以访问 https://www.itying.com/category-93-b0.html

4 回复

成为你的小粉丝很荣幸

更多关于HarmonyOS鸿蒙Next应用开发踩坑记之路由跳转的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


感谢,老铁,我把文件夹中.hml,.css,.js的前缀名更改了,不能跳转,原来必须是index开头

在HarmonyOS鸿蒙Next应用开发中,路由跳转是一个常见的功能,但在实际开发中可能会遇到一些问题。以下是一些常见的踩坑点:

  1. 路由配置错误:在config.json文件中,路由配置必须正确,否则会导致跳转失败。确保pages数组中的路径与实际文件路径一致。

  2. 路由跳转参数传递:在跳转时传递参数,需要使用router.pushrouter.replace方法,并确保参数类型和格式正确。参数在目标页面通过this.$route.querythis.$route.params获取。

  3. 路由拦截:在某些情况下,需要对路由进行拦截,例如用户未登录时跳转到登录页面。可以通过router.beforeEach方法实现路由拦截。

  4. 路由模式:鸿蒙Next支持hashhistory两种路由模式。hash模式使用URL的hash部分来实现路由,而history模式使用HTML5的History API。根据项目需求选择合适的路由模式。

  5. 路由懒加载:为了提高应用性能,可以使用路由懒加载技术,将路由对应的组件按需加载。在config.json中配置lazyLoadtrue,并在组件中使用import()动态导入。

  6. 路由动画:在跳转时添加动画效果,可以通过router.pushrouter.replace方法的transition参数实现。支持slidefade等动画效果。

  7. 路由回退:在需要回退到上一个页面时,可以使用router.back方法。注意处理回退时的状态和参数。

  8. 路由嵌套:在复杂应用中,可能需要使用嵌套路由。在config.json中配置children属性,并在父组件中使用<router-view>渲染子路由。

  9. 路由守卫:在路由跳转前后执行特定逻辑,可以使用router.beforeEachrouter.afterEach方法。例如,在跳转前检查用户权限,跳转后记录日志。

  10. 路由错误处理:在路由跳转失败时,需要处理错误情况。可以通过router.onError方法捕获错误,并进行相应处理。

以上是HarmonyOS鸿蒙Next应用开发中路由跳转的一些常见问题和解决方法。

在HarmonyOS鸿蒙Next应用开发中,路由跳转是一个常见但容易出错的环节。首先,确保在config.json中正确配置了路由路径。其次,使用router.pushrouter.replace进行页面跳转时,注意传递的参数类型和格式,避免因参数错误导致页面无法加载。此外,跳转前应检查目标页面是否存在,避免因路径错误导致应用崩溃。最后,处理返回逻辑时,确保router.back能正确返回到上一页面,避免用户操作中断。

回到顶部