vue 3.0 的初次体验

4月份的时候尤雨溪在B站直播了vue3.0的beta,虽说我没看,但也来跟大家瞎聊下

3.0对比一2.0的区别:
1.Performance //性能
2.Tree-shaking support //通过分析,可以使你代码里没有使用的代码全部删除,简单粗暴点就是代码优化工具,想了解自行百度
3.Composition API //特色语法
4.Fragment, Teleport, Suspense //“碎片”,Teleport即Protal传送门,“悬念”
5.Better TypeScript support //TypeScript支持度
6.Custom Renderer API //自定义rende

了解了大概的新内容,就让我们直接来搭建个项目看看吧!

先初始化一个vue2.0项目

1、安装vue-cli:

npm install -g @vue/cli

可以输入vue -V查看版本

vue -V

现在安装下来的话是@vue/cli 4.3.1版本
2、初始化 vue 项目:

vue create 你的项目名称

确认后:我们选择Manually select feature手动

Please pick a preset: 
  default (babel, eslint)  //自动
❯ Manually select features  //手动

随后勾选我们开发常用的:Router、Vuex、CSS Pre-processors 和 Linter / Formatter,

Vue CLI v4.3.1
? Please pick a preset: Manually select features
? Check the features needed for your project: 
 ◉ Babel
 ◯ TypeScript
 ◯ Progressive Web App (PWA) Support
 ◉ Router
 ◉ Vuex
 ◉ CSS Pre-processors
❯◉ Linter / Formatter
 ◯ Unit Testing
 ◯ E2E Testing

剩下就是vue-cli起步的步骤了:如果不知道可以参考文章:(https://www.jianshu.com/p/ae3fc27eb2c2)
为什么要说到vue-cli起步项目是因为vue3.0必须是从vue2.0升级而来,过程为了不再手动安装Router 和 Vuex,所以在过程中就要勾选这两个

升级到vue3.0

升级3.0需要通过插件的形式来升级,在项目里的命令行输入

vue add vue-next

然后就会自动安装(vue-cli-plugin-vue-next) 插件:

插件操作内容

然后理论哔哔和项目升级完了咱就来玩玩,体验下吧!

vue3.0的新特性体验

我们先来在/src/views下创建一个test.vue文件

<template>
  <div class="test">
      <div>vue3.0体验</div>
  </div>
</template>

<script>
 export default {
 }
</script>
<style lang="less" scoped>
.test {
  color: #999;
}
</style>

然后在router里面加入路由

import { createRouter, createWebHistory } from 'vue-router'
const routes = [
  {
    path: '/about',
    name: 'About',
    component: () => import(/* webpackChunkName: "about" */ '../views/About.vue')
  },
  {
    path: '/test',
    name: 'Test',
    component: () => import(/* webpackChunkName: "test" */ '../views/Test.vue')
  }
]
const router = createRouter({
  history: createWebHistory(process.env.BASE_URL),
  routes
})
export default router

2.0版本的Router 与 3.0 版本变化不大,只是之前采用构造函数的方式,
这里改为使用 createRouter 来创建 Vue Router 实例,使用方法一样
配置完成我们在 App.vue 中给Test.vue 的页面一个入口:

<template>
  <div id="app">
    <div id="nav">
      <router-link to="/about">About</router-link> | 
      <router-link to="/test">Test</router-link> | 
    </div>
    <router-view/>
  </div>
</template>

然后运行即可

npm run serve

状态和事件绑定

在vue3.0里的定义状态不在是data()里面了,而是通过 setup 方法去定义状态,然后通过return把状态抛出去。
然后定义状态需要通过调用ref去定义,我们先来在test.vue里写个简单的累加器试试

<template>
  <div class="test">
     <h1>vue3.0</h1>
      <div>{{count}}</div>
      <div>{{hhhh}}</div>
      <button @click="add">add</button>
      <button @click="theNot">---</button>
  </div>
</template>

<script>
import { ref , } from 'vue'
 export default {
    setup () {
      const hhhh = ref(false)
      const count = ref(0)
      const add = () => {
        count.value++
      }
      const theNot= () => {
        hhhh.value = !hhhh.value
      } 
      return {
        count,
        hhhh,
        theNot,
        add
      }
    },
 }
</script>

很明显,3.0的方法和事件都不用再写在methods中。而是全部都在setup方法中里面声明,但我也试了一下以前的data定义状态个methods写事件还是可以兼容的。
然后补充一个定义状态的的方式就是reactive,这个和ref同样是定义状态的,只不过写法不一样而已,通过一个案例来了解下吧。

<template>
  <div class="ref">
      <h2>{{count}}</h2>
      <h2>{{pos.countA}}</h2>
      <h2>{{pos.countB}}</h2>
      <button @click="add">+++</button>
      <div>
        <button @click="subtraction">---</button>
      </div>
  </div>
</template>

<script>
import {reactive,ref} from 'vue'
 export default {
    //ref修改数据需要使用这样count.value=xxx的形式,而reactive只需要state.reactiveField=值这样来使用
    setup() {
        const pos  = reactive({ countA: 0,countB: 100 }) //refreactive
        const count = ref("单个")  //ref只能监听一些如数字、字符串、布尔之类的简单数据
        const add = () => { 
            pos.countA++;
        }
        const subtraction = () => {
            pos.countB-=2;
        }
        return { 
            count,
            pos,
            add,
            subtraction
        }
    },
 }
</script>

通过案例可以看出来,ref是定义单个状态,而reactive可以通过对象来定义多个状态,而ref改变数据需要(状态).value=xxx,reactive则可以通过state.reactiveField=值来操作。

计算属性和监听器

然后再说说vue3.0的computed 和 watch 方法:

<template>
  <div class="test">
      <div>{{count}}</div>
      <button @click="add">add</button>
      <div>count * 2 = {{doubleCount}}</div>
  </div>
</template>

<script>
import { ref , computed, watch } from 'vue'
 export default {
    setup () 
      const count = ref(0)
      const add = () => {
        count.value++
      }
      //第一个参数是监听的值,count.value 表示当 count.value 发生变化就会触发监听器的回调函数,即第二个参数可以执行监听时候的回调
      watch(() => count.value, val => {
        console.log(`count is ${val}`)
      })
      const doubleCount = computed(() => count.value * 2)
      //计算属性 computed 是一个方法,里面需要包含一个回调函数,当我们访问计算属性返回结果时,会自动获取回调函数的值:
      return {
        count,
        doubleCount,
        add
      }
    },
 }
