vue动态绑定ref(使用变量)以及获取方式

目录
  • vue动态绑定ref及获取
    • 一起来看下代码吧
  • ref三种使用方法
    • ref

vue动态绑定ref及获取

正常情况,我们需要在vue中获得某个dom或者组件,我们会通过绑定 ref 然后通过绑定后的名字来获取这个dom 。

但是,如果我们在v-for中绑定ref的话,那么这个ref就会存在多个,比如我们点击事件让对应的显示/隐藏的话,我们很难找到这个对应的元素。

那么,这时我们需要动态绑定不一样的ref(比如 Arr1、Arr2、Arr3这种),那么我们如何实现呢?

一起来看下代码吧

<div class="videoList">
                <el-tree
                    :data="videoData"
                    :highlight-current="false"
                    :props="defaultProps"
                    @node-click="handleNodeClick"
                    @node-expand="handleNodeExpand"
                    @node-collapse="handleNodeCollapse"
                    :filter-node-method="filterNode"
                    class="rd-surveillance-tree"
                    :indent="0"
                    ref="tree"
                >
                    <span class="custom-tree-node" slot-scope="{ node, data }">
                        <span class="custom-tree-label" :title="node.label">
                            <i
                                class="iconfont"
                                :class="data.rtmp ? rtmpClass : iconClass"
                                :style="{
                                    color: data.rtmp ? '#00b7ff' : '#fff',
                                    fontSize: data.rtmp ? '24px' : '14px',
                                }"
                            ></i>
                            {{ node.label }}
                        </span>
                        <span class="custom-tree-player" v-if="!data.rtmp">{{
                            data.children.length
                        }}</span>
                        <img
                            class="custom-tree-player rtmpVideo"
                            v-else
                            src="../../../static/images/videoSurveillance/videoSurveillancePlay.png"
                            @click="playVideo(data)"
                            :ref="'playBtn' + data.id"
                        />
                    </span>
                </el-tree>
            </div>

这里可以看下最下面的图片,图片是个播放按钮,我需要点击播放按钮,播放当前的视频,这里通过slot-scope绑定每一个对应的数据(可以变相的理解为v-for循环),采用饿了么的组件库

那么我们点击对应的图片按钮,就得播放对应的视频,那么我们得获取到对应的dom元素,如果绑定同样的ref的话,那么就很难找到指定点击对应的视频源

这里采取动态绑定ref ,命名采取 playBtn + (数据id) ,这样每个都会绑定不同的名字

注:这里说下比较坑的一点,我们一般字符串加变量都会采用如下写法

`playBtn${data.id}`

但是我们绑定ref的话是需要加冒号的,但是加了之后就不需要去再采取模板字符串的写法,直接在引号中写入即可。

然后这里说下怎么获取:

正常我们绑定是 ref="name" ,获取就是this.$refs.name ,这里的name是自己命名的,但是它会被默认为变量,然后去找取,而不是当做字符串处理

那么我们获取上面动态绑定的,就不能写 点 语法,可以采取方括号写法:

play(data){
    this.$refs[`playBtn${data.id}`].src =  require('../../../static/images/Pause.png');
}

data是上面图片绑定的点击事件传入的,获取到当前的data,然后获取到id,就可以找到指定的ref绑定的dom,然后改变播放状态即可。

注意:之前测试是不用加下标的,但是之后有次在另一个项目里写发现需要加下标,即 this.$refs[`playBtn${data.id}`][0] ,所以获取不到的时候不妨先打印下日志,检查下需不需要加下标,以及有没有获取到对应的ref。

看下饿了么改造的tree:

好了,如上就是动态绑定ref以及获取的方法。

ref三种使用方法

ref

  • - 给子元素绑定ref属性,这样父元素就能得到绑定了ref属性的元素/组件
  • - refs获取  得到的是一个集合
  • - refs要通过事件或者生命周期获取
    // 方法一: 字符串 (废弃)
    showRef=()=>{
        console.log(this.refs)
        //得到的是所有绑定了ref的元素/组件
    }
    render() {
        return (
            <div>
                父组件
                <button onClick={this.showRef}>获取ref</button>
                <Mother ref='mother' ></Mother>
            </div>
        )
    }
    // 方法二
    import React, { Component,createRef } from 'react'
    btn=createRef()
    showRef=()=>{
        // 输出ref 键名为current
        console.log(this.btn)
    }
    render() {
        return (
            <div>
                <button onClick={this.showRef}>获取ref</button>
                <Mother ref={this.btn} ></Mother>
            </div>
        )
    }
