• Vue3-Ref Reactive toRef toRefs对比学习、标签ref与组件ref


    响应式数据:

    Ref

    • 作用:定义响应式变量。

    • 语法:let xxx = ref(初始值)(里面可以是任何规定内类型、数组等)

    • 返回值:一个RefImpl实例对象,简称ref对象refref对象的value属性是响应式的

    • 注意点:

      • JS中操作数据需要:xxx.value,但模板中不需要.value,直接使用即可。(或者配置插件完成自动提示,但仍需理解value的意义)

      • 对于let name = ref('张三')来说,name不是响应式的,name.value是响应式的。

      • 其实ref接收的数据可以是:基本类型对象类型

      • ref接收的是对象类型,内部其实也是调用了reactive函数。其对象类型也显示为Proxy

      • 可以创建对象实例时田间深层次访问

    Reactive 

    • 作用:定义一个响应式对象(基本类型不要用它,要用ref,否则报错)

    • 语法:let 响应式对象= reactive(源对象)

    • 返回值:一个Proxy的实例对象,简称:响应式对象。

    • 注意点:reactive定义的响应式数据是“深层次”的。

    宏观角度看:ref用来定义:基本类型数据对象类型数据

    1. reactive用来定义:对象类型数据

    • 区别:

    1. ref创建的变量必须使用.value(可以使用volar插件自动添加.value,现在volar被废弃,平替为Vue - Official)。

    1. reactive重新分配一个新对象,会失去响应式(可以使用Object.assign去整体替换)。

    • 使用原则:

    1. 若需要一个基本类型的响应式数据,必须使用ref

    2. 若需要一个响应式对象,层级不深,refreactive都可以。

    3. 若需要一个响应式对象,且层级较深,推荐使用reactive

    转换成响应式数据:

    toRef 和 toRefs:

    • 作用:将一个响应式对象中的每一个属性,转换为ref对象。

    • 备注:toRefstoRef功能一致,但toRefs可以批量转换

    语法如下:

    1. <script lang="ts" setup name="Person">
    2. import {ref,reactive,toRefs,toRef} from 'vue'
    3. // 数据
    4. let person = reactive({name:'张三', age:18, gender:'男'})
    5. // 通过toRefs将person对象中的n个属性批量取出,且依然保持响应式的能力
    6. let {name,gender} = toRefs(person)
    7. // 通过toRef将person对象中的gender属性取出,且依然保持响应式的能力
    8. let age = toRef(person,'age')
    9. // 方法
    10. function changeName(){
    11. name.value += '~'
    12. }
    13. function changeAge(){
    14. age.value += 1
    15. }
    16. function changeGender(){
    17. gender.value = '女'
    18. }
    19. script>

    标签ref与组件ref:

    作用:用于注册模板引用。

    • 用在普通DOM标签上,获取的是DOM节点。

    • 用在组件标签上,获取的是组件实例对象。

    用在普通DOM标签上:

    1. <template>
    2. <div class="person">
    3. <h1 ref="title1">aah1>
    4. <h2 ref="title2">bbh2>
    5. <h3 ref="title3">cch3>
    6. <input type="text" ref="inpt"> <br><br>
    7. <button @click="showLog">点我打印内容button>
    8. div>
    9. template>
    10. <script lang="ts" setup name="Person">
    11. import {ref} from 'vue'
    12. let title1 = ref()
    13. let title2 = ref()
    14. let title3 = ref()
    15. function showLog(){
    16. // 通过id获取元素
    17. const t1 = document.getElementById('title1')
    18. // 打印内容
    19. console.log((t1 as HTMLElement).innerText)
    20. console.log((<HTMLElement>t1).innerText)
    21. console.log(t1?.innerText)
    22. // 通过ref获取元素
    23. console.log(title1.value)
    24. console.log(title2.value)
    25. console.log(title3.value)
    26. }
    27. script>

    用在组件标签上:

    1. <template>
    2. <Person ref="ren"/>
    3. <button @click="test">测试button>
    4. template>
    5. <script lang="ts" setup name="App">
    6. import Person from './components/Person.vue'
    7. import {ref} from 'vue'
    8. let ren = ref()
    9. function test(){
    10. console.log(ren.value.name)
    11. console.log(ren.value.age)
    12. }
    13. script>
    14. <script lang="ts" setup name="Person">
    15. import {ref,defineExpose} from 'vue'
    16. // 数据
    17. let name = ref('张三')
    18. let age = ref(18)
    19. /****************************/
    20. /****************************/
    21. // 使用defineExpose将组件中的数据交给外部
    22. defineExpose({name,age})
    23. script>

    注意:

    1. 有些时候我们试图从reactive中解构出数据,如:const {XX1,XX2} = sthReactive但XX1和XX2一旦被提取出来就变成普通数据失去响应式。
    2. 对于响应式嵌套较深的数据,使用reactive可以一路.出来,而ref需要开启deep模式,因为ref只能访问浅层数据。
    3. 修改reactive中的数据时,单个数据能够修改,但是直接修改整个对象,相当于用一个带有新地址值的响应式对象(即使你再给他套个reactive也于事无补)覆盖,原先的值销毁,无法访问和修改了(换家具还是换房?)
  • 相关阅读:
    mysql作业
    JS常用时间操作moment.js参考文档
    高速专线不打烊 DPDK Hotplug助你实现设备动态管理
    大三学生HTML期末作业,网页制作作业——HTML+CSS+JavaScript饮品饮料茶(7页)
    图的遍历概述
    Java框架(七)-- RESTful风格的应用(3)--浏览器的跨域访问
    软考重点8 面向对象及数据库
    使用 MySQL 日志 | 二进制日志 - Part 2
    2022前端面试题上岸手册-性能优化部分
    react 实现拖动元素
  • 原文地址:https://blog.csdn.net/Ian1025/article/details/139367662