美文网首页
(六)响应式数据 - 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

    本章将介绍的是另一个响应式数据的创建方式ref 1、概述:函数,创建并返回一个响应式数据对象,并在此对象上只包含一...

  • vue3的ref和reactive以及toRef和toRefs的

    只有响应式数据能更新界面,ref()、reactive()可以生成响应式数据。ref一般用于基础数据类型,按值传递...

  • ref、toRef、toRefs使用对比

    ref、toRef、toRefs都会生成一个响应式数据,不同的是如果用ref使对象的某个属性变成响应式不会改变原对...

  • 【vue3】一文读懂ref与reactive

    开发中如何选择使用ref和reactive呢?有时真不知道怎么选择 Ref ref数据响应式监听。ref 函数传入...

  • vue3较vue2的特别之处 - ref/toRef/toRef

    ref: 为值类型数据添加响应式状态示例: reactive: 为对象添加响应式状态示例: toRef: 用于为源...

  • 五.ref,refs, reactive区别

    ref和toRef的区别 (1). ref本质是拷贝,修改响应式数据不会影响原始数据;toRef的本质是引用关系,...

  • ref、reactive、toRef、toRefs的区别

    1、ref: 为数据添加响应式状态,返回一个具有响应式状态的副本。setup要通过'.value'属性来获取,te...

  • vue3 学习

    什么是ref? ref和reactive一样,也是用来实现响应式数据的方法,由于reactive必须传递一个对象,...

  • Vue3 watch监听 ref数组

    在Vue3中使用数组作为响应式数据,有两种方式,用ref包裹,或用reactivewatch监听 ref 定义的数...

  • Vue2 和 Vue3 中的 watch 用法

    数据 vue2中的写法 vue3中的写法 情况一,监视 ref 所定义的一个响应式数据 情况二,监视 ref 所定...

网友评论

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

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