小程序|页面传参的三种方式

本文介绍了在小程序中页面间参数传递的三种方式,重点讲解了通过URL query参数传递的方法。首先,将文章ID绑定到每个文章的WXML中,然后在页面JS中通过event对象和dataset获取当前文章的ID,从而实现参数传递。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

要正确展示文章详情页面的内容,首先需要将文章的id号由post页面传递到post-detail页面,这样,post-detail页面才能知晓它要显示哪篇文章。这涉及页面间的参数传递与通信。目前,在MNA框架中有以下几种参数传递方式:

  1. 使用全局变量(关于全局变量,本书后面的章节中会讲到);
  2. 使用缓存;
  3. 通过页面导航url的query参数传递。

基本上参数的传递只有以上3种方式,其他的比如像事件信号的传参方式(一个页面emit
发送信号,一个页面on监听信号,这种在AngularJS里很常见的传参方式,小程序是不能天
然支持的),其实都是这些基本思路的变种。
开发者在学习完缓存后应该很容易想到。其实,使用缓存数据库存储data,js初始化数据,又在post.js中读取缓存数据,这其实就是页面间的参数传递。仔细想想,是不是这样?
1、2两种都涉及全局变量,笔者个人不推荐这种污染全局的传参方式,而且我们的需求仅仅是两个页面间传递参数,完全不需要干扰全局。所以,选用方法3来做页面间的参数传递。
要想在post,js中获取到postId,就必须知道当前点击的文章是哪一篇文章。我们首先将postld绑定到每一篇文章的wxml中,使postId成为文章wxml的一个属性。注意,postId已经定义在了data.js中了。

1、绑定postId

  <block wx:for="{{ postList }}" wx:for-item="item" wx:for-index="idx">
  <!-- 不要再block标签或tempale标签上绑定事件!! -->
    <view catchtap="onTapToDetail" data-post-id="{{ item.postId }}">
      <template is="postItemTpl" data="{{ ...item }}" />
    </view>
  </block>

2、在post.js中添加如下代码: 

  onTapToDetail:function(event){
    // 下面这行代码获取postId:
    var postId=event.currentTarget.dataset.postId;
    console.log(postId);
    wx.navigateTo({
      url: './post-detail/post-detail?id=' + postId,
    });
  },

控制台显示postId,说明id确实已经传过来了。 

每篇文章的id都被绑定在了该文章的view容器上,剩下的工作就是,如何获取当前文章的id了。

上述代码中,我们通过event.currentTarget.dataset.postId,这段代码成功地拿到了当前文章
的postId。
event事件对象是由MNA框架在调用onTapToDetail函数时传递的参数。在event事件对
象中,有一个currentTarget代表事件绑定的当前组件。
重点是dataset对象,dataset对象里包含当前组件中所有属性名以data-开头的自定义属性
值。我们在代码清单6-5中的view上绑定了data-post-id,所以通过dataset.postId将可以拿到
当前组件的postId。.
组件自定义属性名有以下规则:

  1. 必须以data-开头。
  2. 多个单词由连字符“”链接。
  3. 单词中最好不要有大写字母,如果有大写字母,除单词第一个字母外,其余大写字母
    将被转化成小写。
  4. 在js中获取自定义属性值时,多个单词将被转化驼峰命名。

举例子:

组件的属性定义
组件的自定义数据dataset中变量名
data-postdataset.post
data-post-iddataset.postId
data-pOST-IDdataset.postId
data-postIddataset.postId

 我们只需要以这种格式传给页面(url的query参数)就好了:

      url: './post-detail/post-detail?id=' + postId,

小程序的事件传参页面传参都是非常常见的场景,具体实现方式如下: ### 事件传参小程序中,可以通过 `data-*` 属性将数据传递给事件处理函数。在 WXML 中,通过 `bind:eventName` 或 `catch:eventName` 绑定事件处理函数,例如: ```html <view bind:tap="handleTap" data-id="123">点击我</view> ``` 在事件处理函数中,可以通过 `event.currentTarget.dataset` 获取 `data-*` 属性值,例如: ```javascript Page({ handleTap(event) { const id = event.currentTarget.dataset.id console.log('id:', id) // 输出:id: 123 } }) ``` ### 页面传参小程序中,可以通过路由传参方式将数据传递给目标页面。在源页面中,通过 `wx.navigateTo` 或 `wx.redirectTo` 方法跳转到目标页面,并传递参数,例如: ```javascript wx.navigateTo({ url: '/pages/detail/detail?id=123' }) ``` 在目标页面中,可以通过 `onLoad` 生命周期函数获取路由参数,例如: ```javascript Page({ onLoad(options) { const id = options.id console.log('id:', id) // 输出:id: 123 } }) ``` 需要注意的是,路由参数的类型都是字符串类型,如果需要传递数字或其他类型的数据,需要进行类型转换。例如: ```javascript wx.navigateTo({ url: '/pages/detail/detail?id=' + 123 }) ``` 在目标页面中,需要将字符串类型的参数转换为数字类型,例如: ```javascript Page({ onLoad(options) { const id = parseInt(options.id) console.log('id:', id) // 输出:id: 123 } }) ``` 除了路由传参,还可以通过全局变量、缓存、事件总线等方式进行数据传递。需要根据具体场景选择合适的方式
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值