vue 一个简单的项目 之三 详情页面 step7 在项目中加入基础动画

本篇我们尝试在项目中加入基础动画。

首先,新建分支detail-animation, pull下来,在新分支上写代码。

我们要做的效果是,公共画廊组件打开关闭时渐隐渐现。

首先,在src/common 下新建一个文件夹 fade。在fade 下,建一个Fade.vue 组件。

直接写一下 Fade.vue 如下。

<template>
  <transition>
    <slot></slot>
  </transition>
</template>

<script>
export default {
  name: 'Fade'
}
</script>

<style lang="stylus" scoped="">
  .v-enter, .v-leave-to
    opacity: 0
  .v-enter-active, .v-leave-active
    transition: opacity .5s
</style>

下面,在Banner.vue 中使用 Fade.vue

Banner.vue 相关代码。

<template>
  <div>
    <div class="banner" @click="handleBannerClick">
      <img class="banner-img" :src="bannerImg">
      <div class="banner-info">
        <div class="banner-title">
          {{this.sightName}}
        </div>
        <div class="banner-number">
          <span class="iconfont banner-icon">&#xe632;</span>
          {{this.bannerImgs.length}}
        </div>
      </div>
    </div>
    <fade>
      <common-gallary
        :imgs="bannerImgs"
        v-show="showGallary"
        @close="handleGalleryClose"
      ></common-gallary>
    </fade>
  </div>
</template>

<script>
import CommonGallary from 'common/gallary/Gallary'
import Fade from 'common/fade/Fade'
export default {
  name: 'DetailBanner',
  props: {
    sightName: String,
    bannerImg: String,
    bannerImgs: Array
  },
  data () {
    return {
      showGallary: false
    }
  },
  components: {
    CommonGallary,
    Fade
  },
  methods: {
    handleBannerClick () {
      this.showGallary = true
    },
    handleGalleryClose () {
      this.showGallary = false
    }
  }
}
</script>

Done! 

提交合并。

