VUE 3.0初体验总结

2020年9月19日凌晨,尤雨溪大大正式发布了3.0版本,代号:One Piece
Vue 是第一个我们国人开发的框架,且简单易于上手。现在迎来了3.0版本,我相信会越来越好。

下面是3.0版本的一些特点

在 Vue 3 中,基于对象的 2.x API 基本没有变化,3.0 还引入了 [Composition API],旨在解决 Vue 在大规模应用中的使用痛点,实现了类似于 React 钩子的逻辑组成和重用,比 2.x 基于对象的 API 更灵活的代码组织模式和更可靠的类型推理。
Vue 3 与 Vue 2 相比,在捆绑大小 (tree-shaking 时减少了 41%)、初始渲染 (快了 55%)、更新 (快了 133%) 和内存使用 (少了 54%) 方面都有[显著的性能提升]
Vue 3 的代码库是用 TypeScript 编写的,具有自动生成,测试和捆绑的类型定义,因此它们始终是最新的。Composition API 可以很好地处理类型推断。Vetur 是我们的官方 VSCode 扩展,现在利用 Vue 3 改进的内部键入功能支持模板表达式和 props 类型检查。哦,如果您愿意,Vue 3 的打字完全支持 TSX。
为单文件组件 (SFC,即 .vue 文件) 提出了两个新特性:<script setup><style vars>

1.Vue 3.0 项目初始化

npm install -g @vue/cli

安装成功后,查看版本

vue -V
@vue/cli 4.5.6

初始化项目(有router和vuex就可以,其他的按个人喜好配置)

vue create vue3-test

升级vue 3.0项目

cd vue3-test
vue add vue-next
/*
  执行上述指令后,会自动安装vue-cli-plugin-vue-next插件,该插件会完成以下操作:
  安装 Vue 3.0 依赖
  更新 Vue 3.0 webpack loader 配置,使其能够支持 .vue 文件构建(这点非常重要)
  创建 Vue 3.0 的模板代码
  自动将代码中的 Vue Router 和 Vuex 升级到 4.0 版本,如果未安装则不会升级
  自动生成 Vue Router 和 Vuex 模板代码
  完成上述操作后,该项目正式升级到vue 3.0
*/

2.Vue 3.0基本特性体验(这里只说和2x版本的不同处)

// 2x 版本 router
import Vue from 'vue'
import VueRouter from 'vue-router'
import Home from '../views/Home.vue'

Vue.use(VueRouter)

const routes = [
  {
    path: '/',
    name: 'Home',
    component: Home
  },
  {
    path: '/about',
    name: 'About',
    // route level code-splitting
    // this generates a separate chunk (about.[hash].js) for this route
    // which is lazy-loaded when the route is visited.
    component: () => import(/* webpackChunkName: "about" */ '../views/About.vue')
  }
]

const router = new VueRouter({
  mode: 'history',
  base: process.env.BASE_URL,
  routes
})

export default router

// 3.0 版本 router(与2x的变化不大,只是之前采用构造函数的方式,这里改为使用createRouter来创建Vue Router实例)
import { createRouter, createWebHistory } from 'vue-router';
import Home from '../views/Home.vue'

const routes = [
  {
    path: '/',
    name: 'Home',
    component: Home
  },
  {
    path: '/about',
    name: 'About',
    // route level code-splitting
    // this generates a separate chunk (about.[hash].js) for this route
    // which is lazy-loaded when the route is visited.
    component: () => import(/* webpackChunkName: "about" */ '../views/About.vue')
  }
]

const router = createRouter({
  history: createWebHistory(process.env.BASE_URL),
  routes
})

export default router
// 2x 版本 store
import Vue from 'vue'
import Vuex from 'vuex'

Vue.use(Vuex)

export default new Vuex.Store({
  state: {
  },
  mutations: {
  },
  actions: {
  },
  modules: {
  }
})

// 3.0版本 store(与2x的变化不大,只是之前采用构造函数的方式,这里改为使用createStore来创建Vuex实例)
import Vuex from 'vuex'

export default Vuex.createStore({
  state: {
  },
  mutations: {
  },
  actions: {
  },
  modules: {
  }
});
.browserslist

根目录中多了一个.browserslist文件,可以指定项目的目标浏览器的范围
用于转译的 JavaScript 特性和添加CSS 浏览器前缀,可以减少兼容代码提高代码质量
如果想少一个文件,你也可以在package.json中添加browserslist字段,参数是一个数组

参数 说明
> 1% 全球超过1%人使用的浏览器
> 5% in US 使用美国使用情况统计,接受两个字母的国家/地区代码
> 5% in my stats 使用自定义使用数据
last 2 versions 所有浏览器兼容到最后两个版本根据CanIUse.com追踪的版本
Firefox ESR 火狐最新版本
Firefox > 20 指定版本范围
not ie <=8 方向排除部分版本
Firefox 12.1 指定浏览器版本
since 2013 2013年之后发布的所有版本
修改 store/index.js
import Vuex from 'vuex'

export default Vuex.createStore({
  state: {
    test: {
      a: 1
    }
  },
  mutations: {
    setTestA (state, value) {
      state.test.a = value
    }
  },
  actions: {
  },
  modules: {
  }
});

修改 views/About.vue
<template>
  <div class="test">
    <h1>test count: {{count}}</h1>
    <div>count * 2 = {{doubleCount}}</div>
    <div>state from vuex {{a}}</div>
    <button @click="add">add</button>
    <button @click="update">update a</button>
  </div>
</template>
 
<script>
import { ref, reactive, computed, watch, getCurrentInstance } from 'vue'
/*
  ref 赋值单个变量,使用要这样 count.value
  reactive 赋值对象,可直接使用
  computed 计算属性
  watch 监听变量
  getCurrentInstance 获取当前组件的实例方法
*/
export default {
  setup () {
    // ref
    const count = ref(0)
    const add = () => {
      count.value++
    }
    // reactive 
    const data = reactive({
      a: 1,
      b: 2,
      c: 3
    })
    console.log(data, data.a)
    // watch 
    watch(() => count.value, val => {
      console.log(`count is ${val}`)
    })
    // computed 
    const doubleCount = computed(() => count.value * 2)
    // getCurrentInstance 
    const { ctx } = getCurrentInstance()
    console.log(ctx.$router.currentRoute.value)
    const a = computed(() => ctx.$store.state.test.a)
    const update = () => {
      ctx.$store.commit('setTestA', count)
    }
    return {
      count,
      doubleCount,
      add,
      a,
      update
    }
  }
}
</script>

总结

vue 3.0都写在setup里,以前的所有数据状态都写在data里,
vue 2.0所有的方法都写在methods里,而现在可以根据功能模块把状态和方法划分在一起,更利于模块化。

Vue 3.0新文档网站。如果是 Vue 2.x 用户,访问迁移指南

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,088评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,715评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,361评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,099评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 60,987评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,063评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,486评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,175评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,440评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,518评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,305评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,190评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,550评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,880评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,152评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,451评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,637评论 2 335