首页 > 其他分享 >vue3新增知识点(组合式API、ref和reactive、响应式原理、setup、watch和watchEffect)持续更新

vue3新增知识点(组合式API、ref和reactive、响应式原理、setup、watch和watchEffect)持续更新

时间:2022-12-02 15:22:09浏览次数:54  
标签:知识点 target setup watch value reactive let propname ref

1.组合式API和声明式API的区别,组合式API的优点

2.Vue3的响应式原理
通过Proxy(代理):拦截对象中任意属性的变化:包括:属性值的读写、属性的添加、属性的删除等。
通过reflect(反射):对被代理对象的属性进行操作

    let person={
        name:'张三',
        age:18
    }
    let p=new Proxy(person,{
        get(target,propname){
            console.log(`请求获取p(${target})中的${propname}`);
            // return target[propname]
            return Reflect.get(target,propname)

        },
        set(target,propname,value){
            console.log(`修改p(${target})中的${propname}`);
            // target[propname]=value
            Reflect.set(target,propname,value)
        },
        delete(target,propname){
            console.log(`删除p(${target})中的${propname}`);
            // return delete target[propname]
            return Reflect.defineProperty(target,propname)
        }

    })

3.ref和reactive
对比:
从定义角度:
ref用来定义:基本类型数据
reactive用来定义:对象和数组类型数据
备注:ref也可以用啦定义对象和数组类型的数据,它内部会自动通过reactive转为代理对象

从原理角度对比:
ref通过Object.defineProperty()的get与set来实现响应式(数据劫持)
reactive通过使用Proxy来实现响应式(数据劫持),并通过Reflect来操作源对象的内部数据

从使用角度:
ref定义的数据:操作数据需要.value,读取数据时模版中直接读取不需要value
reactive:操作数据与读取数据:均不需要.value

ref用来处理基本数据类型也可以处理对象类型,在处理数据时,例如修改数据需要在变量后面加上value,
使用ref

<script setup>
import { ref, reactive } from 'vue'
let name=ref('jack')
let age=ref(18)
let item=ref({
    job:'前端开发工程师',
    salary:'50k'
})
function increment(){
     name.value='jonh',
     age.value=118,
     item.value.job='UI'

}
</script>
<template>
 <div>
     <h1>一个人的信息</h1>
     <h2>姓名:{{name}}</h2>
     <h2>年龄:{{age}}</h2>
     <h2>职业:{{item.job}}</h2>
     <h2>薪水:{{item.salary}}</h2>
     <button @click="increment">修改个人信息</button>
 </div>
</template>

处理对象类型和数组类型的数据时,使用reactive,不建议使用reactive处理基本数据类型
使用reactive之后,就不需要通过加上value来改变原先的值

<script setup>
import { ref, reactive } from 'vue'
let name=ref('jack')
let age=ref(18)
let item=reactive({
    job:'前端开发工程师',
    salary:'50k'
})
function increment(){
     name.value='jonh',
     age.value=118,
     item.job='UI'

}
</script>

3.setup的两个注意点
setup的执行时机
在beforeCreate之前执行一次,this是undefined,所在在setup中是不能使用this的因为
什么都获取不到

setup参数
props:值为对象,包含:组件外部传递过来,且组件内部声明接收了的属性
context:上下文对象
attrs:值为对象,包含:组件外部传递过来的,但是没有在props配置中声明的属 性,相对应this.$attrs.
slots:收到的插槽内容,相对应this.$solts.
emit:分发自定义事件的函数,相当于this.$emit.

4.computed函数、

    setup(){
        let firstName=ref('')
        let lastName=ref('')
        // let fullName=computed(()=>{
        //     return firstName.value+'-'+lastName.value
        // })
        let fullName=computed({
            get(){
                return firstName.value+'-'+lastName.value
            },
            set(value){
                let nameArr=value.split('-')
                firstName.value=nameArr[0]
                lastName.value=nameArr[1]
            }
        })
        return {
            firstName,
            lastName,
            fullName
        }
    }


5.watch
情况一:监听ref所定义的一个响应式数据

 //情况一:监听ref所定义的一个响应式数据
        watch(sum,(oldValue,newValue)=>{
            console.log('监听到了改变',oldValue,newValue);
        })

情况二:监听ref所定义的多个响应式数据

 watch([sum,msg],(newValue,oldValue)=>{
            console.log('sum or msg 变化了',newValue,oldValue);
        })

