Vue3实战笔记(44)—vue3组件的ref属性

62 篇文章 1 订阅
62 篇文章 1 订阅


前言

之前学习过ref声明响应式对象,前几天读代码遇到了发懵的地方,详细学习了一下才发现,用法还有很多,遂总结一下ref的用法备忘。


一、组件的ref用法总结

Vue3 中的 ref 是一种创建响应式引用的方式,它在Vue生态系统中扮演着重要角色。以下是Vue3中ref属性及其相关API的几个关键点:

创建响应式变量:使用 ref 函数可以创建一个响应式的数据引用,返回的对象包含 .value 属性,该属性既可以读取也可以写入,并且是响应式的。例如:

Javascript
1import { ref } from 'vue';
2
3const count = ref(0); // 创建一个响应式引用,初始值为0
4console.log(count.value); // 输出0
5count.value++; // 改变值,这将触发视图更新

在模板中使用 ref:在模板中,可以使用 v-ref 或简写 ref 来给 DOM 元素或组件添加引用标识符。对于DOM元素:

<div ref="myDiv">Hello World</div>

然后在组件的 setup 函数内或者生命周期钩子如 onMounted 中通过 ref 访问到该元素:

onMounted(() => {
 console.log(myDiv.value); // 这将输出对应的DOM元素
});

// 注意,在setup函数中使用需要解构
setup() {
  const myDiv = ref<HTMLElement | null>(null);
  // ...

对于子组件,ref 则指向子组件的实例:

<MyChildComponent ref="childRef" />

动态 refs:在动态渲染的组件或循环列表中,可以使用动态 ref 名称:

1<component v-for="(item, index) in items" :is="item.component" :key="index" :ref="`child${index}`" />
然后通过 getCurrentInstance() 获取这些动态 ref:

Javascript
1setup() {
2  const instance = getCurrentInstance();
3  const childrenRefs = computed(() => {
4    return instance.refs;
5  });
6  // ...
7}

组件间通信:通过 ref 可以方便地在组件之间传递并操作状态,尤其适用于父子组件之间的通信。
(1)创建一个子组件 ChildComponent.vue:


<template>
  <div>
    <h2>{{ childMessage }}</h2>
    <button @click="handleClick">点击我</button>
  </div>
</template>

<script>
import { ref, defineComponent } from 'vue';

export default defineComponent({
  setup(props, { emit }) {
    const childMessage = ref('Hello from Child');
    const handleClick = () => {
      emit('child-clicked', 'Child component clicked!');
    };

    return {
      childMessage,
      handleClick,
    };
  },
});
</script>

(2)创建一个父组件 ParentComponent.vue,并使用 ref 属性访问子组件实例:

<!-- ParentComponent.vue --><template>
  <div>
    <h1>Parent Component</h1>
   <ChildComponent ref="childRef" />
   <button @click="callChildMethod">Call Child Method</button>
  </div>
</template><script>
import { ref } from 'vue';
import ChildComponent from './ChildComponent.vue';

export default {
  components: {
    ChildComponent,
  },
  setup() {
    const childRef = ref(null);

    function callChildMethod() {
      childRef.value.showMessage();
    }

    return {
      childRef,
      callChildMethod,
    };
  },
};
</script>

在这个示例中,我们在父组件的模板中使用了 ref 属性,并将其值设置为 “childRef”。然后,在组合式 API 的 setup 函数中,我们创建了一个名为 childRef 的响应式引用,并将其初始值设置为 null。接着,我们定义了一个名为 callChildMethod 的方法,用于调用子组件的 showMessage 方法。当用户点击按钮时,callChildMethod 方法会被调用,从而触发子组件的 showMessage 方法并在控制台输出一条消息。

import { reactive, toRef } from 'vue';
2
3const state = reactive({ count: 0 });
4const countRef = toRef(state, 'count'); // 提取出count属性的响应式引用

总结

总之,Vue3 的 ref 功能增强了Vue的响应式系统,使得开发者能够更灵活地处理组件的状态及组件间交互,同时提供了对DOM元素的直接访问能力。

人总是在接近幸福时倍感幸福,在幸福进行时却患得患失。

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue 3中,"ref"是一个函数,它可以在模板中使用来创建响应式的数据。"v-for"是Vue的指令之一,用于在模板中循环渲染数据。 在你提供的代码中,"v-for"指令被用于遍历"visitedViews"数组,并在每次迭代中创建一个"router-link"组件。每个"router-link"组件都有一个"ref"属性设置为"tag",这样就可以通过引用来访问这些组件。 在"moveToCurrentTag"方法中,通过使用"$refs"来获取所有带有"ref"属性为"tag"的组件,并使用"$nextTick"来确保DOM已经更新。然后遍历每个"tag",判断它的路径是否与当前路由路径匹配。如果匹配,则调用"$refs.scrollPane.moveToTarget(tag)"来将滚动面板移动到当前标签。如果路径不匹配,则使用"$store.dispatch"方法触发"tagsView/updateVisitedView" action来更新访问的视图。 总结起来,这段代码展示了在Vue中使用"ref"和"v-for"的示例。"ref"用于引用组件,而"v-for"用于在模板中循环渲染数据。这个代码片段还展示了如何在Vue方法中使用引用来操作组件和触发其他行为。<span class="em">1</span><span class="em">2</span> #### 引用[.reference_title] - *1* [vue学习笔记 VUE3 v-for 中使用ref](https://blog.csdn.net/xjcwzp/article/details/118763941)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [浏览器显示数据库中数据的条形图柱状图 前后端分离vue.js+spring boot 计算机软件工程课程设计毕业设计 ...](https://download.csdn.net/download/Amzmks/88275824)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值