## Vue 3 ### 1.环境搭建 **vue3项目创建** > node版本要在15.0或更高版本 ```shell npm install vue@latest ``` 这个指令将会安装并执行`create-vue`,它是Vue官方的项目脚手架工具。 > 创建时名称不要有大写 **开发环境** `VScode` + `volar`插件 ### 2.Vue API 风格 > vue的组件可以按两种不同的风格书写:**选项式API(vue2)** 和 **组合式API(vue3)** > 大部分的核心概念在两种风格之间都是通用的。 **选项式API(Options API)** 使用选项式API,我们可以用包含多个选项的对象来描述组件的逻辑,例如`data`、`methods`、`created`、`mounted`、`computed`。选项所定义的属性都会暴露在函数内部的`this`上,它会指向当前的组件实例。 ### 3.组合式API #### 3.1 setup函数 - setup函数的执行时机:beforeCreate钩子之前 自动执行 - setup写代码的特点是:定义数据 + 函数 然后以对象方式return 后才可以在模板中使用 - ` ``` - ref()函数:声明基础数据类型的值, ```html ``` #### 3.3 计算属性 `computed` 计算属性函数,基本思想和vue2的完全一致,组合式API下的计算属性只是修改了写法: ````html ```` 注意: 1. 计算属性中不应该有“副作用”,比如异步请求或是修改dom 2. 计算属性应该是只读的,避免直接修改计算属性的值 #### 3.4 watch 作用:侦听*一个或者多个数据* 的变化,数据(响应式的数据)变化时执行回调函数,额外参数: 1. `immediate`:立即执行 2. `deep`:深度侦听 > deep 默认机制:通过watch监听的ref对象默认是千层监听的,直接修改嵌套的对象属性不会触发回调执行,需要开启deep选项 **精确监听** ````html ```` #### 3.5 生命周期函数 Vue3中生命周期API(选项式 VS 组合式) | 选项式API | 组合式API | | :------------------: | :-------------: | | beforeCreate/created | setup | | beforeMount | onBeforeMount | | mounted | onMounted | | beforeUpdate | onBeforeUpdate | | updated | onUpdated | | beforeUnmount | onBeforeUnmount | | unmounted | onUnmounted | 可多次执行函数 ```html ``` #### 3.6 组件通信 **父传子** 基本操作: 1. 父组件中给子组件绑定属性 2. 子组件内部通过**props**选项接收 ```html ``` ```html ``` > 如果父组件传入的是响应式数据,则数据变化,子组件接受的数据也会变化 扩展:利用ts的泛型限定传参类型,**message参数为必传,arr为可选**。 ```html ``` **子传父** 基本操作: 1. 父组件中给子组件标签通过`@`绑定事件 2. 子组件内部通过`$emit`方法触发事件 ```html ``` ```html ``` #### 3.7 模版引用 通过`ref标识`获取真实的dom对象或者**组件实例对象**。 示例: ```html ``` `defineExpose()` 默认情况下在` ``` #### 3.8 provide和inject 作用和场景:**顶层组件向任意的底层组件传递数据和方法,实现跨层组件通信**。 基本操作: 1. 顶层组件通过`provide`函数提供数据 ```javascript // 传递的过程中保持响应式,传入ref对象 provide('key',顶层组件中的数据) ``` 2. 底层组件通过`inject`函数获取数据 ```javascript const message = inject('key') ``` **跨层传递方法** 场景:在底层组件需要修改顶层组件的数据,但单向数据流的原则,不建议直接修改传过来的数据。可以通过在顶层组件中提供一个修改数据的方法,传递给底层组件让其调用来修改数据。(谁的数据就由谁修改) 顶层组件: ```javascript const setCount = ()=>{ count.value++ } provide('setCount-key',setCount) ``` 底层组件: ```javascript const setCount = inject('setCount-key') ``` #### 3.9 获取组件实例 `getCurrentInstance` 的返回值是一个组件实例对象. - 可以通过 `.ctx` 来访问该实例的上下文对象; - 者通过 `.proxy `来访问该实例的代理对象。 两者的区别在于,通过` .ctx `访问的是真实的组件实例,而通过 `.proxy` 访问的是一个代理对象,该代理对象可以在模板中直接使用。 > getCurrentInstance 只能在 setup 或生命周期钩子中使用 ```javascript import { getCurrentInstance, onMounted} from 'vue' export default { setup() { onMounted(() => { const instance = getCurrentInstance() console.log('实例', instance) }) return {} } } ```