Vue3--ref 和 $refs 的使用

简介: Vue3--ref 和 $refs 的使用

ref 介绍


  • ref 被用来给元素或子组件注册引用信息, 引用信息将会注册在父组件的 $refs 对象上,如果是在普通的DOM元素上使用,引用指向的就是 DOM 元素,如果是在子组件上,引用就指向组件的实例。
  • $refs是一个对象,持有已注册过 ref的所有的子组件。

ref 有三种用法:

  • ref 加在普通的元素上,用this.$refs.name获取到的是dom元素
  • ref 加在子组件上,用this.$refs.name获取到的是组件实例,可以使用组件的所有方法
  • 利用 v-for 和 ref 获取一组数组或者dom 节点

ref 需要在dom渲染完成后才会有,在使用的时候确保dom已经渲染完成。比如在生命周期mounted(){}钩子中调用,或者在 this.$nextTick(()=>{})中调用。

子组件

<template>
  <div>
      <div>按钮</div>
  </div>
</template>
<script>
export default {
  data() {
    return {
        datalist:[1,2,3,4],
        name:"邹邹"
    };
  },
  methods: {
      save(){
          alert('save')
          console.log('save')
      },
      test(){
          alert('test')
      }
  },
};
</script>

父组件

<template>
    <div>
       <test ref='hello'/>   <!-- 给子组件绑定了一个 ref='hello' 的属性,就可以通过 this.$refs.hello 获取子组件里的数据了 -->
       <button @click="hangleclick()">提交</button>
    </div>
</template>
<script>
import Test from './test1'  
    export default {
      components:{ Test }, // 声明子组件
        data(){
            return{
                num: 1
            }
        },
        methods:{
          hangleclick(){
            console.log("datalist",this.$refs.hello.datalist)  // 调用子组件的 datalist 数据
            console.log("name",this.$refs.hello.name)  // 调用子组件的 name 数据
            this.$refs.hello.save()  // 调用子组件的 save 函数
            this.$refs.hello.test()  // 调用子组件的 test 函数
          }
        }
    }
</script>

点击页面上的按钮,查看控制台输出,可以看到在父组件里调用了子组件的数据和方法


setup 中使用 ref 和 $refs


上面中是在 options 中使用了 ref 和 $ refs ,但在 setup 中,是没有 this 的,那如何获取子组件的数据呢?可以在元素上绑定 ref 属性

子组件

<template>
  <div>
    <div>按钮</div>
  </div>
</template>
<script setup lang="ts">
import { ref, reactive } from "vue"; // 导入
const name = ref("邹邹");
const datalist = reactive([1, 2, 3, 4]);
const save = () => {
  alert("save");
  console.log("save函数执行了");
};
const test = () => {
  alert("test函数执行了");
};
// 父组件使用的话需要导出
defineExpose({
  name,
  datalist,
  save,
  test
});
</script>

父组件

<template>
  <div>
    <child ref="childFormRef" />
    <!-- 给子组件绑定了一个 ref='childFormRef'  -->
    <button @click="handleclick()">提交</button>
  </div>
</template>
<script setup lang="ts">
import Child from "./child.vue";
import { ref } from "vue"; // 导入
const childFormRef: any = ref<InstanceType<typeof Child>>(); // 实例化
const num = ref(1);
const handleclick = () => {
  console.log("name", childFormRef.value.name);
  console.log("datalist:", childFormRef.value.datalist); // 调用子组件的 datalist 数据
  childFormRef.value.save(); // 调用子组件的 save 函数
  childFormRef.value.test(); // 调用子组件的 test 函数
};
</script>

这样就实现了在 setup 中使用 ref 和 $refs 了,效果和在 options 里的一样


相关文章
|
JavaScript
【Vue3】深入理解Vue中的ref属性
【Vue3】深入理解Vue中的ref属性
Vue3 父组件调用子组件方法($refs 在setup()、<script setup> 中使用)
Vue3 父组件调用子组件方法($refs 在setup()、<script setup> 中使用)
2876 0
Vue3 子/父组件相互调用
Vue3 子/父组件相互调用
753 0
|
存储 容器
Collectors.groupingBy分组后乱序问题
Collectors.groupingBy分组后乱序问题
在 setup 函数中使用 computed 计算属性
【10月更文挑战第23天】在 Vue3 中,`computed` 计算属性为我们提供了一种方便且高效的方式来处理基于其他响应式数据的派生数据。在 `setup` 函数中使用 `computed` 计算属性,可以让我们更好地组织和管理组件的逻辑。
|
JavaScript
rollup的input配置和output配置详解
【8月更文挑战第5天】rollup的input配置和output配置详解
640 4
rollup的input配置和output配置详解
|
JavaScript API
vue3父子组件相互调用方法详解
vue3父子组件相互调用方法详解
10081 10
|
API
Vue3组件通信全解析:利用props、emit、provide/inject跨层级传递数据,expose与ref实现父子组件方法调用
Vue3组件通信全解析:利用props、emit、provide/inject跨层级传递数据,expose与ref实现父子组件方法调用
4743 0
|
JSON Java 数据格式
SpringBoot 实战:在 RequestBody 中优雅的使用枚举参数(原理篇)
在优雅的使用枚举参数(原理篇)中我们聊过,Spring对于不同的参数形式,会采用不同的处理类处理参数,这种形式,有些类似于策略模式。
1097 0
SpringBoot 实战:在 RequestBody 中优雅的使用枚举参数(原理篇)
uniapp实战 —— 轮播图【自定义指示点】(含组件封装,自动注册全局组件,添加全局组件类型声明)
uniapp实战 —— 轮播图【自定义指示点】(含组件封装,自动注册全局组件,添加全局组件类型声明)
899 1

热门文章

最新文章