美文网首页
(六)响应式数据 - ref

(六)响应式数据 - ref

作者: Mr_莫言之 | 来源:发表于2020-10-16 13:11 被阅读0次
    本章将介绍的是另一个响应式数据的创建方式ref

    1、概述:函数,创建并返回一个响应式数据对象,并在此对象上只包含一个.value属性指向该数据值;
    2、用例:由vue提供,按需引入:import { ref } from 'vue';

    <p>{{name}}</p>  // 视图中直接使用即可,不需要.value
    
    import { ref } from 'vue';
    
    setup() {
        const name = ref('zhang_san');
        console.log(name.value) // 'zhang_san'
        // 同样需要使用return返回
        return { name };
    }
    

    如果使用ref将一个对象创建为响应式代理的话,则该对象会被进行深度响应式创建

    <p>{{data.count}}</p> // 0
    <p>{{data.content.age}}</p> // 10 
    
    setup(props, context) {
        const defaultVal = {
          count: 0,
          content: {
            age: 10
          }
        };
        const data = ref(defaultVal);
        console.log(data.value.count) // 0
        console.log(data.value.content.age) // 10
        return {
          data
        };
    }
    data.value.count ++ // 1 视图重新渲染
    data.value.content.age++ // 11 视图重新渲染
    
    下面是ref数据能访问到的部分常用方法及延伸方法。

    unref()

    1、概述:返回代理原始值,如果参数为ref则返回原始代理值,如果不是ref则返回参数本身
    2、用例:由vue提供,按需引入:import { unref } from 'vue';

    import { unref } from 'vue';
    const a = ref(1);
    const b = 'zhagn_san';
    console.log(unref(a)) // 1
    console.log(unref(b)) // zhagn_san
    

    toRef()

    1、概述:可以将reactive创建的代理的某个属性传递出来用ref进行代理
    2、用例:由vue提供,按需引入:import { toRef } from 'vue';

    import { reactive, toRef } from 'vue';
    const data = reactive({ name: 'zhang_san', age: 20 });
    const toRefValue = toRef(data, 'age');
    
    toRefValue.value++  // toRefValue.value 21
    console.log(data.age) // 21
    
    data.age++ // data.age 22
    console.log(toRefValue.value) // 22
    

    3、注意:使用toRef将reactive的属性代理后,属性值的变化会同时影响toRef后的值和原本reactive的属性值
    4、实例:在将prop的引用传递给复合函数的时候,toRef将非常有用

    setup(props) {
        userHandler(toRef(props, 'name'));
        // 这将使得userHandler拿到的name为响应式代理
    }
    

    toRefs()

    1、概述:可以将reactive创建的代理的所有属性传递出来用ref进行代理
    2、用例:由vue提供,按需引入:import { toRefs } from 'vue';

    import { reactive, toRefs } from 'vue';
    const data = reactive({ name: 'zhang_san', age: 20 });
    const toRefValue = toRefs(data);
    
    toRefValue.age.value++  // toRefValue.age.value 21
    console.log(data.age) // 21
    
    data.age++ // data.age 22
    console.log(toRefValue.age.value) // 22
    

    3、注意:使用toRefs将reactive的属性代理后,属性值的变化会同时影响toRefs后的对应属性值和原本reactive的属性值
    4、实例:从组合函数返回响应式对象时,这将很有用,而不是使用es6数据结构的方式,这样会使reactive的属性失去响应式代理

    function userHandler() {
      const state = reactive({ name: 'zhang_san', age: 20});
      return toRefs(state)
    }
    
    export default {
      setup() {
        const { name, age} = userHandler();
        return { name, age };
      }
    }
    

    isRef()

    1、概述:判断响应式代理是否为ref所创建
    2、用例:由vue提供,按需引入:import { isRef } from 'vue';

    import { ref, reactive, isRef } from 'vue';
    const name = ref('zhang_san');
    const user = reactive({sex: '男', age: 20});
    
    console.log(isRef(name)) // true
    console.log(isRef(user)) // false
    // 应用场景:在获取一个未知的数据对象的值时,如:
    const newV = isRef(name) ? name.value : name;
    

    下一章:(七)计算属性 - computed
    上一章:(五)响应式数据对象 - reactive

    ps:在你想从一个人身上得到什么的时候,先想想你自己在这个人身上付出了什么。

    相关文章

      网友评论

          本文标题:(六)响应式数据 - ref

          本文链接:https://www.haomeiwen.com/subject/faewpktx.html