从 Vue 1.x 迁移

FAQ

哇,非常长的一页!是否意味着 Vue2.0 已经完全不同了呢,是否需要从头学起呢,Vue1.0 的项目是不是没法迁移了?

非常开心地告诉你,并不是! 几乎90%的 API 和核心概念都没有变。因为本节包含了很多详尽的阐述以及许多迁移的例子,所以显得有点长。不用担心,你也不必从头到尾把本节读一遍!

怎么开始做项目迁移?

  1. 从运行 migration helper 这个工具开始。我们非常谨慎地把一个高级 Vue 开发工具简化并重新编译成了一个命令行工具。当这个工具发现了一个弃用的用法之后,就会给出通知和建议,并附上关于详细信息的链接。
  2. 然后,看看侧边栏给出的关于这一页的内容。如果你发现有的地方有影响,而该工具没有给出提示的,请检查并解决一下该项。
  3. 如果有测试的话,测试一边看看还有什么问题。如果没有测试的话,打开 app,随机翻一下,看一下有什么报错或者警告信息。
  4. 至此,你的 app 基本已经迁移完毕了。如果你有更多想了解的,可以阅读一下本节剩下的部分。

从1.0 迁移到2.0要花多长时间?

取决于以下几个方面:

  • 要迁移的 app 的规模。(小到中型的基本上一天内就可以搞定)
  • 为了耍耍 Vue2.0 的新功能分心了多少次。 ??  不是说你们,我们构建 Vue2.0 的时候经常发生这种事。
  • 使用了哪些弃用的功能。基本上大部分弃用的功能可以通过 find-and-replace 来实现升级,但有一些还是要花点时间。如果你没有遵循最佳实践,那么 Vue2.0 会强迫你去遵循。这有利于项目的长期运行,但是也意味着重构(也许有些需要重构的东西已经过时)。

迁移到 Vue 2 ,我也需要更新 Vuex 和 Vue-Router ?

只有 Vue-Router 2 是可编译的,可以遵循 Vue-Router 迁移路径 来处理。幸运地是, 大多数应用不含有许多路由代码,所以迁移不用超过一小时。

对于 Vuex , 甚至 0.8 版本和 Vue 2 一起都是可以编译的,所以不必强制更新。 促使你立即更新的理由是 Vuex 2 有更先进的功能,比如模块和减少的样板文件。

模板

片段实例 移除

每个组件有且仅有一个根节点。不再支持片段实例,如果你有这样的模板:

<p>foo</p>
<p>bar</p>

最好把它包裹到一个简单的容器里面去:

<div>
  <p>foo</p>
  <p>bar</p>
</div>

升级方式

升级后,为你的 app 运行端对端测试 ,并关注关于多个根节点的console warnings。

生命周期钩子

beforeCompile 移除

用 created 钩子来代替。

升级方式

运行 migration helper 工具找到所有使用这个钩子的实例

compiled 替换

用 mounted 钩子来代替。

升级方式

运行 migration helper 工具找到所有使用这个钩子的实例

attached 移除

依赖其它钩子使用自定义的 dom 内部方法,例如:

attached: function () {
  doSomething()
}

现在可以这样做:

mounted: function () {
  this.$nextTick(function () {
    doSomething()
  })
}

升级方式

运行 migration helper 工具找到所有使用这个钩子的实例

detached 移除

用自定义的 dom 内部的其他钩子代替,例如:

detached: function () {
  doSomething()
}

可以用以下方式代替:

destroyed: function () {
  this.$nextTick(function () {
    doSomething()
  })
}

升级方式

运行 migration helper 工具找到所有使用这个钩子的实例

init 换名

用新的 beforeCreate 钩子代替,他们本质上是一样的。为了与其他生命周期的钩子命名保持一致性,所以重新命名了这个钩子。

升级方式

运行 migration helper 工具找到所有使用这个钩子的实例

ready 替换

使用新的 mounted 钩子代替,应该注意的是,通过使用 mounted 钩子,并不能保证该实例已经插入文档。所以还应该在钩子函数中包含 Vue.nextTick/vm.$nextTick 例如:

mounted: function () {
  this.$nextTick(function () {
    // 保证 this.$el 已经插入文档
  })
}

升级方式

运行 migration helper 工具找到所有使用这个钩子的实例

