# 开发 \| 如何在微信小程序的页面间传递数据？

- 作者：知晓程序
- 发布时间：2017-05-07 11:30
- 原文：https://www.ifanr.com/minapp/830664

![](https://s3.ifanr.com/wp-content/uploads/2017/05/qrkf.jpg)

**知晓程序注：**

我们在之前发布过小程序页面传值方法的[简单介绍](http://www.ifanr.com/minapp/826237)，说明了在小程序开发中，两种常见的页面之间传值方法。

本期，知晓程序（微信号 zxcx0101）为你带来的是「倒数记日」小程序开发者带来的，小程序开发中，有关页面间数据传递的更多方法。

![](https://s3.ifanr.com/wp-content/uploads/2017/05/qrdsjr.jpg)

---

文 \| 小日子先生

在微信小程序的开发中，我们会经常遇到页面间数据传递或者相互影响的问题。在实际的开发过程中，可以通过以下几种方法来实现。

### 使用全局变量

**全局变量实际上是定义了一个全局的对象，并在每个页面中引入。**

在初始化代码的时候，小程序会读取一个 `app.js` 的文件，在这里我们可以定义我们所需要的全局变量。

```
//app.js
...
App({
    globalData : {
        foo : 'bar'
    }
});
```

然后在页面中，可以通过 `getApp()` 方法获取到全局应用对象，可以对全局变量进行读取并更改：

```
//page.js
...
var app = getApp()
var getFoo = app.globalData.foo
app.globalData.foo = 'fun'
```

**由于 `app.js` 在项目中是用来做基础配置的，因此不建议将很多变量放在这里配置。**一般情况下会将一些持久化的常量配置在这里，对于经常需要变动的量不建议用这个方法。

### 使用本地缓存

本地缓存是微信小程序提供的一个功能，**可以将用户产生的数据做本地的持久化**，类似于 NoSQL，可以进行读取和修改的操作。

那么在不同的页面之间，如何利用它，进行数据的交互呢？

假设我们在 A 页面保存了用户的信息。

```
// pageA.js
...
var developer = {
  name: 'raymond',
  gender: 'male'
}

wx.setStorageSync('developer', developer);
```

这样做，这个数据就存在了本地。当在 B 页面需要使用的时候，可以直接的获取到数据池中的数据，并进行 CRUD 操作：

```
//pageB.js
...
// Retrieve
var developer = (wx.getStorageSync('developer') || [])

// Update
developer.name = 'Jiayang'
wx.setStorageSync('developer', developer);

// Delete
wx.removeStorage({
  key: 'developer'
})
```

需要注意的是，在**回到 A 页面的时候，小程序需要重新读取数据**。这时候，可以选择放在生命周期的 `onShow` 中对数据重新加载

### 父级往子级页面（模板）的数据传递

我们通常会在页面之间进行跳转、重定向的操作。**这时候，我们可以选择将部分数据放在 `url` 里面，并在新页面 `onLoad` 的时候进行初始化。**

```
pageC.js
...
// Navigate
wx.navigateTo({
  url: '../pageD/pageD?name=raymond&gender=male',
})

// Redirect
wx.redirectTo({
  url: '../pageD/pageD?name=raymond&gender=male',
})
```

在 D 页面中，我们可以这样接收到到所传进来的参数：

```
// pageD.js
...
Page({
  onLoad: function(option){
    console.log(option.name + 'is' + option.gender)
    this.setData({
      option: option
    })
  }
})
```

`wx.navigateTo` 和 `wx.redirectTo` 不允许跳转到 tab 所包含的页面，只能用 `wx.switchTab` 跳转。需要注意的是，`wx.switchTab` 中的 `url` 不能传参数。

微信新提供的 `wx.reLaunch` 接口可以传入参数。

另外，在页面中我们通常会用到一些组件模板，因此在父子之间也会有相应的数据传递。

使用 `name` 属性，作为模板的名字。然后在这里面使用 `is` 属性，声明需要的使用的模板。

```
{{index}}: {{msg}}
Time: {{time}}
```

然后将模板所需要的 `data` 传入，如：

```xml
<span class="token tag"><span class="token tag"><span class="token punctuation"><</span>template</span> <span class="token attr-name">is</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>msgItem<span class="token punctuation">"</span></span> <span class="token attr-name">data</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>{{...item}}<span class="token punctuation">"</span></span><span class="token punctuation">/></span></span>
```

```
Page({
  data: {
    item: {
      index: 0,
      msg: 'this is a template',
      time: '2016-09-15'
    }
  }
})
```

**传入模板的除了变量，还可以是事件方法对象。**例如，模板中的点击事件，可以传递到使用模板的元素中。

### 通过获取到页面对象进行数据操作

这个方法的精髓，是通过获取到其他页面的对象原型，**然后通过原型方法 `setData` 对当前对象管理的 `data` 进行修改**，示例如下：

```
//pageE.js
...
Page({
  data: {
    index: 1
  }
})
```

当跳转到下一个页面 F 之后，假定在 F 中有操作需要对 E 中的数据有修改，则可以使用以下方法：

```
pageF.js
...
Page({
  changeIndexInE: function(){
    var pages = getCurrentPages();
    var prevPage = pages[pages.length - 2];
    prevPage.setData({
      index: 0
    })
  }
})
```

这个方法可以操作页面堆栈里面的页面的数据，**可以做到让后一级页面对上级页面群的数据管理**。

### 小结

在微信小程序中有以上并且不局限于以上几种的方式进行页面间数据传递、交互，**在实际应用中可以组合使用**。比如说：

- 一些常量，可以交由 `app.js` 管理；需要持久化的量可以放在本地保存。
- 涉及到下级页面或者模板元素的数据，可以通过传入参数的方式传入。
- 后级页面可以通过获取堆栈里的页面对象快速修改上级的数据。

在实际应用中结合使用，可以更好地管理小程序的数据。

本文如有不周到之处，可以留言进行讨论。

#### **本文由知晓程序授权转载，关注微信号 zxcx0101，在微信后台回复「0109」，一张图教你玩转微信小程序。**

![zxcx&#95;0208](https://s3.ifanr.com/wp-content/uploads/2017/02/zxcx_0208.png)
