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
    来源:掘金
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
  • 相关阅读:
    如何删除PeopleSoft Process Definition
    你真的了解PeopleSoft中的function和method方法嘛
    PeopleCode事件和方法只用于online界面不能用于组件接口(component interface)
    Lucene.Net 3.0.3如何从TokenStream中获取token对象
    从零开始搭建一个简单的基于webpack的vue开发环境
    Vue路由懒加载
    减少打包组件vue.config.js——Webpack的externals的使用
    axios全局配置及拦截器
    vue-cli中eslint配置
    DDD领域驱动设计基本理论知识总结
  • 原文地址:https://www.cnblogs.com/qiunanyan/p/14498638.html
Copyright © 2011-2022 走看看