Vue3 快速掌握,了解常用新特性(适用于会 Vue2.0 开发的)(上)

简介: Vue3 快速掌握,了解常用新特性(适用于会 Vue2.0 开发的)

一、Vue3Vue2 的区别

  • 新加了组件:FragmentTeleportSuspense
  • 语法 v-on.native 修饰符被移除,不在支持。
  • Vue3template 中,不再需要唯一的根元素,如果这么使用报错可能是 ESLint 没有配置好或版本太低不支持这种写法。
<template>
  <div>123</div>
  <div>456</div>
</template>
  • 全局导入方式调整
// vue - main.js
import { createApp } from 'vue'
createApp(App).use(store).use(router).mount('#app')
// vuex
import { createStore } from 'vuex'
export default createStore({ ... })
// vue-router
import { createRouter, createWebHistory, RouteRecordRaw } from 'vue-router'
const routes: Array<RouteRecordRaw> = []
export default createRouter({
  history: createWebHistory(process.env.BASE_URL),
  routes
})
...
  • Vue3 支持 Vue2 生命周期的使用
  • 生命周期对比
Vue2 Vue3 含义 区别
beforeCreate() setup() 创建前,datael 并未初始化 Vue3 中被 setup() 替代
created() setup() 创建完毕,data 数据完成初始化,el 没有 Vue3 中被 setup() 替代
beforeMount() onBeforeMount() 挂载前,datael 完成初始化
mounted() onMounted() 挂载结束,完成挂载,渲染页面
beforeUpdate() onBeforeUpdate() 更新前
updated() onUpdated() 更新完成
beforeDestroy() onBeforeUnmount() 销毁前 Vue3 中被改名
destroyed() onUnmounted() 销毁完成 Vue3 中被改名
errorCaptured() onErrorCaptured() 异常捕获
onRenderTracked() 虚拟 dom 重新渲染 Vue3 新增,只有在调试的时候有用,生产环境会忽略
onRenderTriggered() 虚拟 dom 重新渲染,输出更详细准确的数据 Vue3 新增,只有在调试的时候有用,生产环境会忽略

  • 以前自带的方法可以直接使用,现在需要通过 import 引入之后才可以进行使用
import {
  ref,
  reactive,
  onMounted,
  onUpdated,
  onUnmounted, 
  onBeforeMount, 
  onBeforeUpdate,
  onBeforeUnmount
  ...
} from 'vue'

二、setup 函数

  • setup 函数中,不能使用 thisthis 指向的是 undefined
  • setup 只会在组件初始化的时候执行一次,执行顺便对比:
beforeCreate () {
  console.log('---- beforeCreate')
},
created () {
  console.log('---- created')
},
setup () {
  console.log('---- setup')
}
// 输出顺序:
// ---- setup
// ---- beforeCreate
// ---- created
  • 参数分析
setup(props ,context) {  }
  • props 为一个对象,内部包含了父组件传递过来的所有 prop 数据。
  • context 对象包含了 attrsslotsemit属性。
  • 属性、函数的优先级、生命周期的调用先后
  • 一样的属性与函数,Vue3 的会覆盖 Vue2 的。
  • 同一个生命周期函数 Vue3 的先调用,Vue2 的后调用,不会覆盖 Vue2 的。
<template>
  <div @click="touchButton">{{ sex }}</div>
</template>
<script>
import { defineComponent, ref, onMounted } from 'vue'
export default defineComponent({
  // vue2
  data() {
    return {
      sex:'男'
    }
  },
  // vue2
  mounted () {
    console.log('mounted - vue2')
  },
  // vue3
  setup() {
    // 比 vue2 优先调用
    onMounted(() => {
      console.log('onMounted - vue3')
    })
    // 优先使用这个,会覆盖 vue2 中的 touchButton 方法
    function touchButton () {
      console.log('touchButton - vue3')
    }
    // 优先使用这个,会覆盖 vue2 中的 sex 值
    const sex = ref('女')
    return {
      sex,
      touchButton
    }
  },
  // vue2
  methods: {
    touchButton () {
      console.log('touchButton - vue2')
    }
  }
})
</script>

三、ref 函数(响应式数据 方式一)

  • setup 中使用时,要加 .value,模板中使用的时候不需要加 .value
  • 包装简单数据类型
<template>
  <!-- 模板中使用 -->
  <div @click="touchButton">{{ sex }}</div>