v-for

v-for 数组参数的顺序 改变

当含有 index 时,以前传递的参数顺序是:(index, value)。现在变成了:(value, index) ,这样可以与js的新数组方法:forEachmap 保持一致。

升级方式

运行 migration helper 来找到使用弃用参数顺序的实例。注意,该工具将不会标记以 position 或者 num 来命名 index 参数。

v-for 对象参数的顺序 改变

当包含 key 时,对象的参数顺序是 (key, value)。现在改为了 (value, key),这样可以和通用的对象迭代器(比如 lodash 的迭代器)保持一致。

升级方式

运行 migration helper 来找到使用弃用参数顺序的实例。注意,该工具将不会标记以 name 或者 property 来命名 key 参数。

$index and $key 移除

隐式申明的 $index 的 $key 两个变量在新版里面已经弃用了,取代的是在 v-for 中显式地申明。这可以使无经验的 Vue 开发者更好地理解代码,同样也可以使得在处理嵌套循环时更加清晰。

升级方式

运行 migration helper 来找到使用弃用变量的实例。如果有些没有找到,也可以参考控制台警告信息 比如 Uncaught ReferenceError: $index is not defined

track-by 替换

track-by 被 key取代,和其他参数一样,如果没有 v-bind或者: 前缀,它将被作为一个字符串。大多数情况下, 我们想要能够动态绑定完整的表达式,而不是一个 key。例如:

<div v-for="item in items" track-by="id">

现在应该写成:

<div v-for="item in items" v-bind:key="item.id">

升级方式

运行 migration helper 找到含 track-by的实例。

v-for 排序值 改变

显然 v-for="number in 10" 将使得 number 从0到9迭代,现在变成了从1到10。

升级方式

以正则 /\w+ in \d+/搜索整个代码,当出现在 v-for里面时,检查一下,对你是否有影响。

Props

coerce Prop的参数 移除

如果需要检查 prop 的值,创建一个内部的 computed 值,而不再在 props 内部去定义,例如:

props: {
  username: {
    type: String,
    coerce: function (value) {
      return value
        .toLowerCase()
        .replace(/\s+/, ‘-‘)
    }
  }
}

现在应该写为:

props: {
  username: String,
},
computed: {
  normalizedUsername: function () {
    return this.username
      .toLowerCase()
      .replace(/\s+/, ‘-‘)
  }
}

这样有一些好处:

  • 你可以对保持原始 prop 值的操作权限。
  • 通过给予验证后的值一个不同的命名,强制开发者使用显式申明。

升级方式

运行 migration helper 工具找出包含 coerce 选项的实例。

时间: 2024-08-26 18:31:32

从 Vue 1.x 迁移的相关文章

从 Vue 1.x 迁移 — Vue.js

闲聊: 又到周五啦,明天不用上班啦哈哈哈哈哈,想想就好开心啊,嘻嘻,小颖这周三的早晨做个一个美梦,把自己愣是笑醒了,梦的大概剧情我忘记了,总之宝宝是被笑醒的,行了之后还傻笑了一段时间,真希望每天早上都能梦到这样的梦,估计当时我家仔仔看着我傻笑内心是崩溃的,估计在想,这傻妞又做什么梦了,太能折腾了,哭醒.笑醒.从床上掉下去 摔醒,估计也就我家铲屎的有这技能.哈哈哈哈 1.twoWay-Prop-的参数-移除 小颖在之前用vue1.的时候子组件可以通过Prop中twoWay的参数,直接修改父组件的值

前端开发:如何写一手漂亮的 Vue

前几日听到一句生猛与激励并存,可怕与尴尬同在,最无奈也无解的话:"90后,你的中年危机已经杀到".这令我很受触动.显然,这有些夸张了,但就目前这日复一日的庸碌下去,眨眼的功夫,那情形就会在这骨感的现实面前,悄然的被显现.所以,越发体验到,当必要有计划的去做,去写,去玩,去嗨,利用好这荷尔蒙分泌还算旺盛的时光,去厚积去博取,去发现去折腾:让自己的生命不在仅是工作与惆怅,还有时间分与"诗和远方".不用分析,就知道这该如何去做,高效去完成工作,然后去学着优雅地生而活.目前

现代前端库开发指南系列(二):使用 webpack 构建一个库

