Vue3.0 && Vue3.0初体验 一

vue2.x -> vue3.0 变化

Vue3.0 可以完全支持Vue2.0!!!!, 升级以后不需要更改关于Vue的代码,但是你引用的插件就...,看运气了.

在说变化之前,我们先看一下vue3.0怎么创建项目.

第一种方法:vite

npm init vite-app 项目名
cd 项目名
npm run dev
复制代码

优点: 快就完了. (不需要通过webpack编译)
缺点: 不稳定,还要需要自己安装 vue-router, vuex, (敲重点,vue-router, vuex都要用4.0, 安装的时候还容易出错, enenen,出错肯定是我电脑问题, 和vite没有关系.... 不稳定也是个人感觉,大家可以试一下,vite应该还是很好用的,不然尤大大也不会连发6条微博来证明

第二种方法

npm install -g @vue/cli
vue create 项目名
cd 项目名
vue add vue-next //重点 执行这行,会把2.0代码改为3.0的, vue-router, vuex会变成4.0的
npm run serve
复制代码

这个优缺点就不说了, 毕竟大家都是老手!

变化一 mian.js

mian.js里的变了 多了createApp方法

import { createApp } from 'vue';
import App from './App.vue';
import router from './router';
import store from './store';
import './App.scss'

const app = createApp(App)
app.use(router).use(store).mount('#app');
复制代码

由于这里用了 import { createApp } from 'vue'; 而不是import Vue from 'vue', 所有使用一些Ui框架,以及第三方的包都会报以下的错. 遇到这个报错,基本上就说明你用的这个插件不支持Vue3.0了.

变化二 Vue-router, Vuex

Vue-router, Vuex 有点小变化, 后面第二章再讲,或者也可以看一下我的源码, 你们都是大牛,你们一定可以一下子就可以看出来区别.

变化三 template模板部分

vue2.0里 template模板里只能有一个根标签, 而3.0可以使用多个根标签

Look here, template标签有两个div, 在2.0是会报错的

变化四 Composition API

在vue2.0里我们都把.vue文件里的js部分叫做Function API, 而在3.0里变为Composition API 这里是变化最大的地方,快看下图 (敲重点: import { setup, watch, reactive, toRefs, onMounted } from "vue")

看到这里有何感想。en, 我们还没有开始, 重点,Vue3.0新特性来了。

Composition API 是什么

setup 函数

setup 函数是一个新的Vue组件, 是Composition API 入口
<template>
</template>
<script>
import { setup } from 'vue'
export default {
   setup(props, context) {
       //这里的props大家应该知道是啥吧,父组件传的值
       // context是什么?
       //在setup()里我们不能用this
       //所以vue2.0里的 this.$emit, this.$psrent, this.$refs在这里都不能用了。
       //context就是对这些参数的集合
       //context.attrs
       //context.slots
       //context.parent 相当于2.0里 this.$psrent
       //context.root 相当于2.0里 this
       //context.emit 相当于2.0里 this.$emit
       //context.refs 相当于2.0里 this.$refs
       ...
   }
}
</script>
<style>
</style>
复制代码

数据声明

vue2.0 里数据都是在data()里声明, 而在3.0里也取消了data(), 引用了Reactive(), ref()

ref() 声明单一基础数据类型时使用

注意: 定义的变量,函数都要 return 出来
 <template>
  <div>{{count}}</div>
</template>
<script>
 import { setup, ref } from 'vue'
 export default {
    setup(props, context) {
        let count = ref(0)
        console.log(count.value) //0 ,  内部获取时需要用.value来获取
        console.log(isRef(count)) //true   //isRef() 用来判断是不是ref对象
     return {
         count  // ref返回的是一个响应式的对象
     }
    }
 }
</script>
<style>
</style>

复制代码
Reactive() 声明单一对象时使用
<template>
 <div>{{data1}}</div>
</template>
<script>
import { setup, Reactive } from 'vue'
export default {
   setup(props, context) {
        const obj = reacttive({
        data1: '123',
        data2: {}
    })
    
    return {
        ...torefs(obj)// 把obj转为响应式的ref,不然template里获取不到
    }
   }
}
</script>
<style>
</style>

复制代码

watchEffect() 监听props

// 父组件.vue
<template>
   <ZiComp val:'1'/>
</template>
<script>

import ziComp from './ziComp.vue'
export default {
  components: {
      ziComp
  }, //components方法也是和2.0相同
  setup(props, context) {
      
  }
}
</script>
-------------------------------------- 
//ziComp.vue
<template>
 <div>{{obj.data1}}</div>
</template>
<script>
import { Reactive } from 'vue'
export default {
  props: ['val'], //这里获取props和 2.0 一样,也可以用对象形式
  setup(props, context) {
     watchEffect(() => {  //首次和props改变才会执行这里面的代码
         console.log(props.val)
     })
  }
}
</script>
<style>
</style>
复制代码

watch() 监听器

监听单个数据
<template>
<div>{{count}}</div>
</template>
<script>
import { Reactive } from 'vue'
export default {
  setup(props, context) {
   let count1 = ref(0)
   let state = reactive({
      count2: 0
   )
    //监听reactive类型
   watch(
   () => state.count2, //这里是你要监听的数据
   (count, preCount) => { //count新值, preCount旧值
       console.log('') //这里是监听数据变化后执行的函数
   }, {lazy: false}//在第一次创建不监听)
   
   //监听ref类型
     watch(count1,(count, preCount) => { //count新值, preCount旧值
       console.log('') //这里是监听数据变化后执行的函数
     })
   
   return {
       count
       ...toRefs(state)
   }
  }
}
</script>
<style>
</style>

复制代码
监听多个数据
<template>
<div>{{count}}</div>
</template>
<script>
import { setup, Reactive } from 'vue'
export default {
  setup(props, context) {
   let count1 = ref(0)
    let name1 = ref(0)
   let state = reactive({
      count2: 0,
      name2: 'yangy'
   )
    //监听多个reactive类型
   watch(
       [() => state.count2, () => state.name2]
       ([count, name], [preCount, preName]) => { //count新值, preCount旧值
           console.log('') //这里是监听数据变化后执行的函数
       }, 
       {
          lazy: false
   })//在第一次创建不监听
   
   //监听ref类型
  watch(
       [count2, name2]
       ([count, name], [preCount, preName]) => { //count新值, preCount旧值
           console.log('') //这里是监听数据变化后执行的函数
       }, {lazy: false}//在第一次创建不监听)
   
   return {
       count,
       ...toRefs(state)
   }
  }
}
</script>
<style>
</style>

复制代码

computed() 计算属性 可创建只读,和可读可写两种

<template>
<div>{{addCount}}</div>
<div>{{addCount2}}</div>
</template>
<script>
import { setup, Reactive } from 'vue'
export default {
  setup(props, context) {
   let count = ref(0)
   
  setup () {
      const count = ref(0)
      const addCount = computed(() => count.value + 1) //只读 ,count.value变化后执行加1
      
      const addCount2 = computed({
          get:() => count.value + 1,
          set: (value) => count.value = value 
      })    
      // addCount2.value = 10   //赋值方法
      
     return {
         count,
         addCount,
         addCount2
     }
  }
  }
}
</script>
<style>
</style>

作者:YangY在掘金
链接:https://juejin.cn/post/6847902215458258958
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
posted @ 2021-03-08 11:15  Christianೄ೨  阅读(136)  评论(0编辑  收藏  举报