微信小程序与 Vue 的区别

对比微信小程序和 Vue 在语法、数据绑定、生命周期等方面的差异

问题

微信小程序和 Vue 有哪些区别?

解答

1. 数据绑定

Vue:响应式双向绑定

<template>
  <input v-model="message" />
  <p>{{ message }}</p>
</template>

<script>
export default {
  data() {
    return {
      message: 'Hello'
    }
  },
  methods: {
    updateMessage() {
      // 直接赋值即可触发更新
      this.message = 'World'
    }
  }
}
</script>

小程序:单向绑定,需手动调用 setData

// index.wxml
// <input value="{{message}}" bindinput="onInput" />
// <text>{{message}}</text>

// index.js
Page({
  data: {
    message: 'Hello'
  },
  onInput(e) {
    // 必须通过 setData 更新数据
    this.setData({
      message: e.detail.value
    })
  },
  updateMessage() {
    this.setData({ message: 'World' })
  }
})

2. 生命周期

Vue 组件生命周期:

export default {
  beforeCreate() {},  // 实例初始化前
  created() {},       // 实例创建完成
  beforeMount() {},   // 挂载前
  mounted() {},       // 挂载完成
  beforeUpdate() {},  // 更新前
  updated() {},       // 更新完成
  beforeUnmount() {}, // 卸载前
  unmounted() {}      // 卸载完成
}

小程序页面生命周期:

Page({
  onLoad() {},    // 页面加载
  onShow() {},    // 页面显示
  onReady() {},   // 页面初次渲染完成
  onHide() {},    // 页面隐藏
  onUnload() {}   // 页面卸载
})

小程序组件生命周期:

Component({
  lifetimes: {
    created() {},   // 组件实例创建
    attached() {},  // 组件进入页面节点树
    ready() {},     // 组件布局完成
    detached() {}   // 组件离开页面节点树
  }
})

3. 模板语法

功能Vue小程序
条件渲染v-if / v-elsewx:if / wx:else
列表渲染v-for="item in list"wx:for="{{list}}"
事件绑定@click / v-on:clickbindtap / catchtap
双向绑定v-model无,需手动实现
类名绑定:classclass="{{className}}"
<!-- Vue -->
<div v-for="(item, index) in list" :key="item.id" @click="handleClick(item)">
  {{ item.name }}
</div>

<!-- 小程序 -->
<view wx:for="{{list}}" wx:key="id" bindtap="handleClick" data-item="{{item}}">
  {{ item.name }}
</view>

4. 组件通信

Vue:props + emit

<!-- 父组件 -->
<Child :msg="message" @update="handleUpdate" />

<!-- 子组件 -->
<script>
export default {
  props: ['msg'],
  methods: {
    notify() {
      this.$emit('update', 'new value')
    }
  }
}
</script>

小程序:properties + triggerEvent

// 父组件 wxml
// <child msg="{{message}}" bind:update="handleUpdate" />

// 子组件 js
Component({
  properties: {
    msg: String
  },
  methods: {
    notify() {
      this.triggerEvent('update', { value: 'new value' })
    }
  }
})

5. 运行环境

对比项Vue微信小程序
运行环境浏览器微信客户端(双线程)
渲染层WebViewWebView
逻辑层WebViewJSCore
DOM 操作可以不可以
路由vue-router原生导航 API
状态管理Vuex / Pinia全局变量 / 第三方库

关键点

  • 数据更新:Vue 直接赋值,小程序必须用 setData
  • 双向绑定:Vue 有 v-model,小程序需手动实现
  • 运行架构:小程序是双线程(渲染层 + 逻辑层),无法直接操作 DOM
  • 事件传参:Vue 可直接传参,小程序需通过 data-* 属性
  • 生命周期:小程序区分页面和组件两套生命周期