vue3小笔记

时间:2025-03-06 13:02:29

 

一.创建vue3确保vuee-cli是4.5版本以上

二.vue3在中的引入与vue2不同

import {createApp } from 'vue'

import App from './'

createApp(App).mount('#app')

三.sutpu是一个函数,把变量,方法,以前的勾子函数都放里面

  • async在没在使用Suspense组件时是不能出现在sustpu中的
  • template下可以不用加div根标签
  • vue3的方法变量都写到setpu函数体内
  • vue3也可以使用vue2的配置,vue2能读取vue3的数据 ,用this.(vue3返回的数据)
  • vue3的setpu不能读取vue2的数据
  • vue3和vue2不要混用
  • vue3和vue2名相同 setpu优先
  • setup执行的时机

    • 在beforeCreate之前执行一次,this是undefined。

  • setup的参数

    • props:值为对象,包含:组件外部传递过来,且组件内部声明接收了的属性。

    • context:上下文对象

      • attrs: 值为对象,包含:组件外部传递过来,但没有在props配置中声明的属性, 相当于 this.$attrs

      • slots: 收到的插槽内容, 相当于 this.$slots

      • emit: 分发自定义事件的函数, 相当于 this.$emit

四.ref 给基本类型做数据响应式用的

基本数据类型想要数据响应式,也就是在setpu里改了数据,想要模版也跟着变的话就要使用到ref

  • 先要引入 import { ref } from 'vue'
  • 把基本数据类型放到ret方法里 如:let name=ref("张三“)
  • 在setpu上改的放要加个value 如,='李四'
  • 改了之后在模版上就不用加value,直接{{name}}
  • 通过()的get和set来实现响应式

想要用ref方法包对象类型 做数据响应式

  • 在setpu上修改就要='李四'
  • 但是只调用第一层的数据,再下一层还是对象就不能再修改了

五.reactive 给对象类型做数据响应式用的

定义一个对象类型的响应式数据,处理不了基本类型的(基本类型用ref)

  • 先要引入ref import { reactive } from 'vue'
  • js处理数据不用加.value
  • 可以监测到深层的对象
  • 对数组类型也能监测,
  • 基本数据要使用可以包装成一个对象再用reactiove()
  • 原理是用了proxy代理,还通过了windom身上的Reflect反射
  • new Proxy(data, {
    	// 拦截读取属性值
        get (target, prop) {
        	return (target, prop)
        },
        // 拦截设置属性值或添加新属性
        set (target, prop, value) {
        	return (target, prop, value)
        },
        // 拦截删除属性
        deleteProperty (target, prop) {
        	return (target, prop)
        }
    })
    
     = 'tom'  

    六.setup中的两个参数,props,context(attrs,slots,emit)

  • setup(props)第一个参数是props接收到的数据,会整理成一个proxy对象
  • setup(props,context)第二个参数是一个对象,里面有attrs emit slots
  1. attrs相当于vue2的$attrs,当没有用props声明接收就会出现在vue3的里
  2. slots是使用是插槽,父组件传过来的节点
  3. emit触发自定义事件  使用时像props一样先配置 接收  emits:['hello']

    七.vue3里的computed()

  • 需要通过import引入
  • vue3的写法与vue2功能是一致的
  • 要写到steup()里面
  • vue3里的computed是一个方法,简写时括号里直接放一回调,完整写法放一个{}里面有get和set
  • import {computed} from 'vue'
    
    setup(){
        ...
    	//计算属性——简写
        let fullName = computed(()=>{
            return  + '-' + 
        })
        //计算属性——完整
        let fullName = computed({
            get(){
                return  + '-' + 
            },
            set(value){
                const nameArr = ('-')
                 = nameArr[0]
                 = nameArr[1]
            }
        })
    }

     

八.watch监测函数

vue3中使用watch方法的多种情况 

  1. 在vue3中的watch是一个方法,而vue2里是一个配置项,所以可以使用多个watch,要放置在setup(要通过import引入  import {watch} from 'vue'
  2. watch里面有三个参数          
  3. 第一个是监测的对象
  4. 第二个是要执行的回调,回调里第一个参数是修改后的新值,第二个是修改前的值
  5. 第三个参数是配置对象用{}包住,有immediate:true,和deep:true ,immediate:true是初始化时就调用一次 ,deep:true是开启深度监视
  6.  监测ref时,不用加.value,如果监测的是对象就要加.value,如果不加.value可以开启deep:true;

  7. 监测的是reactive定义的数据时,修改后的值没法得到

  8. 监测的是对象的属性,第一个参数就要用一个回调,回调里的返回值放监视的对象属性,监视  多个对象属性就要放在一个数组里,注意的是正常情况下监视的是对象会自动开启深度监视,改成false无效

  9. 监测的是对象的属性也是对象的话,vue3中特殊情况,deep:false配置才能生效.默认是false,如果里面还有再深层次的对象的放就要开启deep:true;才能监视到更深层次的对象属性

//情况一:监视ref定义的响应式数据
watch(sum,(newValue,oldValue)=>{
	('sum变化了',newValue,oldValue)
},{immediate:true})

//情况二:监视多个ref定义的响应式数据
watch([sum,msg],(newValue,oldValue)=>{
	('sum或msg变化了',newValue,oldValue)
}) 

/* 情况三:监视reactive定义的响应式数据
			若watch监视的是reactive定义的响应式数据,则无法正确获得oldValue!!
			若watch监视的是reactive定义的响应式数据,则强制开启了深度监视 
*/
watch(person,(newValue,oldValue)=>{
	('person变化了',newValue,oldValue)
},{immediate:true,deep:false}) //此处的deep配置不再奏效

//情况四:监视reactive定义的响应式数据中的某个属性
watch(()=>,(newValue,oldValue)=>{
	('person的job变化了',newValue,oldValue)
},{immediate:true,deep:true}) 

//情况五:监视reactive定义的响应式数据中的某些属性
watch([()=>,()=>],(newValue,oldValue)=>{
	('person的job变化了',newValue,oldValue)
},{immediate:true,deep:true})

//特殊情况
watch(()=>,(newValue,oldValue)=>{
    ('person的job变化了',newValue,oldValue)
},{deep:true}) //此处由于监视的是reactive素定义的对象中的某个属性,所以deep配置有效

九.watchEffect函数 不用指明监视哪个属性,监视的回调中用到哪个属性,那就监视哪个属性。

  • watch的套路是:既要指明监视的属性,也要指明监视的回调。

  • watchEffect的套路是:不用指明监视哪个属性,监视的回调中用到哪个属性,那就监视哪个属性。

  • watchEffect有点像computed:

    • 但computed注重的计算出来的值(回调函数的返回值),所以必须要写返回值。

而watchEffect更注重的是过程(回调函数的函数体),所以不用写返回值。

//watchEffect所指定的回调中用到的数据只要发生变化,则直接重新执行回调。
watchEffect(()=>{
    const x1 = 
    const x2 = 
    ('watchEffect配置的回调执行了')
})

十.生命周期 有两个不同beforeUnmount  和unmount

  • 在vue3中的setup中使用,要在前面加on如onbeforeCreate( ()=>{})括号里面放一回调
  • beforeCreate()  created()  beforeMount()  mounted()   beforeUpdate()    Update()
  •             beforeUnmount(){}  vue2 beforeDestroy
  •              unmount(){}  vue2 destroyed
  • beforeCreate()  created()在setup执行之前执行

十一.自定义hook函数

  • 把封装的代码写在一个js文件上,放在hooks目录上,hooks目录要放在src目录下,在组件都要用就可以直接引入调用即可,
  • 记得要return返回值才有用

十二.toRef和toRefs

  • 使用toRef要先通过import引入
  • toRef如果返回值不通过toRef方法包果,就不是响应式数据
  • toRef方法里的第一个参数是对象,第二个参数是属性,深层次的对象引用在第一个参数里点出来
  • toRefs也要先引入
  • 可以批量处理对象,有一个参数就可以了,参数是对象
  • 通过...出来的都是第一层的属性,所以在模版上深层次的还是要点出来

十三.shallowReactive和shallowRef

  • shallowReactive只响应第一层数据属性,深层次数据的不响应
  • 与reactive的区别就是,reactive可以对深层次数据响应
  • shallowRef对对象类型的数据不进行响应式
  • 与ref区别,ref对对象用.value形式可以响应式

十四.customRef 自定义ref

<template>
	<input type="text" v-model="keyword">
	<h3>{{keyword}}</h3>
</template>

<script>
	import {ref,customRef} from 'vue'
	export default {
		name:'Demo',
		setup(){
			// let keyword = ref('hello') //使用Vue准备好的内置ref
			//自定义一个myRef
			function myRef(value,delay){
				let timer
				//通过customRef去实现自定义
				return customRef((track,trigger)=>{
					return{
						get(){
							track() //告诉Vue这个value值是需要被“追踪”的
							return value
						},
						set(newValue){
							clearTimeout(timer)
							timer = setTimeout(()=>{
								value = newValue
								trigger() //告诉Vue去更新界面
							},delay)
						}
					}
				})
			}
			let keyword = myRef('hello',500) //使用程序员自定义的ref
			return {
				keyword
			}
		}
	}
</script>

十五.provide 与 inject

  • 父组件有一个 provide 选项来提供数据,后代组件有一个 inject 选项来开始使用这些数据

  • 祖组件中
    setup(){
    	......
        let car = reactive({name:'奔驰',price:'40万'})
        provide('car',car)
        ......
    }
    后代组件中
    setup(props,context){
    	......
        const car = inject('car')
        return {car}
    	......
    }

    十六.响应式数据的判断

  • isRef: 检查一个值是否为一个 ref 对象

  • isReactive: 检查一个对象是否是由 reactive 创建的响应式代理

  • isReadonly: 检查一个对象是否是由 readonly 创建的只读代理

  • isProxy: 检查一个对象是否是由 reactive 或者 readonly 方法创建的代理

十七.Teleport能够将我们的组件html结构移动到指定位置的技术

<teleport to="移动位置">
	<div v-if="isShow" class="mask">
		<div class="dialog">
			<h3>我是一个弹窗</h3>
			<button @click="isShow = false">关闭弹窗</button>
		</div>
	</div>
</teleport>

十八.Suspense等待异步组件时渲染一些额外内容,让应用有更好的用户体验

异步引入,网络慢时子组件后出

用Suspense包住的,网速快时出default,网络慢时出fallback,两个template都是同一个东西

使用了Suspense组件才能用async,用了Promise也可以出现延时加载

<template>
	<div class="app">
		<h3>我是App组件</h3>
		<Suspense>
			<template v-slot:default>
				<Child/>
			</template>
			<template v-slot:fallback>
				<h3>加载中.....</h3>
			</template>
		</Suspense>
	</div>
</template>
import {defineAsyncComponent} from 'vue'
const Child = defineAsyncComponent(()=>import('./components/'))

十九.全局API的转移

将全局的API,即:调整到应用实例(app)上

全局 API(Vue 实例 API (app)
移除