</script>
获取路由

3.0 中通过 getCurrentInstance 方法获取当前组件的实例,然后通过 ctx 属性获得当前上下文,
ctx.$router 是 Vue Router 实例,里面包含了 currentRoute 可以获取到当前的路由信息

<script>
  import { getCurrentInstance } from 'vue'
  export default {
    setup () {
      const { ctx } = getCurrentInstance()
      console.log(ctx.$router.currentRoute.value)
    }
  }
</script>
Vuex 集成
<template>
  <div class="test">
      <div>{{count}}</div>
      <button @click="add">add</button>
      <div>state from vuex {{a}}</div>
      <button @click="take">take a</button>
  </div>
</template>

<script>
import { ref, computed, watch, getCurrentInstance } from 'vue'
 export default {
    setup () {
      const count = ref(0)
      const add = () => {
        count.value++
      }
      const { ctx } = getCurrentInstance()
      const a = computed(() => ctx.$store.state.test.a)
      //通过getCurrentInstance()方法获取实例,从而
      const take= () => {
        ctx.$store.commit('setTestA', count)
      }
      //Vuex 状态仍然使用 commit 方法,
      return {
        count,
        add,
        take,
        a
      }
    },
 }
</script>

vuex的操作其实和2.0是没太大差别的,只不过3.0的实例获取得通过getCurrentInstance()方法

总结时间

1、vue3.0是通过 createRouter 来创建 Vue Router 实例。
2、vue3.0定义状态和事件、计算属性都是写在setup里,以前数据状态都写在data里,事件写在methods中,但是测试以前的写法还是兼容。
3、3.0的状态定义要通过ref和reactive来定义,两者区别只在于写法不一样。
4、vuex的操作操作和定义属性和2.0无区别,但实例获取要通过getCurrentInstance()方法来获取

皮毛了解到此吧,拜拜!👋👋👋

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