Vue中动态绑定Ref的两种方式总结

 更新时间:2024年09月06日 09:51:52   作者:火星大蜘蛛  
Vue3中的ref是一种创建响应式引用的方式,它在Vue生态系统中扮演着重要角色,下面这篇文章主要给大家介绍了关于Vue中动态绑定Ref的两种方式,需要的朋友可以参考下

前言

项目中ref绑定是常用的操作,那么如何实现动态绑定ref并实现动态获取呢?动态绑定的进阶写法又该如何使用?

比如以下需求:

需求:用户动态创建多个空白表单,提交时需要获取当前所有表单数据。

一、方式一:利用模板字符串

以下方法定义 Ref 时定义到this.refs中的形式为数组,这里我们打印一下所有的ref:

可以看到打印的Ref为数组形式,因此在调用时应该加上数组下标

此代码如下(示例):

// Html部分(定义Ref)
:ref="'planRef'+item.id"或者
:ref="`planRef${item.id}`"
// Js部分(回调Ref)
this.$refs[`planRef${item.id}`][0].xxx;

二、方式二:利用箭头函数传入

1.基本声明

在传入 Ref 时直接传入计算函数,通过此函数再将创建的 Ref 保存到指定位置,在后续调用时就无需使用模板字符串,更直观也更方便。

代码如下(示例):

// Html部分(定义Ref)
:ref="getPlanRef"
// Js部分(定义Ref)、
// 定义存储计划Ref的位置,并且在回调时无需再使用this.$refs
const planRef = ref([]);
// 定义计算函数方法,将Ref存储
const getPlanRef = (el) => el && planRef.value.push(el);

2.回调Ref

在回调刚刚定义的 Ref 时直接通过xxx.value[ 下标 ]的形式即可

代码如下(示例):

// index即为存储时的顺序
planRef.value[index].方法

3.Ref重复存储问题

在实际使用时,用户动态新增表单即动态新增或删除 Ref 时 Vue 会触发响应更新 Dom ,而我们存储 Ref 的位置(planRef)并未重置,那么页面更新后的 Ref 列表将会再次 Push 到 planRef 中,那么就会导致 planRef 中出现重复存储的 Ref 。

解决思路一:在对Ref进行新增或删除操作时先删除当前存储Ref位置的数据,参考代码如下:

// Ref新增方法
function addPlan() {  
  // 清除存储Ref位置的数据,因为Dom改变会重新获取
  planRef.value.length = 0;
  // 新增空计划表
  planList.value.push( 表初始数据 );
  // 提示语
  modal.msgSuccess('操作成功');
}
// Ref删除方法
function deletePlan(index) {
  // 清除存储Ref位置的数据,因为Dom改变会重新获取
  planRef.value.length = 0;
  // 移除需要删除的计划表
  planList.value.splice(index, 1);
  // 提示语
  modal.msgSuccess('操作成功');
}

解决思路二(未实践):在 Html 部分利用声明 key 值来避免所有 Dom 动态更新,但删除时就需要对存储 Ref 位置的数据进行修改,将要删除的 Ref 进行移除,这个解决方法仅思路分享不知道是否可行。

附:ref在vfor中的使用

ref用在v-for内部时通过this.$refs.name获得的为一个数组,可知ref不同于id唯一标识,可以对同类型的dom采用相同的命名,通过vfor的下标获得具体指向的dom元素

<!-- ref='menuItem'-->
<div ref="menuItem" class="menu_item" v-for="(item,index) in menuData" :key="item.id"
     @click="clickMenu(index)">
  <div class="menu_item_title">
    {{ item.name }}
  </div>
</div>
export default {
  name: 'demo',
  components: {},
  data() {
    return {
      menuData: [
        {id: '0001', name: '菜单一'},
        {id: '0002', name: '菜单二'},
        {id: '0003', name: '菜单三'},
      ],
    }
  },

  watch: {},
  computed: {},
  created() {
  },
  mounted() {
    console.log(this.$refs);
  },

  methods: {
    clickMenu: function (index) {
      //this.$refs['menuItem'][0]、this.$refs['menuItem'][1]、this.$refs['menuItem'][2]分别对应页面三个dom
      console.log("点击了下标:" + index, this.$refs['menuItem'][index]);
    }
  }
}

总结

以上为实际项目中遇到的需求与思路,以及遇到的一些问题,希望我的分享对您有帮助。

到此这篇关于Vue中动态绑定Ref的两种方式的文章就介绍到这了,更多相关Vue动态绑定Ref方式内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • vue+webrtc(腾讯云) 实现直播功能的实践

    vue+webrtc(腾讯云) 实现直播功能的实践

    本文主要介绍了vue+webrtc(腾讯云) 实现直播功能的实践,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-11-11
  • Vue3中shallowRef和shallowReactive的性能优化

    Vue3中shallowRef和shallowReactive的性能优化

    Vue3中shallowRef和shallowReactive是浅层响应式API,用于性能优化,仅追踪对象或数组第一层属性的变化,本文就来详细的介绍一下具体的使用,感兴趣的可以了解一下
    2024-09-09
  • VUE登录注册页面完整代码(直接复制)

    VUE登录注册页面完整代码(直接复制)

    这篇文章主要给大家介绍了关于VUE登录注册页面的相关资料,在Vue中可以使用组件来构建登录注册页面,文中通过图文以及代码介绍的非常详细,需要的朋友可以参考下
    2023-12-12
  • Vue实现简易计算器

    Vue实现简易计算器

    这篇文章主要为大家详细介绍了用Vue制作的简易计算器,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-02-02
  • vue项目使用js监听浏览器关闭、刷新及后退事件的方法

    vue项目使用js监听浏览器关闭、刷新及后退事件的方法

    这篇文章主要给大家介绍了关于vue项目使用js监听浏览器关闭、刷新及后退事件的相关资料,文中通过代码介绍的非常详细,对大家学习或者使用vue具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-09-09
  • vue如何获取当前url地址加端口号

    vue如何获取当前url地址加端口号

    这篇文章主要介绍了vue如何获取当前url地址加端口号问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-09-09
  • element-ui之关于组件BackToTop回到顶部的使用

    element-ui之关于组件BackToTop回到顶部的使用

    这篇文章主要介绍了element-ui之关于组件BackToTop回到顶部的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-03-03
  • Vue.js之VNode的使用

    Vue.js之VNode的使用

    这篇文章主要介绍了Vue.js之VNode的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04
  • vue实现zip文件下载

    vue实现zip文件下载

    这篇文章主要为大家详细介绍了vue实现zip文件下载,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-08-08
  • Vue3.0 响应式系统源码逐行分析讲解

    Vue3.0 响应式系统源码逐行分析讲解

    这篇文章主要介绍了Vue3.0 响应式系统源码逐行分析讲解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-10-10

最新评论