<think>嗯,用户想了解微信小程序在过渡动画、路由缓存机制方面与Vue2的差异。这个问题涉及前端框架和原生小程序开发的对比,需要从多个技术维度拆解。 用户可能是同时接触过Vue和小程序开发的开发者,在项目迁移或技术选型时遇到困惑。从问题表述的专业性来看,用户应该具备中级前端基础,但可能对小程序底层机制不熟悉。需要特别注意避免过于学术化的表述,重点突出实际开发中的差异点。 关于过渡动画部分,小程序和Vue2的核心差异在于实现方式:小程序使用wx.createAnimation这个原生API,需要手动设置动画轨迹和时间轴,类似CSS动画的编程式控制;而Vue2通过<transition>组件实现声明式动画,直接操作DOM元素的状态变化。这个差异会导致开发体验明显不同,比如在小程序里实现一个简单的淡入效果,可能就需要写十几行代码配置动画对象。 路由缓存方面差异更大。微信小程序没有真正的页面缓存概念,页面栈最多支持10个页面,超出时会自动销毁最早页面。但Vue的keep-alive可以精确控制组件级缓存,配合路由守卫还能实现条件性缓存。这点在开发后台管理系统时特别重要,比如需要保持表单页面状态的情况。 用户可能没意识到但很关键的细节是:小程序页面切换时的转场动画完全由微信客户端控制,开发者只能配置基础属性如动画时长,无法自定义动画曲线。而Vue2配合Vue Router可以完全自由控制转场效果,甚至能实现共享元素动画这种高级效果。 最后要注意澄清一个常见误解:很多人以为mpvue等框架能让小程序完全兼容Vue特性,但实际上路由缓存这样的核心机制仍受限于小程序沙盒环境。这点在引用[2]的权限控制案例中也有体现——即使使用Vue风格开发,仍需要单独实现路由拦截逻辑。</think>微信小程序在**过渡动画**、**路由缓存**机制上与**Vue2**框架存在显著差异,主要源于其底层实现和运行环境的不同。以下是核心区别分析: --- ### **一、过渡动画实现差异** #### **微信小程序** 1. **原生API驱动** 使用 `wx.createAnimation` API 创建动画对象,通过 CSS3 过渡实现,**需手动配置动画轨迹和时序**: ```javascript const animation = wx.createAnimation({ duration: 1000, timingFunction: 'ease' }) animation.opacity(0).step() this.setData({ animation: animation.export() }) ``` - **局限**:动画与逻辑层强耦合,需通过 `setData` 同步到视图层。 - **性能**:频繁 `setData` 可能导致卡顿(视图层与逻辑层通信有性能瓶颈)[^1]。 2. **页面切换动画** 使用 `wx.navigateTo` 等路由 API 时,**仅支持系统预设的滑动动画**(如右进左出),无法自定义转场效果。 #### **Vue2** 1. **声明式动画** 通过 `<transition>` 组件实现,**基于 CSS 类名自动切换**: ```html <transition name="fade"> <div v-if="show">内容</div> </transition> ``` ```css .fade-enter-active, .fade-leave-active { transition: opacity 0.5s; } .fade-enter, .fade-leave-to { opacity: 0; } ``` - **优势**:动画与 DOM 生命周期绑定,无需手动管理状态。 2. **JavaScript 钩子** 可结合 `Velocity.js` 等库实现复杂动画: ```javascript <transition @enter="enterEl" @leave="leaveEl">...</transition> ``` --- ### **二、路由缓存机制对比** #### **微信小程序** 1. **无内置页面缓存** - **页面栈管理**:路由跳转时,新页面入栈(`wx.navigateTo`),返回时出栈销毁(`wx.navigateBack`)。 - **数据丢失**:页面关闭后,其状态自动销毁,**无法保留组件状态或数据**。 - **解决方案**: - 使用 `getCurrentPages()` 获取页面栈手动缓存数据。 - 通过全局变量或存储(如 `Storage`)临时保存状态,但需手动恢复[^3]。 #### **Vue2 (Vue Router)** 1. **组件级缓存** 通过 `<keep-alive>` 缓存路由组件状态: ```html <keep-alive> <router-view v-if="$route.meta.keepAlive"></router-view> </keep-alive> ``` - **生命周期**:被缓存的组件触发 `activated`/`deactivated` 钩子。 - **精细控制**:可基于路由元信息(`meta`)动态决定是否缓存。 2. **状态保留** 返回页面时,组件数据、滚动位置等状态自动恢复。 --- ### **三、核心差异总结** | **能力** | **微信小程序** | **Vue2 (Vue Router)** | |------------------|-----------------------------------|------------------------------| | **动画自由度** | 需手动编程式控制,仅支持基础属性 | 声明式 CSS/JS 动画,灵活扩展 | | **路由动画** | 仅系统预设跳转动画 | 完全自定义转场效果 | | **页面缓存** | 无内置,依赖全局存储或手动恢复 | `<keep-alive>` 组件级缓存 | | **状态管理** | 页面销毁后状态丢失 | 缓存组件状态自动保留 | | **路由拦截** | 无全局钩子,需逐页判断[^2] | 支持 `beforeEach` 等全局守卫 | --- ### **四、开发建议** 1. **小程序动画优化** - 减少 `setData` 频率,使用 `this.animate` API(基础库 2.9.0+)提升性能。 - 复杂动画建议用 CSS3 原生实现,减少逻辑层通信。 2. **模拟 Vue 缓存机制** - 使用 `Storage` 存储关键数据,在 `onShow` 生命周期中恢复状态。 - 封装路由工具类,模拟 `keep-alive` 行为(如记录页面快照)。 3. **路由拦截实现** 封装路由跳转方法,加入全局权限校验逻辑: ```javascript function navigateTo(url) { if (!checkPermission()) return; wx.navigateTo({ url }); } ``` > **关键差异根源**:小程序基于双线程架构(视图层 WebView + 逻辑层 JSCore),而 Vue 应用在单页浏览器环境中运行,导致路由、动画等机制的设计本质不同[^1][^3]。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值