# 数据响应

Vue中最为开发者们所津津乐道的特性就是其数据响应特性,Vue中的数据响应特性主要包含:响应数据赋值、watch观察数据和computed计算属性,该能力让我们能够以非常直观简洁的方式建立起数据与数据之间/数据与视图之间的绑定依赖关系,大幅提升复杂webapp的开发体验和开发效率。

受此启发,Mpx通过增强的方式在小程序开发中提供了完整的数据响应特性,在2.5.x版本前,Mpx通过mobx实现内部和核心数据响应,在2.5.x版本之后,从数据响应性能、完整度和运行时包体积等多方面角度考虑,我们借鉴了Vue2的设计,在内部自行维护了一套精简高效的数据响应系统,全面移除了对于mobx的依赖。

在新的响应系统中,所有的使用方法和使用限制都和Vue保持一致,关于数据响应的原理和使用限制可以参考这里 (opens new window)

下面是一个小程序数据响应的简单示例:

<template>
  <view>
    <view>Num: {{num}}</view>
    <view>Minus num: {{mnum}}</view>
    <view>Num plus: {{nump}}</view>
    <view>{{info.name}}</view>
    <view wx:if="{{info.age}}">{{info.age}}</view>
  </view>
</template>

<script>
  import { createPage } from '@mpxjs/core'

  createPage({
    // data中定义的数据会在初始化时进行数据响应处理
    data: {
      num: 1,
      info: {
        name: 'test'
      }
    },
    // 配置中直接定义watch
    watch: {
      num (val) {
        console.log(val)
      }
    },
    // 定义计算属性,模板中可以直接访问
    computed: {
      mnum () {
        return -this.num
      },
      nump: {
        get () {
          return this.num + 1
        },
        // 支持计算属性的setter
        set (val) {
          this.num = val - 1
        }
      }
    },
    onReady () {
      // 使用实例方法定义watch,可以传递追踪函数更加灵活
      this.$watch(() => {
        return this.nump - this.mnum
      }, (val) => {
        console.log(val)
      })
      // 每隔一秒进行一次更新,相关watcher会被触发,视图也会发生更新
      setInterval(() => {
        this.num++
      }, 1000)
      // 使用$set新增响应属性,视图同样能够得到更新
      setTimeout(() => {
        this.$set(this.info, 'age', 23)
      }, 1000)
    }
  })
</script>