vue-demo-collection 基于Vue2.x重构升级

Rustacean
• 阅读 2242

去年vue还没有升级为2.0点时候,创建了这个库,并且写了几篇简单的入门教程。发现也有一些朋友都拿这个collection来入门vue,在去年10月份vue升级2.0版本后,我一直没时间来升级这个collection。现在终于有一整块时间来做升级。借助这几个demo来感受如何从vue1.x升级vue2.x。我新建了vue2.x分支,所有的升级改动都将提交到这个分支中。

package版本升级

  • vue: ^1.0.0 to ^2.2.1

  • vue-resource: ^0.7.4 to ^1.3.1

  • vue-router: ^0.7.13 to 2.5.2

  • vuex: ^0.6.3 to 2.3.1

  • webpack: ^1.12.2 to 2.2.0

看完版本升级对比,感觉我都是拿着“古董”写的vue1.x版本的demo。vue全家桶+webpack全部有了重要的更新。前端生态就是这样子,半年不去更新,世界都换了个样子。

工程升级

本次升级全部基于vue-demo-collection下的demo进行升级。一定还有升级中没有接触到的点,这里不去深入。

webpack1.x升级2.x

webpack1.x和2.x最大的变化是module.loaders变成了module.rules

以下是vue-cli工具创建的vue1.x模版与vue2.x模版webpack配置文件module代码块对比。

不妨自己尝试一下,通过运行下面命令。找到工程目录中的webpack.conf.js对比一下。

vue init webpack-simple@1.0 vue1.x
vue init webpack-simple vue2.x

对比发现:

  • modules.loaders变为modules.rules

  • vueloaders变为vue-loader

  • babelloaders变为babel-loader

  module: {
-   loaders: [
+   rules: [
      {
        test: /\.vue$/,
-       loader: 'vue'
+       loader: 'vue-loader',
+       options: {
+         loaders: {
+         }
+         // other vue-loader options go here
+       }
      },
      {
        test: /\.js$/,
-       loader: 'babel',
+       loader: 'babel-loader',
        exclude: /node_modules/
      },
      {
        test: /\.(png|jpg|gif|svg)$/,
        loader: 'url',
        query: {
          limit: 10000,
          loader: 'file-loader',
          options: {
           name: '[name].[ext]?[hash]'
        }
      }
    ]
  },

vue1.x升级2.x

vue2.x

入口文件

从升级入口文件main.js开始,Vue2.x的入口文件和Vue1.x相比,Vue实例带有router和store选项。

  • router配置参数注入路由,从而整个应用都有路由功能;

  • store配置参数注入store到根实例,从而根组件下所有子组件都可以访问store。

// 简单的main.js
import Vue from 'vue'
import VueResource from 'vue-resource'
import App from './App.vue'

Vue.use(VueResource)

new Vue({
  el: '#app',
  render: h => h(App)
})
// 带有vue-router和vuex的main.js
import Vue from 'vue'
import VueRouter from 'vue-router'
import routes from './routes'
import App from './App.vue'
import store from './vuex/store'

// Vue.config.devtools = true

Vue.use(VueRouter)

const router = new VueRouter({
  scrollBehavior: () => ({ y: 0 }),
  routes
})

// Start up our app
const app = new Vue({
  router,
  store,
  ...App
})

app.$mount("#root")

$Index$key在vue2.x中已经被弃用,代替写法为:

<li v-for="(value, key, index) in objs" ></li>

vue2.2.0+版本在组件使用v-for指令到时候需要指定key,这点和react类似。

vuex2.x

首先看两张图:

vuex1.0数据流闭环

vuex2.0数据流闭环

  • vuex中的store选项,从App组件,移动到入口文件main.js,在创建Vue实例的时候通过store对象提供给store选项。

const app = new Vue({
  store,
  ...App
})

app.$mount("#root")
  • vue2.x中去掉了$remove方法,使用splice方法代替。

state.cart.splice(state.cart.indexOf(cartInfo), 1)

  • action中dispatch变为commit,实践中会用到ES6解构来简化代码。

actions: {
  increment ({ commit }) {
    commit('increment')
  }
}

我对action中commit方法做了统一优化,用统一的函数处理commit。

import * as types from './mutation-types'

const makeAction = (type) => {
  return ({ commit }, ...args) => commit(type, ...args)
}

export const changePrice = makeAction(types.CHANGE_PRICE)
export const changeStyle = makeAction(types.CHANGE_STYLE)
export const addItem = makeAction(types.ADD_ITEM)
export const removeItem = makeAction(types.REMOVE_ITEM)
  • 善用组件绑定的辅助函数

vuex2.x给开发者带来另一个福利,多了map*系列的辅助函数:

mapState - 创建组件的计算属性返回 Vuex store 中的状态
mapGetters - 创建组件的计算属性返回 getter 的返回值。
mapActions - 创建组件方法分发 action。
mapMutations - 创建组件方法提交 mutation。

vue-router2.x

vue-router2.x中,路由初始化时,在创建Vue实例的时候需要传入router配置向整个应用注入路由功能。

const app = new Vue({
  router,
  ...App
})

app.$mount("#root")

vue-router2.x中,router.map替换为router实例里的一个routes选项数组。

import Index from './components/Index.vue'
import Cart from './components/Cart.vue'
// Route config
export default [
  {
    path: '/',
    name: 'Home',
    component: Index
  },
  {
    path: '/index',
    name: 'Index',
    component: Index
  },
  {
    path: '/cart',
    name: 'Cart',
    component: Cart
  },
  {
    path: '*',
    redirect: '/'
  }
]

v-link指令已经被一个新的<router-link>组件指令替代。

<router-link class="navbar-brand" :to="{ path: '/' }">Shopping Cart</router-link>

vue1.x与vue2.x代码比较

原文:vue-demo-collection 基于Vue2.x重构升级

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Souleigh ✨ Souleigh ✨
4年前
Vue3 的 15 个常用 API
来自公众号:前端印象本文会频繁地对比Vue2来介绍Vue3,也将对各个API结合代码实例讲解,这既是对自己知识的总结,也希望能帮助到大家一、前言大家都知道,现在Vue3的各个版本已经陆续发布了,并且有很多的团队已经着手各个库的开发与Vue2向Vue3的升级,我们当然也不能落后,所以赶紧将你手中的Vue2升级到Vue3,跟着本文一起学
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Jacquelyn38 Jacquelyn38
4年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Easter79 Easter79
3年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
Java日期时间API系列36
  十二时辰,古代劳动人民把一昼夜划分成十二个时段,每一个时段叫一个时辰。二十四小时和十二时辰对照表:时辰时间24时制子时深夜11:00凌晨01:0023:0001:00丑时上午01:00上午03:0001:0003:00寅时上午03:00上午0
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
1年前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这
美凌格栋栋酱 美凌格栋栋酱
5个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(