zoukankan      html  css  js  c++  java
  • 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
    来源:掘金
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
  • 相关阅读:
    java Activiti 工作流引擎 SSM 框架模块设计方案
    自定义表单 Flowable 工作流 Springboot vue.js 前后分离 跨域 有代码生成器
    数据库设计的十个最佳实践
    activiti 汉化 stencilset.json 文件内容
    JAVA oa 办公系统模块 设计方案
    java 考试系统 在线学习 视频直播 人脸识别 springboot框架 前后分离 PC和手机端
    集成 nacos注册中心配置使用
    “感恩节 ”怼记
    仓颉编程语言的一点期望
    关于System.out.println()与System.out.print("\n")的区别
  • 原文地址:https://www.cnblogs.com/qiunanyan/p/14498638.html
Copyright © 2011-2022 走看看