情况三:监听reactive所定义的一个响应式数据
1.注意:此处无法正确获取oldValue
2.注意:强制开启了深度监视(deep配置无效)

        watch(person.value,(newValue,oldValue)=>{
            console.log('person变化了',newValue,oldValue);
        })

情况四:监听reactive所定义的一个响应式数据中的某个属性

        watch(()=>person.name,(newValue,oldValue)=>{
            console.log('person的name变化了',newValue,oldValue);
        })

情况五:监视reactive所定义的一个响应式数据中的某些属性

        watch([()=>person.name,()=>person.age],(newValue,oldValue)=>{
            console.log('person的name和age变化了',newValue,oldValue);
        })

特殊情况:使用deep监听深层数据的变化 (此处因为监听的是reactive中的对象中的某个属性依然是个对象,所以deep配置有效)
watchEffect
watch的套路:既要指明监听的属性,也要指明监视的回掉
watchEffect的套路是:不用指明监视的哪个属性,监视的回调中用到哪个属性,那就监视哪个属性
watchEffect有点像computed
但computed注重计算的出来的值(回调函数的返回值),所以必须要写返回值
而watchEffect更注重的是过程(回调函数的函数体),所以不用写返回值

watchPostEffect
watchProxyEffect

6.render函数
render函数使得我们使用js构建dom
当使用精简版vue库的时候,没有模版解析器,那怎么构建dom呢,这个时候需要使用render函数,将模版template解析成js文件从而构建虚拟dom,就省去了vue转译的过程,
其实都是将模版解析为虚拟dom树
当使用完整版的vue库的时候,含有模版解析器,模版解析占用vue库大概三分之一的空间,在webpack打包的时候,模版解析器一直在,其实,使用精简版vue旨在减少打包的内存

标签:知识点,target,setup,watch,value,reactive,let,propname,ref
From: https://www.cnblogs.com/shuchenhao/p/16944574.html

相关文章

  • 转 vue3讲义 知识点 整理文档PPT
      vue3自学理论笔记 vue3讲义  知识点  整理文档PPT项目不忙时就学习新内容,知识不全。 1.vue2使用es5中的object.definedPropert对数据进行双向绑定......
  • 今天很开心,get了3个知识点
    1、首先搞懂了bindtap和bindinput的区别;bindinput在input标签里面,输入框的每次输入都会触发bindinput绑定的方法;bindtap在其他标签,比如button。button的每次点击都会出发......
  • python-练习(知识点到逻辑运算符)
    1.在终端中显示古诗"登高"print("登高")print("作者:杜甫")print("风急天高猿啸哀,渚清沙白鸟飞回。")print("无边落木萧萧下,不尽长江滚滚来。")pr......
  • 有关View的几个基础知识点-IOS开发
    我一般情况下不会使用interfacebuilder去画界面,而是用纯代码去创建界面,不是装B,而是刚从vi转到xcode不久,不太习惯interfacebuilder而已。当然如果需要我也会使用它。一个东......
  • 分布式锁-redission锁重试和WatchDog机制
    抢锁过程中,获得当前线程,通过tryAcquire进行抢锁,该抢锁逻辑和之前逻辑相同1、先判断当前这把锁是否存在,如果不存在,插入一把锁,返回null2、判断当前这把锁是否是属于当前线......
  • pyqt6知识点
    1、QToolTip窗口字体及窗口名设置(1)窗口字体设置  QToolTip.setFont(QFont("SansSerif",10))(2)窗口名设置  第一种:w=QWidget()创建窗口对象,然后设置标题w.setWindo......
  • python知识点
    一、pip工具常用的子命令1、install,用于安装库;2、download,用于下载库;3、uninstall,用于卸载库;4、freeze,用以requirements格式导出安装包;5、show,查看某个包的信息6、li......
  • linux命令watch的用法
      前言是不是经常会遇到需要观察某个内容,为了持续观察而反复执行某个命令?也许你可以写一个简单的脚本帮你反复执行,但是有更简单方便的方法为什么不用呢?今天要介绍的便......
  • SetupPlayerInputComponent(UInputComponent* PlayerInputComponent) 被调用2次
    问题GAS技能输入绑定失效。直接原因在ListenServer的一端,ACharacter::SetupPlayerInputComponent在游戏开始后,被调用了2次,说明第1次输入绑定的InputComponent被移除(......
  • 【Jmeter】21天打卡 10线程用户之setUp和tearDown
    作业要求:1、添加setUp线程组和tearDown线程组2、添加线程组HTTP请求(2个以上),查看结果树3、由于httpbin.org不存在登录机制,所以setUp和tearDown用两个任意get请求代替,HTT......