• vue3入门(总结)


    序:

    经过了漫长的迭代,2020年9月18日,Vue.js发布3.0版本,代号:One Piece(海贼王)使用了Typescript 进行了大规模的重构,带来了Composition API RFC版本,类似React Hook 一样的写Vue,可以自定义自己的hooks

    1.Vue2对比于Vue3

    • TypeScript支持不友好(所有属性都放在了this对象上,难以推倒组件的数据类型)
    • 大量的API挂载在Vue对象的原型上,难以实现TreeShaking
    • 架构层面对跨平台dom渲染开发支持不友好
    • CompositionAPI。受ReactHook启发
    • vue3更方便的支持了 jsx
    • Template 不支持多个根标签
    • vue3对虚拟DOM进行了重写、对模板的编译进行了优化操作…

    2.Vue3优点

    2.1.性能的提升

    • 打包大小减少41%

    • 初次渲染快55%, 更新渲染快133%

    • 内存减少54%

    2.2.源码的升级

    • 使用Proxy代替defineProperty实现响应式

    • 重写虚拟DOM的实现和Tree-Shaking

    2.3.拥抱TypeScript

    • Vue3可以更好的支持TypeScript

    2.4.新的特性

    1. Composition API(组合API)

      • ​ setup()

      • ​ ref()

      • ​ reactive()、shallowReactive()

      • ​ isRef()

      • ​ toRefs()

      • readonly()、isReadonly()、shallowReadonly()

      • ​ computed()

      • ​ watch()

      • ​ LifeCycle Hooks(新的生命周期)

      • ​ Template refs

      • ​ globalProperties

      • ​ Suspense

      • ​ Provide/Inject

      • ​ …

    2. 新的内置组件

      • Fragment
      • Teleport
      • Suspense
    3. 其他改变

      • 新的生命周期钩子
      • data 选项应始终被声明为一个函数
      • 移除keyCode支持作为 v-on 的修饰符

    一、创建Vue3.0工程

    1.使用 vue-cli 创建

    官方文档

    ## 查看@vue/cli版本,确保@vue/cli版本在4.5.0以上
    vue --version
    ## 安装或者升级你的@vue/cli
    ## 升级一 npm i -g @vue/cli to update!
    ## 升级二 npm uninstall vue-cli -g (先卸载后安装)
    npm install -g @vue/cli
    ## 创建
    vue create v3-ts-team
    ## 启动
    cd vue_test
    npm run serve
    

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eH3tDROQ-1663692950473)(C:\Users\huawei\AppData\Roaming\Typora\typora-user-images\image-20220810222758702.png)]

    一些选择:

    ?Check the features needed for your project:

    Choose Vue version(选择VUE版本)
    Babel(JavaScript 编译器,可将代码转换为向后兼容)
    TypeScript(编程语言,大型项目建议使用)
    Progressive Web App (PWA) Support-APP使用
    Router(路由)
    Vuex(Vuex)
    CSS Pre-processors(css预处理)
    Linter / Formatter(代码风格/格式化)
    Unit Testing(单元测试)
    E2E Testing(e2e测试)

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZMIgkX1S-1663692950475)(C:\Users\huawei\AppData\Roaming\Typora\typora-user-images\image-20220810223604589.png)]

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vbEtqPdw-1663692950475)(C:\Users\huawei\AppData\Roaming\Typora\typora-user-images\image-20220810223958019.png)]

    2.使用 vite 创建

    vue官方文档 vite官网

    • 什么是vite?—— 新一代前端构建工具。
    • 优势如下:
      • 开发环境中,无需打包操作,可快速的冷启动。
      • 轻量快速的热重载(HMR)。
      • 真正的按需编译,不再等待整个应用编译完成。
    ## 创建工程
    npm init vite-app <project-name>
    ## 进入工程目录
    cd <project-name>
    ## 安装依赖
    npm install
    ## 运行
    npm run dev
    

    二、常用 Composition API

    官方文档

    1.setup()

    1. setup是所有Composition API(组合API)“ 表演的舞台 ”
    2. 组件中所用到的:数据、方法等等,均要配置在setup中。
    3. setup函数的两种返回值:
      1. 若返回一个对象,则对象中的属性、方法, 在模板中均可以直接使用。(重点关注!)
      2. 若返回一个渲染函数:则可以自定义渲染内容。(了解)
    4. 注意点:
      1. 尽量不要与Vue2.x配置混用
        • Vue2.x配置(data、methos、computed…)中可以访问到setup中的属性、方法。
        • 但在setup中不能访问到Vue2.x配置(data、methos、computed…)。
        • 如果有重名, setup优先。
      2. setup不能是一个async函数,因为返回值不再是return的对象, 而是promise, 模板看不到return对象中的属性。(后期也可以返回一个Promise实例,但需要Suspense和异步组件的配合)
      3. setup 函数会在 beforeCreatecreated 之前执行, vue3也是取消了这两个钩子,统一用setup代替, 该函数相当于一个生命周期函数,vue中过去的datamethodswatch等全部都用对应的新增api写在setup()函数中
    setup(props, context) {
        // Attribute (非响应式对象,等同于 $attrs)
        context.attrs
        // 插槽 (非响应式对象,等同于 $slots)
        context.slots
        // 触发事件 (方法,等同于 $emit)
        context.emit
        // 暴露公共 property (函数)
        context.expose
        
        return {}
      }
    
    • props: 用来接收 props 数据, props 是响应式的,当传入新的 props 时,它将被更新。
    • context 用来定义上下文, 上下文对象中包含了一些有用的属性,这些属性在 vue 2.x 中需要通过 this 才能访问到, 在 setup() 函数中无法访问到 this,是个 undefined
    • context 是一个普通的 JavaScript 对象,也就是说,它不是响应式的,这意味着你可以安全地对 context 使用 ES6 解构。
    • 返回值: return {}, 返回响应式数据, 模版中需要使用的函数

    注意: 因为 props 是响应式的, 你不能使用 ES6 解构,它会消除 prop 的响应性。不过你可以使用如下的方式去处理

    <script lang="ts">
    import { defineComponent, reactive, ref, toRefs } from 'vue';
    export default defineComponent({
      setup(props, context) {
      
        const { title } = toRefs(props)
        
        console.log(title.value)
        
        return {}
      }
    });
    </script>
    

    如果 title 是可选的 prop,则传入的 props 中可能没有 title 。在这种情况下,toRefs 将不会为 title 创建一个 ref 。你需要使用 toRef 替代它:

    <script lang="ts">
    import { defineComponent, reactive, toRef, toRefs } from 'vue';
    export default defineComponent({
      setup(props, context) {
      
        const { title } = toRef(props, 'title')
        
        console.log(title.value)
        
        return {}
      }
    });
    </script>
    

    2.ref()

    • 作用: 定义一个响应式的数据
    • 语法: const xxx = ref(initValue)
      • 创建一个包含响应式数据的引用对象(reference对象,简称ref对象)
      • JS中操作数据: xxx.value
      • 模板中读取数据: 不需要.value,直接:
        {{xxx}}
    • 备注:
      • 接收的数据可以是:基本类型、也可以是对象类型。
      • 基本类型的数据:响应式依然是靠Object.defineProperty()getset完成的。
      • 对象类型的数据:内部 “ 求助 ” 了Vue3.0中的一个新函数—— reactive函数。
    <template>
        <div class="mine">
            {{count}} // 10
        </div>
    </template>
    
    <script lang="ts">
    import { defineComponent, ref } from 'vue';
    export default defineComponent({
      setup() {
        const count = ref<number>(10)
        // 在js 中获取ref 中定义的值, 需要通过value属性
        console.log(count.value);
        return {
           count
        }
       }
    });
    </script>
    

    3.reactive()

    • 作用: 定义一个对象类型的响应式数据(基本类型不要用它,要用ref函数)
    • 语法:const 代理对象= reactive(源对象)接收一个对象(或数组),返回一个代理对象(Proxy的实例对象,简称proxy对象)
    • reactive定义的响应式数据是“深层次的”。
    • 内部基于 ES6 的 Proxy 实现,通过代理对象操作源对象内部数据进行操作。

    reactive() 函数接收一个普通对象,返回一个响应式的数据对象, 相当于 Vue 2.x 中的 Vue.observable() API,响应式转换是“深层”的——它影响所有嵌套属性。基于proxy来实现,想要使用创建的响应式数据也很简单,创建出来之后,在setupreturn出去,直接在template中调用即可