Vue---- ref 引用

简介: Vue---- ref 引用

ref 引用

1. ref 引用

ref 用来辅助开发者在不依赖于 jQuery 的情况下,获取 DOM 元素或组件的引用。

每个 vue 的组件实例上,都包含一个 $refs对象,里面存储着对应的 DOM 元素或组件的引用。默认情况下,组件的 $refs指向一个空对象。

<template>
  <div>
    <h1>App 组件</h1>
    <hr>
    <button @click="getRef"> 获取 $ref </button>
  </div>
</template>
<script>
export default {
  name: 'App',
  methods: {
    getRef() {
      console.log( this )
    }
  }
}
</script>
<style>
</style>

<template>
  <div>
    <h1>App 组件</h1>
    <hr>
    <button @click="getRef"> 获取 $ref </button>
  </div>
</template>
<script>
export default {
  name: 'App',
  methods: {
    getRef() {
      console.log( this.$refs )
    }
  }
}
</script>
<style>
</style>

2. 使用 ref 引用 DOM 元素

使用 ref 引用页面上的 DOM 元素。

<template>
  <div>
    <!-- 使用 ref 属性,为对应的 DOM 元素添加引用名称 -->
    <h1 ref="myh1">App 组件</h1>
    <hr>
    <button @click="getRef"> 获取 $ref </button>
    <br>
    <button @click="change"> App change </button>
  </div>
</template>
<script>
export default {
  name: 'App',
  methods: {
    getRef() {
      console.log( this.$refs )
    },
    change() {
    // 通过 this.$refs.引用名称 获取对应 DOM 元素的引用
      console.log( this.$refs.myh1 )
      // 改变 h1 的字体颜色
      this.$refs.myh1.style.color = 'red'
    }
  }
}
</script>
<style>
</style>

3. 使用 ref 引用组件实例

使用 ref 引用页面上的组件实例。

与 DOM 元素一样,使用 ref 属性,为对应的组件添加引用名称。通过 this.$refs.引用名称 获取对应组件的引用。

<template>
  <div>
    <h3>Count 组件</h3>
    <div> {{count}} </div>
  </div>
</template>
<script>
export default {
  name: 'Count',
  data() {
    return {
      count: 0
    }
  },
  methods: {
    add() {
      this.count++
    }
  }
}
</script>
<style>
</style>
<template>
  <div>
    <!-- 使用 ref 属性,为对应的 DOM 元素添加引用名称 -->
    <h1 ref="myh1">App 组件</h1>
    <hr>
    <button @click="getMyCount"> get myCount </button>
    <Count ref="myCount"></Count>
  </div>
</template>
<script>
import Count from './Count.vue'
export default {
  name: 'App',
  methods: {
    getMyCount() {
      console.log( this.$refs.myCount )
    }
  },
  components: {
    Count
  }
}
</script>
<style>
</style>

调用组件内定义的方法

<template>
  <div>
    <!-- 使用 ref 属性,为对应的 DOM 元素添加引用名称 -->
    <h1 ref="myh1">App 组件</h1>
    <hr>
    <button @click="getMyCount"> get myCount </button>
    <button @click="countAdd"> count +1 </button>
    <Count ref="myCount"></Count>
  </div>
</template>
<script>
import Count from './Count.vue'
export default {
  name: 'App',
  methods: {
    getMyCount() {
      console.log( this.$refs.myCount )
    },
    countAdd() {
      // 调用组件内定义的 add 方法
      this.$refs.myCount.add()
    }
  },
  components: {
    Count
  }
}
</script>
<style>
</style>

4. 控制文本框和按钮的按需切换 & 让文本框自动获得焦点

通过布尔值 inputVisible 来控制组件中的文本框与按钮的按需切换。

当文本框展示出来之后,如果希望它立即获得焦点,则可以为其添加 ref 引用,并调用原生 DOM 对象的

.focus() 方法即可。

<template>
  <div>
    <!-- 使用 ref 属性,为对应的 DOM 元素添加引用名称 -->
    <h1 ref="myh1">App 组件</h1>
    <hr>
    <input type="text" v-show="inputVisible" ref="myipt">
    <button @click="ipt_change">ipt change</button>
  </div>
</template>
<script>
import Count from './Count.vue'
export default {
  name: 'App',
  data() {
    return {
      inputVisible: false
    }
  },
  methods: {
    ipt_change() {
      this.inputVisible = !this.inputVisible
      this.$refs.myipt.focus()
    }
  },
  components: {
    Count
  }
}
</script>
<style>
</style>

此时切换输入框的显示状态,不能实现聚焦。因为this.$refs.myipt.focus()执行时候,组件还未显示在页面上。所以无法实现聚焦,this.$refs.myipt.focus()的执行速度快于元素的显示。

