vue3 | isRef、unref、toRef、toRefs

vue3,isref,unref,toref,torefs · 浏览次数 : 163

小编点评

是的,`isRef` 函数可以用来检查某个值是否是 `ref`。 `isRef()` 函数接收一个参数,该参数是要检查的值。如果参数是 `ref`,则函数返回 `true`,否则返回 `false`。 例如: ```typescript 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 ``` **用途:** `isRef()` 函数可以用于检查一个值是否是 `ref`,并返回一个指示该值的真假值的布尔值。可以使用 `isRef()` 函数来在组件中控制输入元素的禁用和启用。

正文

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

与vue3 | isRef、unref、toRef、toRefs相似的内容:

vue3 | isRef、unref、toRef、toRefs

isRef 检查某个值是否是ref。是返回true,否则返回false。 const num = ref(10); const num1 = 20; const num2 = reactive({ data: 30 }); console.log(isRef(num)); //true consol

vue3 | slots

一、什么是插槽 插槽就是子组件中的提供给父组件使用的一个占位符,用 表示,父组件可以在这个占位符中填充任何模板代码,如 HTML、组件等,填充的内容会替换子组件的标签,父组件填充的内容称为插槽内容。 子组件不提供插槽时,父组件填充失效 父组件无填充

vue3 | shallowReactive 、shallowRef、triggerRef

shallowReactive 使用 reactive 声明的变量为递归监听,使用 shallowReactive 声明的变量为非递归监听(通俗的讲就是 reactive 创建的对象将会被 vue 内部进行递归监听,可以监听到对象中的对象是否发生了改变从而更新视图,而 shallowReactive

vue3 | readonly、shallowReadonly

readonly 接受一个对象(不管是响应式还是普通的)或者是一个ref,返回的是一个原值的只读代理。 {{ data }}<

vue3 | mitt的基本使用

# 一、安装 npm安装 ``` npm i mitt ``` pnpm安装 ``` pnpm i mitt ``` yarn安装 ``` yarn add mitt ``` # 二、使用 ## (一)、当前组件内使用 ```javascript import mitt from 'mitt' //

vue3 | defineExpose的使用

简介 使用

uniapp+vue3聊天室|uni-app+vite4+uv-ui跨端仿微信app聊天语音/朋友圈

原创研发uniapp+vue3+pinia2跨三端仿微信app聊天模板Uniapp-Wechat。 uni-vue3-wchat基于uni-app+vue3+pinia2+uni-ui+uv-ui等技术跨端仿制微信App界面聊天项目,支持编译到H5+小程序端+App端。实现编辑框多行消息/emoj混

Vite5+Electron聊天室|electron31跨平台仿微信EXE客户端|vue3聊天程序

基于electron31+vite5+pinia2跨端仿微信Exe聊天应用ViteElectronChat。 electron31-vite5-chat原创研发vite5+electron31+pinia2+element-plus跨平台实战仿微信客户端聊天应用。实现了聊天、联系人、收藏、朋友圈/短

vue3 + mark.js | 实现文字标注功能

页面效果 具体实现 新增 1、监听鼠标抬起事件,通过window.getSelection()方法获取鼠标用户选择的文本范围或光标的当前位置。 2、通过 选中的文字长度是否大于0或window.getSelection().isCollapsed (返回一个布尔值用于描述选区的起始点和终止点是否位于

Vite-Wechat网页聊天室|vite5.x+vue3+pinia+element-plus仿微信客户端

基于Vue3+Pinia+ElementPlus仿微信网页聊天模板Vite5-Vue3-Wechat。 vite-wechat使用最新前端技术vite5+vue3+vue-router@4+pinia+element-plus搭建网页端仿微信界面聊天系统。包含了聊天、通讯录、朋友圈、短视频、我的等功