//方法三:
    change=()=>{
        console.log(this.inp)
    }
    render() {
        return (
            <div>
                <input
                type='text'
                onChange={this.change}
                ref={inp=>{this.inp=inp}}/>
            </div>
            //参数inp为当前标签dom元素,this指向组件
        )
    }

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • 一文详解Vue3中使用ref获取元素节点

    目录 静态绑定 onMounted nextTick watchEffect watch v-for中使用 动态绑定 ref设置函数 通过getCurrentInstance方法 获取vue实例 前言: 本文介绍在vue3的setup中使用composition API获取元素节点的几种方法: 静态绑定 仅仅需要申明一个ref的引用,用来保存元素,在template中,不必bind引用(:ref="domRef"),只需要声明一个同名的ref属性(ref="domRef&qu

  • vue3如何使用ref获取元素

    目录 vue3使用ref获取元素 vue3中ref的理解 1.什么是ref? 2.ref本质 3.ref注意点 4.ref获取元素 vue3使用ref获取元素 在vue2.x中,可以通过给元素添加ref='xxx'属性,然后在代码中通过this.$refs.xxx获取到对应的元素 然而在vue3中时没有$refs这个东西的,因此vue3中通过ref属性获取元素就不能按照vue2的方式来获取 vue3需要借助生命周期方法,原因很简单,在setup执行时,template中的元素还没挂载到页面上,所

  • 关于vue中ref的使用(this.$refs获取为undefined)

    目录 vue的ref(this.$refs获取为undefined) 1.你在哪里调用,和你调用的对象 2.调用对象是不是数组列表 3.调用对象是否和v-if结合使用 vue的$refs属性几个注意点 1.在vue中获取dom推荐使用$refs来获取 2.如果使用v-for vue的ref(this.$refs获取为undefined) 如果你获取到的总是空的,你注意一下: 1.你在哪里调用,和你调用的对象 试试在mounted()里面调用有效果没有 调用的对象是本来就存在的,还是需要数据渲染之

  • vue动态绑定ref(使用变量)以及获取方式

    目录 vue动态绑定ref及获取 一起来看下代码吧 ref三种使用方法 ref vue动态绑定ref及获取 正常情况,我们需要在vue中获得某个dom或者组件,我们会通过绑定 ref 然后通过绑定后的名字来获取这个dom . 但是,如果我们在v-for中绑定ref的话,那么这个ref就会存在多个,比如我们点击事件让对应的显示/隐藏的话,我们很难找到这个对应的元素. 那么,这时我们需要动态绑定不一样的ref(比如 Arr1.Arr2.Arr3这种),那么我们如何实现呢? 一起来看下代码吧 <div

  • vue动态绑定class的几种常用方式小结

    本文实例讲述了vue动态绑定class的几种常用方式.分享给大家供大家参考,具体如下: 对象方法 最简单的绑定(这里的active加不加单引号都可以,以下也一样都能渲染) :class="{ 'active': isActive }" 判断是否绑定一个active :class="{'active':isActive==-1}" 或者 :class="{'active':isActive==index}" 绑定并判断多个 第一种(用逗号隔开) :

  • Vue之封装公用变量以及实现方式

    阿西八!!!写久了Flutter,前端的知识真的是忘得差不多了,今天就来复习一下Vue中如何封装公用变量以及公用方法 以封装一个正则表达式为例! 第一步 创建我们的公用文件夹 我们来看一下utils.js中的代码 class PublicMethods{ constructor() { this.name = '公用变量' } verificationPhon(phone){ // 大陆手机号码11位数,匹配格式:前三位固定格式+后8位任意数 // 13+任意数 * 15+除4的任意数 * 18

  • Vue路由参数的传递与获取方式详细介绍

    目录 前言 1. 通过动态路由参数传递 2. 通过query字符串传递 3. props 隐式传递 前言 vue 页面路由切换时传参的方式有如下几种: 动态路由参数 它隐藏字段信息,相对于来说较安全,同时地址栏中的地址也相对较短 它必须是先定义后使用,一般用于根据固定参数,返回对应的数据所用 query字符串 ?id=1 通过search字符串的方式来在地址栏中传递数据,相对于来说地址栏会暴露字段信息安全性较低,一般用于搜索相关,它可以不定义就可以直接用 props 隐式传递 隐式传递,它一般用

  • VUE:vuex 用户登录信息的数据写入与获取方式

    整体思路: 前台获取用户数据,向后台发送post请求,验证成功后 前台接受数据,改变用户登录状态 将登录状态及用户数据写入到state中 这样多个页面就可以直接使用this.$store.getters.getuname调用state中的用户信息 1. 向后台发送请求,若成功返回用户名,密码,使用 this.$store.dispatch('setLogin', true);将数据写入到state中 页面:login.vue 代码: this.loginData = await getUserI

  • 根据tensor的名字获取变量的值方式

    需求: 有时候使用slim这种封装好的工具,或者是在做滑动平均时,系统会帮你自动建立一些变量,但是这些变量只有名字,而没有显式的变量名,所以这个时候我们需要使用那个名字来获取其对应的值. 如下: input = np.random.randn(4,3) net = slim.fully_connected(input,2,weights_initializer=tf.ones_initializer(dtype = tf.float32)) 这段代码看似简单,但其实帮你生成了一个w和一个b.如果

  • Vue使用Ref跨层级获取组件的步骤

    Vue使用Ref跨层级获取组件实例 示例介绍 在开发过程中,我们难免会使用到跨层级的ref实例获取,大部分情况下,我们都可以通过组件自身的parent或者children去找到需要的实例.但是当层级不明显或者太深的时候,用此方法难免过于臃肿和低效率. 如下图所示,我们通过组件E去获取组件D的组件实例. 文档目录结构 分别有A.B.C.D.E和index六个组件,并按照上图的组件顺序,分别插入到各自的页面中. 页面样式如下: 安装vue-ref 下载vue-ref npm install vue-

  • vue动态绑定v-model属性名方式

    目录 vue动态绑定v-model属性名 1.目标 2.方案 vue双向绑定原理(v-model) 表单绑定 组件使用v-model vue动态绑定v-model属性名 1.目标 首先配置列,根据配置渲染表单,每个表单项绑定配置中的属性 2.方案 <template v-for="(item) in showQueryColumns" > <el-col :key="item.prop" :xs = "24" :sm = &qu

  • vue动态绑定组件子父组件多表单验证功能的实现代码

    前端项目中经常会下拉或者选项卡,如果通过if,else或者switch去判断加载的话会产生大量冗余代码和变量定义,而且都写在一起后人很难维护. Vue核心在于组件,如果有内容通过选项卡或者下拉框切换用动态加载子组件最好不过. 如图: selects文件夹中,index只负责公共数据(当然公共数据也可以写在其他文件,只留一个入口文件),而comp文件夹中的几个组件则通过动态加载. 动态加载子组件:component // 给下拉框绑定下拉列表的索引 <el-select v-model="v

随机推荐