• 记录--vue3中的ref,toRef,toRefs


    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助

    1. ref的使用

      ref 接受一个原始值,返回一个具有响应式的对象,对象有一个value属性,其值就是所传递的原始值。

      ref是做的一个拷贝关系,修改对象msg的值,不会影响对象obj,视图会发生变化。

    1. import { ref } from "vue";
    2. let obj = { name: "你好", age: 16 };
    3. let msg = ref(obj.name);
    4. console.log(msg.value); // 你好
    5. let arr = ref([]) // ref 可以是任何类型 也可以是对象
    6. function change1() {
    7. msg.value = "世界";
    8. //修改msg1数据的时候必须要加 .value 渲染数据的时候就不用加了
    9. console.log(obj, msg.value);
    10. // {name: "你好", age: 16} '世界'
    11. // 数据此时没改变 但是页面的数据改变了
    12. }
    13. change1();
    14. return {
    15. obj,
    16. msg,
    17. };

    如果给dom上加ref 就是当前的dom元素

    1. <template>
    2. <div class="home-new">
    3. <div ref="target">
    4. </div>
    5. </div>
    6. </template>
    7. import {ref} from 'vue'
    8. export default {
    9. name: "HomeNew",
    10. setup(p, { emit }) {
    11. const target = ref(null);
    12. // 懒加载
    13. console.log(target);
    14. return {
    15. target,
    16. };
    17. },
    18. };

    2. toRef的使用

     toRef用来给抽离响应式对象中的某一个属性,并把该属性包裹成ref对象,使其和原对象产生链接

     toRef是做的一种引用关系,修改msg2的值,会影响对象msg,但视图不会发生变化

    1. setup(){
    2. let msg = { name: 'zs', age: 16 }
    3. let msg2 = toRef(msg, 'name')
    4. console.log(msg2.value) // zs
    5. function change2() {
    6. msg2.value = 'ww'
    7. console.log(msg, msg2.value) // {name: "ww", age: 16} ww
    8. //此时 msg.ww 数据变了 但是视图上的是不会变的
    9. }
    10. change2()
    11. return { msg2,change2 }
    12. }

    3. toRefs的使用

    toRefs用来把响应式对象转换成普通对象,把对象中的每一个属性,包裹成ref对象

    toRefs就是toRef的升级版,只是toRefs是把响应式对象进行转换,其余的特性和toRef无二

    1. setup(){
    2. let msg = { name: 'zs', age: 16 }
    3. let msg3 = toRefs(msg)
    4. console.log(msg) // { name:ref, age:ref } ref代指ref对象
    5. function change3() {
    6. msg3.name.value = 'zl'
    7. msg3.age.value = 20
    8. console.log(msg, msg3) // {name: "zl", age: 20} { name:ref, age:ref }
    9. }
    10. change3()
    11. return { msg3, change3 }
    12. }

    请求过来的数据封装了一下

    1. <script>
    2. import { reactive, toRefs } from "vue";
    3. import { getBanner } from "@/api";
    4. export default {
    5. setup() {
    6. return {
    7. ...toRefs(getBan()),
    8. };
    9. },
    10. };
    11. function getBan() {
    12. let bannerList = reactive({
    13. list: [],// 模板中直接 写入 list 就可以了
    14. });
    15. getBanner().then((res) => {
    16. bannerList.list = res.data;
    17. console.log(bannerList.list);
    18. });
    19. return bannerList;
    20. }
    21. </script>

    这样写模板中直接写入 {{ list }}  就可以了 , 不用 {{ obj.list }},修改数据的时候还是 obj.list = 'aaa' 

    1. import { reactive, toRefs } from "vue";
    2. setup() {
    3. let obj = reactive({
    4. list: [],
    5. newS: [],
    6. moods: [],
    7. });
    8. return { ...toRefs(obj) };
    9. },

    4.总结

    ref、toRef、toRefs 都可以将某个对象中的属性变成响应式数据

    ref的本质是拷贝,修改响应式数据,不会影响到原始数据,视图会更新

    toRef、toRefs的本质是引用,修改响应式数据,会影响到原始数据,视图不会更新

    toRef 一次仅能设置一个数据,接收两个参数,第一个参数是哪个对象,第二个参数是对象的哪个属性

    toRefs接收一个对象作为参数,它会遍历对象身上的所有属性,然后挨个调用toRef执行

    本文转载于:

    https://blog.csdn.net/qq_54753561/article/details/121351993

    如果对您有所帮助,欢迎您点个关注,我会定时更新技术文档,大家一起讨论学习,一起进步。

     

  • 相关阅读:
    一个基于.Net Core、Vue开发仿掘金的CMS开源系统
    git 提交代码,解决分支冲突,合并分支
    基于springboot电动车智能充电服务平台设计与实现的源码+文档
    常见的设计模式(一)单例和工厂设计模式
    【SQL】各主流数据库sql拓展语言(T-SQL 、 PL/SQL、PL/PGSQL)
    C# - 委托、事件、Action、Func
    Mongodb命名和文档限制
    python宿舍管理系統毕业设计源码231642
    互联网系统安全(一)
    jumpserver跳板机堡垒机界面设置及界面功能
  • 原文地址:https://blog.csdn.net/qq_40716795/article/details/125405364