</template>
<script>
import { defineComponent, ref } from 'vue'
export default defineComponent({
  setup () {
    // 定义响应式属性
    const sex = ref('女')
    // 点击按钮
    function touchButton () {
      // 修改值时,需要加上 .value
      sex.value = '男'
    }
    // 定义的属性或函数需要 return 出去才会生效
    return {
      sex,
      touchButton
    }
  }
})
</script>
  • 包装复杂数据类型
<template>
  <!-- 模板中使用 -->
  <div @click="touchButton">{{ user.job.salary  }}</div>
</template>
<script>
import { defineComponent, ref } from 'vue'
export default defineComponent({
  setup () {
    // 定义响应式属性
    const user = ref({
      id: 1,
      name: 'dzm'
    })
    // 中途添加字段
    user.value.job = { salary: 10 }
    // 点击按钮
    function touchButton () {
      // 修改值时,需要加上 .value
      user.value.job.salary += 1
    }
    // 定义的属性或函数需要 return 出去才会生效
    return {
      user,
      touchButton
    }
  }
})
</script>

四、reactive 函数(响应式数据 方式二)

  • refreactive都是用来定义响应式数据的,reactive推荐去定义复杂数据类型,ref推荐定义基本类型。
  • ref 包装的简单数据(例如:number),可以被监听,可以被修改。
  • reactive 包装简单数据(例如:number),会报警告,且不能直接被修改。
  • ref 包装的复杂数据(例如:json),不可以被监听,可以新增、修改字段。
  • reactive 包装的复杂数据(例如:json),可以被监听,可以新增、修改字段。
  • 下面 十一、 中有介绍 reactiveshallowReactive 函数的使用区别。
<template>
  <!-- 模板中使用 -->
  <div @click="touchButton">{{ user.name }}</div>
</template>
<script>
import { defineComponent, reactive } from 'vue'
export default defineComponent({
  setup () {
    // 定义响应式属性
    const user = reactive({
      id: 1,
      name: 'dzm'
    })
    // 点击按钮
    function touchButton () {
      // 修改值
      user.name = 'xyq'
    }
    // 返回
    return {
      user,
      touchButton
    }
  }
})
</script>
相关文章
|
3天前
|
JavaScript 容器
乾坤qiankun框架搭建 主应用为vue3的项目。
乾坤qiankun框架搭建 主应用为vue3的项目。
20 2
|
3天前
|
JavaScript
vue3 生命周期
【10月更文挑战第14天】vue3 生命周期
|
4天前
|
JavaScript 前端开发
Vue 2 和 Vue 3 之间响应式区别
10月更文挑战第7天
18 2
|
5天前
|
存储 前端开发 中间件
vue3之vite配置vite-plugin-mock使用mock轻松创建模拟数据提高开发效率
vue3之vite配置vite-plugin-mock使用mock轻松创建模拟数据提高开发效率
28 0
|
3天前
|
JavaScript 前端开发 API
深入探索挖掘vue3 生命周期
【10月更文挑战第10天】
13 0
|
2天前
|
缓存 JavaScript 前端开发
《基础篇第4章:vue2基础》:使用vue脚手架创建项目
《基础篇第4章:vue2基础》:使用vue脚手架创建项目
12 3
|
5天前
|
JavaScript 前端开发 开发者
Vue v-for 进阶指南:in 与 of 的区别及应用场景 | 笔记
Vue.js 中的 v-for 是强大的遍历指令,但其中的 in 和 of 关键字往往被开发者忽视。尽管它们的用法相似,但适用的场景和数据结构却各有不同。本文将详细探讨 v-for 中 in 和 of 的区别、适用场景以及在实际开发中的最佳使用时机。通过理解它们的差异,你将能够编写更加高效、简洁的 Vue.js 代码,灵活应对各种数据结构的遍历需求。
40 6
|
2天前
|
缓存 JavaScript
Vue 中 computed 与 method 的区别
【10月更文挑战第15天】computed 和 method 是 Vue 中两个重要的选项,它们在功能和特点上存在着明显的区别。理解并合理运用它们的区别,可以帮助我们构建更高效、更具可维护性的 Vue 应用。在实际开发中,要根据具体情况灵活选择使用,以满足不同的需求。
5 2
|
2天前
|
JavaScript 搜索推荐 UED
vue的自定义指令
【10月更文挑战第14天】Vue 自定义指令为我们提供了一种强大的工具,使我们能够更灵活地控制和扩展 Vue 应用的行为。通过合理地使用自定义指令,可以提高开发效率,增强应用的功能和用户体验。
|
3天前
|
JavaScript