Vue3带来了:
官方文档:https://v3.cn.vuejs.org/guide/installation.html#vite
vite官网:https://vitejs.cn
VUE3官方文档
## 查看@vue/cli版本,确保@vue/cli版本在4.5.0以上
vue --version
## 安装或者升级你的@vue/cli
npm install -g @vue/cli
## 创建
vue create vue_test
## 启动
cd vue_test
npm run serve
setup是所有Composition AIP(组合API)“表演的舞台”。
setup
中,不需要专门的data
、methods
等配置项了。setup()执行的时机是先于beforecreated
的,此时vue实例尚未创建,因此setup()函数内部this
为undefined
。
setup()可以接收两个参数:
this.$attrs
this.$slots
this.$emit
在vue2中,通过Object.defineProperty()
对对象属性的读取、修改进行了拦截(数据劫持)。对数组类型,通过重写数组更新的一系列方法实现拦截,对其变更方法进行了包裹。
这种响应式实现存在以下问题:
在setup中安置的数据项并不会直接被vue监测,如果想要使其被vue监测,实现响应式的更新,应该使用ref
函数,其作用是定义一个响应式的数据的引用对象(reference object)
使用ref
函数构建的数据项类型是一个RefImpl
引用实现类型,对RefImpl
对象的value
属性更新,对于Vue框架是可见的,但在模板中使用其时,不必加value属性,Vue框架会自动解析到其中的value。
ref函数的参数也可以是一个对象,如果是对象,其value
属性是一个Proxy
对象,拥有原对象的每一个属性,对其的修改也是响应式的。
reactive函数的作用是定义一个对象(数组)类型的
响应式数据,基本类型用ref
,reactive
只能处理对象类型的数据。
语法:const 代理对象 = reactive(源对象)
接收一个对象或数组,返回其代理对象(Proxy实例)
reactive定义的响应式数据是深层次的,即对其多层数据的更改同样是响应式。
1、从定义数据角度:
reactive
转为代理对象。Object.defineProperty()
的get与set实现响应式(数据劫持)Proxy
实现响应式,并通过Reflect
操作源对象内部的数据。3、从使用角度:
.value
,模板使用不需要.value
.value
Vue3中的computed不再是内置选项,需要import导入,随后在setup()中配置,配置方式与Vue2中基本一致。
watch属性在Vue3的组合式API中,也不再是内置属性,在需要使用时进行import。
监视属性,当监视对象分为ref
和reactive
时,有下边几种不同的情况。
1、当监视ref定义的响应式数据
watch函数还有第三个选填参数,配置一个对象,设置immediate、deep是否为true。
2、监视ref定义的多个响应式数据
可以写多个watch函数,当然也可以写为数组形式,当写为数组形式监视多个数据时,handle回调中 newValue、oldValue也是一个数组,根据下标判断,是哪个具体的数据。
3、监视reactive定义的一个响应式数据
注意:这种虽然可以触发监视逻辑,但是无法获取正确的odlvalue,console结果中old和new的值都是新的值
对于reactive定义的响应式数据,进行监视,是强制开启深度监视的,即便你配置deep为false也是无效,这与reactive的实现方式有关。
4、监视reactive定义的响应式对象的某个属性。
注意:此时的监视对象需要写为函数类型,因为假如你直接使用person.name
,它其实是一个普通类型的值,没有响应式效果。
5、监视reactive定义的响应式属性的多个属性。
数组中每个元素都得写为函数类型。
总结:
一般在生产情况中,使用reactive,但此时oldValue会失效,如果要解决这个问题,可以将其单独拎出来,使用ref
watchEffect有点像computed,监视回调中用到哪个属性,就监视哪个属性,但computed注重计算出来的值(回调函数返回值),所以必须写返回值。而wacthEffect更加注重过程,回调函数的函数体,所以不用写返回值。
1、Vue3中可以继续使用Vue2中生命周期的钩子,但有两个被改名了:
2、Vue3中也提供了组合式API形式的生命周期钩子,与Vue2中的钩子对应关系如下:
注意:前两个函数,beforeCreate与Create 相当于Vue3中的setup阶段
这里的hook本质上是一个函数,目的是将setup中可以复用的组合式API进行一个封装,类似于Vue2中mixin。
自定义hook的优势也与mixin一样,复用代码,使得setup中写的逻辑更加清晰易懂。
step1:定义hook文件夹,实现定义hook逻辑的js文件
step2:引入并在setup中直接使用。
const name = toRef(person, 'name')
使用toRef建立引用绑定关系后,在template中就可以直接使用这些属性,且不会丢失响应式特性:
使用toRefs
结合...
语法:
shallow是浅层次的意思。
shallowReactive
shallowRef
作用:创建一个自定义的ref,并对其依赖跟踪和更新触发进行显示控制。
实现祖孙组件间(至少隔一代)的通信(实际上父子间也可以,只不过父子间一般使用props通信)
step1:祖组件中provice
:
step2:后代组件inject:
ref
对象reactive
创建的响应式代理readonly
创建的只读代理reactive
或者readonly
创建的代理。teleport是一种能够将我们的组件的HTML结构移动到指定位置的技术。
等待异步组件时,渲染一些额外的组件,优化用户体验
Vue2中有很多全局的API和配置,借助的Vue.xxx
实现,而在Vue3中取消了Vue
这个实例,转而使用app
替代,很多Vue原有的API转移到了app实例上。
vue2中默认给组件绑定事件为自定义事件,如果是内置事件,需要使用native声明,而在vue3中,当父组件给子组件绑定事件时,子组件在使用emits触发事件时,如果有相应配置,则是自定义事件,如果没有配置,则会被识别为内置事件。