vue3小笔记

一.创建vue3确保vuee-cli是4.5版本以上
二.vue3在main.js中的引入与vue2不同

import {createApp } from 'vue'
 
import App from './App.vue'
 
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 如,name.value='李四'
改了之后在模版上就不用加value,直接{{name}}
通过Object.defineProperty()的get和set来实现响应式
想要用ref方法包对象类型 做数据响应式

在setpu上修改就要obj.value.name='李四'
但是只调用第一层的数据,再下一层还是对象就不能再修改了
五.reactive 给对象类型做数据响应式用的
定义一个对象类型的响应式数据,处理不了基本类型的(基本类型用ref)

先要引入ref import { reactive } from 'vue'
js处理数据不用加.value
可以监测到深层的对象
对数组类型也能监测,
基本数据要使用可以包装成一个对象再用reactiove()
原理是用了proxy代理,还通过了windom身上的Reflect反射

new Proxy(data, {
    // 拦截读取属性值
    get (target, prop) {
        return Reflect.get(target, prop)
    },
    // 拦截设置属性值或添加新属性
    set (target, prop, value) {
        return Reflect.set(target, prop, value)
    },
    // 拦截删除属性
    deleteProperty (target, prop) {
        return Reflect.deleteProperty(target, prop)
    }
})
 
proxy.name = 'tom'  

六.setup中的两个参数,props,context(attrs,slots,emit)
setup(props)第一个参数是props接收到的数据,会整理成一个proxy对象
setup(props,context)第二个参数是一个对象,里面有attrs emit slots
attrs相当于vue2的$attrs,当没有用props声明接收就会出现在vue3的context.attrs里
slots是使用是插槽,父组件传过来的节点
emit触发自定义事件 使用时像props一样先配置 接收 emits:['hello']
七.vue3里的computed()
需要通过import引入
vue3的写法与vue2功能是一致的
要写到steup()里面
vue3里的computed是一个方法,简写时括号里直接放一回调,完整写法放一个{}里面有get和set

import {computed} from 'vue'
 
setup(){
    ...
    //计算属性——简写
    let fullName = computed(()=>{
        return person.firstName + '-' + person.lastName
    })
    //计算属性——完整
    let fullName = computed({
        get(){
            return person.firstName + '-' + person.lastName
        },
        set(value){
            const nameArr = value.split('-')
            person.firstName = nameArr[0]
            person.lastName = 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是开启深度监视

  1. 监测ref时,不用加.value,如果监测的是对象就要加.value,如果不加.value可以开启deep:true;

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

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

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

//情况一:监视ref定义的响应式数据
watch(sum,(newValue,oldValue)=>{
    console.log('sum变化了',newValue,oldValue)
},{immediate:true})
 
//情况二:监视多个ref定义的响应式数据
watch([sum,msg],(newValue,oldValue)=>{
    console.log('sum或msg变化了',newValue,oldValue)
}) 
 
/* 情况三:监视reactive定义的响应式数据
            若watch监视的是reactive定义的响应式数据,则无法正确获得oldValue!!
            若watch监视的是reactive定义的响应式数据,则强制开启了深度监视 
*/
watch(person,(newValue,oldValue)=>{
    console.log('person变化了',newValue,oldValue)
},{immediate:true,deep:false}) //此处的deep配置不再奏效
 
//情况四:监视reactive定义的响应式数据中的某个属性
watch(()=>person.job,(newValue,oldValue)=>{
    console.log('person的job变化了',newValue,oldValue)
},{immediate:true,deep:true}) 
 
//情况五:监视reactive定义的响应式数据中的某些属性
watch([()=>person.job,()=>person.name],(newValue,oldValue)=>{
    console.log('person的job变化了',newValue,oldValue)
},{immediate:true,deep:true})
 
//特殊情况
watch(()=>person.job,(newValue,oldValue)=>{
    console.log('person的job变化了',newValue,oldValue)
},{deep:true}) //此处由于监视的是reactive素定义的对象中的某个属性,所以deep配置有效

九.watchEffect函数 不用指明监视哪个属性,监视的回调中用到哪个属性,那就监视哪个属性。
watch的套路是:既要指明监视的属性,也要指明监视的回调。
watchEffect的套路是:不用指明监视哪个属性,监视的回调中用到哪个属性,那就监视哪个属性。

watchEffect有点像computed:

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

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

//watchEffect所指定的回调中用到的数据只要发生变化,则直接重新执行回调。
watchEffect(()=>{
    const x1 = sum.value
    const x2 = person.age
    console.log('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/Child.vue'))

十九.全局API的转移
将全局的API,即:Vue.xxx调整到应用实例(app)上

2.x 全局 API(Vue) 3.x 实例 API (app)
Vue.config.xxxx app.config.xxxx
Vue.config.productionTip 移除
Vue.component app.component
Vue.directive app.directive
Vue.mixin app.mixin
Vue.use app.use
Vue.prototype app.config.globalProperties
————————————————
版权声明:本文为CSDN博主「ungame」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/A081127/article/details/124554466
————————————————
版权声明:本文为CSDN博主「ungame」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/A081127/article/details/124554466

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,242评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,769评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,484评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,133评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,007评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,080评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,496评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,190评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,464评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,549评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,330评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,205评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,567评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,889评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,160评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,475评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,650评论 2 335

推荐阅读更多精彩内容