5. this.$nextTick(cb) 方法

组件的 $nextTick(cb) 方法,会把 cb 回调推迟到下一个 DOM 更新周期之后执行。

通俗的理解是:

等组件的DOM 异步地重新渲染完成后,再执行 cb 回调函数。从而能保证 cb 回调函数可以操作到最新的 DOM 元素。

对上述代码进行修改:

methods: {
    ipt_change() {
      this.inputVisible = !this.inputVisible
      //组件的DOM 异步地重新渲染完成后,再执行 cb 回调函数。
      this.$nextTick( ()=>{
        this.$refs.myipt.focus()
      } )
    }
  },
<template>
  <div>
    <!-- 使用 ref 属性,为对应的 DOM 元素添加引用名称 -->
    <h1 ref="myh1">App 组件</h1>
    <hr>
    <input type="text" v-show="inputVisible" ref="myipt">
    <button @click="ipt_change">ipt change</button>
  </div>
</template>
<script>
import Count from './Count.vue'
export default {
  name: 'App',
  data() {
    return {
      inputVisible: false
    }
  },
  methods: {
    ipt_change() {
      this.inputVisible = !this.inputVisible
      this.$nextTick( ()=>{
        this.$refs.myipt.focus()
      } )
    }
  },
  components: {
    Count
  }
}
</script>
<style>
</style>


相关文章
|
8天前
|
JavaScript 前端开发 开发者
Vue中的class和style绑定
在 Vue 中,class 和 style 绑定是基于数据驱动视图的强大功能。通过 class 绑定,可以动态更新元素的 class 属性,支持对象和数组语法,适用于普通元素和组件。style 绑定则允许以对象或数组形式动态设置内联样式,Vue 会根据数据变化自动更新 DOM。
|
8天前
|
移动开发 JavaScript API
Vue Router 核心原理
Vue Router 是 Vue.js 的官方路由管理器,用于实现单页面应用(SPA)的路由功能。其核心原理包括路由配置、监听浏览器事件和组件渲染等。通过定义路径与组件的映射关系,Vue Router 将用户访问的路径与对应的组件关联,支持哈希和历史模式监听 URL 变化,确保页面导航时正确渲染组件。
|
8天前
|
JavaScript 前端开发 数据安全/隐私保护
Vue Router 简介
Vue Router 是 Vue.js 官方的路由管理库,用于构建单页面应用(SPA)。它将不同页面映射到对应组件,支持嵌套路由、路由参数和导航守卫等功能,简化复杂前端应用的开发。主要特性包括路由映射、嵌套路由、路由参数、导航守卫和路由懒加载,提升性能和开发效率。安装命令:`npm install vue-router`。
|
11天前
|
监控 JavaScript 前端开发
ry-vue-flowable-xg:震撼来袭!这款基于 Vue 和 Flowable 的企业级工程项目管理项目,你绝不能错过
基于 Vue 和 Flowable 的企业级工程项目管理平台,免费开源且高度定制化。它覆盖投标管理、进度控制、财务核算等全流程需求,提供流程设计、部署、监控和任务管理等功能,适用于企业办公、生产制造、金融服务等多个场景,助力企业提升效率与竞争力。
66 12
|
29天前
|
JavaScript 安全 API
iframe嵌入页面实现免登录思路(以vue为例)
通过上述步骤,可以在Vue.js项目中通过 `iframe`实现不同应用间的免登录功能。利用Token传递和消息传递机制,可以确保安全、高效地在主应用和子应用间共享登录状态。这种方法在实际项目中具有广泛的应用前景,能够显著提升用户体验。
58 8
|
30天前
|
存储 设计模式 JavaScript
Vue 组件化开发:构建高质量应用的核心
本文深入探讨了 Vue.js 组件化开发的核心概念与最佳实践。
77 1
|
2月前
|
JavaScript
vue使用iconfont图标
vue使用iconfont图标
151 1
|
2月前
|
JavaScript 关系型数据库 MySQL
基于VUE的校园二手交易平台系统设计与实现毕业设计论文模板
基于Vue的校园二手交易平台是一款专为校园用户设计的在线交易系统,提供简洁高效、安全可靠的二手商品买卖环境。平台利用Vue框架的响应式数据绑定和组件化特性,实现用户友好的界面,方便商品浏览、发布与管理。该系统采用Node.js、MySQL及B/S架构,确保稳定性和多功能模块设计,涵盖管理员和用户功能模块,促进物品循环使用,降低开销,提升环保意识,助力绿色校园文化建设。
|
3月前
|
JavaScript API 开发者
Vue是如何进行组件化的
Vue是如何进行组件化的
|
3月前
|
JavaScript 前端开发 开发者
Vue是如何进行组件化的
Vue是如何进行组件化的

热门文章

最新文章