前言 在前文中,我说过本系列文章的受众是在现代前端体系下能够熟练编写业务代码的同学,因此本文在介绍 webpack 配置时,仅提及构建一个库所特有的配置,其余配置请参考 webpack 官方文档. 输出产物 构建一个库与构建一个一般应用最大的不同点在于构建完成后输出的产物. 一般应用构建完成后会输出: 一个 html 文件 一个 js 入口 chunk .若干子 chunk 若干 css 文件 若干其它资源,如图片.字体文件等 虽然输出的资源非常多,但实际上所有的依赖.加载关系都已经从 html

jQuery到Vue的迁移之路

背景 在前段时间做了L10的某个超复杂超多坑的三端专题之后,组里的小伙伴们一致认为是时候想办法统一一下组里的开发模式了.因为用nie那一套jQuery/zepto(下文jQuery默认包括zepto)的话,十个人就有十种习惯,不管是代码组织也好,页面结构也好,逻辑处理也好-- 其实如果像一般的专题,开发周期短,生命周期短的,用传统的方式开发也还好,不需要后期维护,不需要多人协作.但是,如果项目稍微复杂一点,问题就来了,一碰到需要多人协作的项目,不同的人都有不同的组织代码的习惯,维护起来效率相当低

为什么我们从Angular 2迁移到Vue.js(为什么我们没有选择React)

在Rever(www.reverscore.com),我们刚刚使用Vue.js发布了我们的Web客户端的新版本.经过641次提交和16周的紧张开发,我们非常自豪之前做出的决定.8个月前,我们的前端在使用Angular 2.确切地说,它使用的是Angular 2 beta 9.这是一个由外包公司编写的产品,我们从很多层面上都没有完全满意,从UX / UI到架构,在某种程度上,与Angular 2本身有很大的关系. 在之前,我承认Angular 2 beta 9是与Angular 2.0不同的产品,

[转]vue全面介绍--全家桶、项目实例

慢慢了解vue及其全家桶的过程 原文http://blog.csdn.net/zhenghao35791/article/details/67639415 简介 “简单却不失优雅,小巧而不乏大匠”. 2016年最火的前端框架当属Vue.js了,很多使用过vue的程序员这样评价它,“vue.js兼具angular.js和React.js的优点,并剔除了它们的缺点”.授予了这么高的评价的vue.js,也是开源世界华人的骄傲,因为它的作者是位中国人–尤雨溪(Evan You). Vue.js 是一个J

从Vue.js窥探前端行业

近年来前端开发趋势 1.旧浏览器逐渐淘汰,移动端需求增加: 旧浏览器主要指的是IE6-IE8,它是不支持ES5特性的:IE9+.chrome.sarafi.firefox对ES5是完全支持的,移动端大部分浏览器是基于webkit内核,所以ES5在移动端也是全面支持的,因此vue可以在移动端以及现代浏览器中大显身手. 2.前端交互越来越多,功能越来越复杂: 现在的前端可谓是包罗万象,比如高大上的技术库和框架.酷炫的运营活动页面.H5小游戏,当然前端技术的应用在更多具有商业价值的应用上,比如下图.

Vue.js——webpack

Vue.js——60分钟webpack项目模板快速入门 browserify是一个 CommonJS风格的模块管理和打包工具,上一篇我们简单地介绍了Vue.js官方基于browserify构筑的一套开发模板.webpack提供了和browserify类似的功能,在前端资源管理这方面,它提供了更加出色的功能.官方基于webpack提供了两种项目模板,分别是vue-webpack-simple模板和vue-webpack模板,今天我们将介绍官方提供的这两种项目模板,并用vue-webpack-sim

更轻更快的Vue.js 2.0与其他框架对比(转)

更轻更快的Vue.js 2.0 崭露头角的JavaScript框架Vue.js 2.0版本已经发布,在狂热的JavaScript世界里带来了让人耳目一新的变化. Vue创建者尤雨溪称,Vue 2.0 在性能上有显著的提升,同时保持轻量的文件下载: 渲染层基于一个轻量级的Virtual DOM实现进行了重写,该Virtual DOM实现fork自snabbdom.新的渲染层相比v1带来了巨大的性能提升,也让Vue 2.0成为了最快速的框架之一. 根据1.0到2.0迁移指南,“大约90%的API是相