首页 > 其他分享 >vue3 | isRef、unref、toRef、toRefs

vue3 | isRef、unref、toRef、toRefs

时间:2023-02-07 20:24:36浏览次数:50  
标签:const log val toRef unref isRef num console ref

isRef

检查某个值是否是ref。是返回true,否则返回false

const num = ref(10);
const num1 = 20;
const num2 = reactive({ data: 30 });

console.log(isRef(num)); //true
console.log(isRef(num1)); //false
console.log(isRef(num2)); //false

unref()

如果参数是ref,则返回内部值,否则返回参数本身。
这是  val = isRef(val) ? val.value : val  计算的一个语法糖。

console.log(unref(num));
console.log(unref(num1));
console.log(unref(num2));

toRef

介绍

基于响应式对象上的某个属性,创建一个对应的 ref。创建出来的 ref 会跟源属性保持同步:更改了 ref 的值就会更改源属性的值,反之亦然。

  • 参数一:操作对象
  • 参数二:对象属性
const val = reactive({
  num: 1,
});

const numRef = toRef(val, "num");

// 更改该 ref 会更新源属性
numRef.value++;
console.log(val.num); // 2

// 更改源属性也会更新该 ref
val.num++;
console.log(numRef.value); // 3

使用场景

toRef()  这个函数在你想把一个 prop 的 ref 传递给一个组合式函数时会很有用当我们向组件传递 props 数据时,如果想要某个数据同父组件同步更新。当  toRef  与组件 props 结合使用时,关于禁止对 props 做出更改的限制依然有效。尝试将新的值传递给 ref 等效于尝试直接更改 props,这是不允许的。在这种场景下,可以使用watch去监听我们定义ref()对象。

<template>
  <n-modal :show="props.visible">
    <n-card
      style="width: 600px"
      title="编辑"
      :bordered="false"
      size="huge"
      role="dialog"
      aria-modal="true"
    >
      <n-input v-model:value="inputValue"></n-input>
      <template #footer>
        <n-el class="flex justify-end">
          <n-space>
            <n-button @click="emits('cancel')">取消</n-button>
            <n-button @click="emits('save', inputValue)">确定</n-button>
          </n-space>
        </n-el>
      </template>
    </n-card>
  </n-modal>
</template>

<script lang="ts" setup>
  import { toRef, watch, ref } from 'vue'
  const props = defineProps<{
    visible: boolean
    value: string
  }>()

  const emits = defineEmits<{
    (e: 'save', data: string): void
    (e: 'cancel'): void
  }>()

  const valueToRef = toRef(props, 'value')
  const inputValue = ref(props.value)

  watch(
    () => valueToRef.value,
    (v) => (inputValue.value = v)
  )
</script>
<style></style>
  const visible = ref(true)
  const inputValue = ref('哈哈哈哈')
  const handleSave = (v: string) => {
    console.log('v', v)
  }
  const handleCancel = () => {
    visible.value = false
  }

  <Demo :value="inputValue" :visible="visible" @save="handleSave" @cancel="handleCancel" />

注:视图更新的问题

参考: https://www.cnblogs.com/web-learn/p/16725393.html

toRefs()

将一个响应式对象转换为一个普通对象,这个普通对象的每个属性都指向源对象相应的属性的ref。每个单独的ref都是使用toRef()创建的。

const val = reactive({
  num: 1,
});

const numRef = toRefs(val);

// 更改该 ref 会更新源属性
numRef.num.value++;
console.log(val.num); // 2

// 更改源属性也会更新该 ref
val.num++;
console.log(numRef.num.value); // 3

toRefs()解构出来的对象不会失去响应性。

如下:

const obj = reactive({
  num: 10,
  num2: 20,
});

const { num1, num2 } = toRefs(obj);

toRefs  在调用时只会为源对象上可以枚举的属性创建 ref。如果要为可能还不存在的属性创建 ref,请改用  toRef

标签:const,log,val,toRef,unref,isRef,num,console,ref
From: https://www.cnblogs.com/yangyukeke/p/17099688.html

相关文章

  • unref、isref、toRef、toRefs
    unref()如果参数是一个ref则返回它的value,否则返回参数本身unref(val)相当于val=isRef(val)?val.value:valfunctioninitialCount(value:number|Ref<number>){......
  • 业界三款主流的 PWA Storefront 概述
    ​​业界三款主流的PWAStorefront概述​​ 任何电子商务解决方案都可以使用任何PWA-Ready框架进行部署,或是通过移动UI库从头开始实施。但是,后者肯定会比使用......
  • 一款开源的 Angular Storefront 应用介绍,代号 Spartacus 诞生的历史背景
    ​​一款开源的AngularStorefront应用介绍,代号Spartacus诞生的历史背景​​ 长期以来,人们认为原生应用(nativeApplication)是网站移动和桌面版本的良好辅助。......
  • 业界三款主流的 PWA Storefront 概述
    任何电子商务解决方案都可以使用任何PWA-Ready框架进行部署,或是通过移动UI库从头开始实施。但是,后者肯定会比使用专门的产品花费更多的时间和资源。下面是电商领域三......
  • 关于 Spartacus 开源 Storefront 在 PWA 模式下运行时的 index.html hash mismatch 问
    Spartacus开源项目提供将Angular实现的电商Storefront站点作为PWA运行的功能。这提高了用户性能,改善了用户体验,添加了另一个缓存层并减少了服务器端渲染(SSR)服......
  • Spartacus Storefront 里的 currency 和 language 的 store 设计
    currency和language都持久化在localstorage里了:app.config.ts?FailingE2Etests:Thesitecontexttestsarefailing涉及到的文件:currency-checkout-page.......
  • toRef、toRefs、toRaw解析
    1、toRef 2、toRefs   3、toRaw当你的对象不需要它去做响应式的操作,可以对其进行使用,让它脱离原本的proxy层变成普通的对象(没有响应式)......
  • Vue3之toRef
    toRef作用:创建一个ref对象,其value值指向另一个对象中的某个属性。语法:constname=toRef(person,'name')应用:要将响应式对象中的某个属性单独提供给外部使用......
  • Android PullToRefresh上拉和下拉刷新
    Github链接:​​https://github.com/chrisbanes/Android-PullToRefresh​​GUIDE:​​https://github.com/chrisbanes/Android-PullToRefresh/wiki/Quick-Start-Guide​​1.......
  • 搞懂vue3的ref、reactive、toRef、toRefs
    首先需要明确这四个函数都是用于在setup中创造响应式变量的。四个函数都需要从vue中导出:import{ref,reactive,toRef,toRefs}from'vue'总结:reactive对比ref从......