一、使用$ref特性获取DOM元素

  代码示例如下所示:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div id="app"></div>
<script type="text/javascript" src="./vue.js"></script>
<script type="text/javascript">
// 全域组件
Vue.component('subComp',{
template:`<div></div>`
}); var App={ // 局部组件创建
template:`<div>
<subComp ref="subc"></subComp>
<button ref="btn">我是按钮</button>
<p ref="sb">alex</p>
</div>`,
beforeCreate(){ // 在当前组件创建之前调用
console.log(this.$refs.btn); // 输出:undefined
},
created(){ // 在当前组件创建之后调用
console.log(this.$refs.btn); // 输出:undefined,此时this对象已经有refs属性,但是DOM还没有渲染进App组件中
},
beforeMount(){ // 装载数据到DOM之前会调用
console.log(this.$refs.btn); // 输出:undefined
},
mounted(){ // 装载数据到DOM之后会调用
console.log(this); // this是一个对象,包含refs属性$refs: {btn: button, sb: p}
console.log(this.$refs.btn); // <button>我是按钮</button>
// 如果是给组件绑定的ref=""属性那么this.$refs.subc取到的是组件对象
console.log(this.$refs.subc); var op = this.$refs.sb;
this.$refs.btn.onclick = function () {
console.log(op.innerHTML); // 点击按钮控制台输出:alex
}
},
}; new Vue({
el:'#app',
data(){
return{ }
},
template:`<App/>`,
components:{
App
}
}) </script>
</body>
</html>

1、ref特性为子组件赋予ID引用

  尽管存在 prop 和事件,有的时候你仍可能需要在 JavaScript 里直接访问一个子组件。

  为了达到这个目的,你可以通过 ref 特性为这个子组件赋予一个 ID 引用,如下所示:

<button ref="btn">我是按钮</button>
<p ref="sb">alex</p>

2、通过this.$refs.btn访问 <button> 实例

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

  beforeCreate在当前组件创建之前调用,此时输出肯定为undefined。但是后面created方法是在组件创建之后调用,此时打印this可以发现里面也已经有了refss属性,但是这个时候DOM还没有渲染进App组件中,这里涉及到了一个虚拟DOM的概念。直到mounted方法,装载数据到DOM之后才会正常显示出this.$refs.btn内容。

mounted(){   // 装载数据到DOM之后会调用
console.log(this); // this是一个对象,包含refs属性$refs: {btn: button, sb: p}
console.log(this.$refs.btn); // <button>我是按钮</button>

3、给组件绑定的ref属性

// 全域组件
Vue.component('subComp',{
template:`<div></div>`
}); var App={ // 局部组件创建
template:`<div>
<subComp ref="subc"></subComp>
<button ref="btn">我是按钮</button>
<p ref="sb">alex</p>
</div>`,
// 省略代码
mounted(){ // 装载数据到DOM之后会调用
console.log(this); // this是一个对象,包含refs属性$refs: {btn: button, sb: p}
console.log(this.$refs.btn); // <button>我是按钮</button> // 如果是给组件绑定的ref属性那么this.$refs.subc取到的是组件对象
console.log(this.$refs.subc); var op = this.$refs.sb;
this.$refs.btn.onclick = function () {
console.log(op.innerHTML); // 点击按钮控制台输出:alex
}
},
};

  如果是给组件绑定的ref属性,那么this.$refs.subc取到的是组件对象。

4、输出效果  

  

二、常用$属性

$refs:获取组件内的元素

$parent:获取当前组件的父组件

$children:获取当前组件的子组件

$root:获取New Vue的实例化对象

$el:获取组件对象的DOM元素

三、获取更新之后的DOM添加事件的特殊情况

1、DOM更新策略

  vue实现响应式并不是数据发生变化后DOM立刻发生变化,而是按照一定的策略进行DOM的更新。

(1)配置v-if数据属性显示focus(焦点)

  在页面上制作一个input输入框,在页面加载时就让该输入框获取焦点

<body>
<div id="app"></div>
<script type="text/javascript" src="./vue.js"></script>
<script type="text/javascript"> var App={ // 局部组件创建
data(){
return{
isShow:true
}
},
template:`<div>
<input type="text" v-if="isShow" ref="fos"/>
</div>`,
mounted(){ // 装载数据到DOM之后会调用
// focus()方法用于给予该元素焦点
this.$refs.fos.focus();
}
}; new Vue({
el:'#app',
data(){
return{ }
},
template:`<App/>`,
components:{
App
}
})
</script>
</body>

  页面加载时就让该输入框获取焦点,显示效果如下:

  

(2)修改v-if数据属性看DOM是否发生变化

<body>
<div id="app"></div>
<script type="text/javascript" src="./vue.js"></script>
<script type="text/javascript"> var App={ // 局部组件创建
data(){
return{
isShow:false
}
},
template:`<div>
<input type="text" v-if="isShow" ref="fos"/>
</div>`,
mounted(){ // 装载数据到DOM之后会调用
// vue实现响应式并不是数据发生变化后DOM立刻发生变化,而是按照一定的策略进行DOM的更新。 // $nextTick是在下次DOM更新循环结束之后执行的延迟回调,在修改数据之后使用这个方法则可以在回调中获取更新之后的DOM this.isShow = true;
console.log(this.$refs.fos); // 输出undefined
// focus()
this.$refs.fos.focus(); // focus() 方法用于给予该元素焦点。 }
}; new Vue({
el:'#app',
data(){
return{ }
},
template:`<App/>`,
components:{
App
}
}) </script>
</body>

  显示效果如下:

  

2、$nextTick方法

  $nextTick是在下次DOM更新循环结束之后执行的延迟回调,在修改数据之后使用这个方法则可以在回调中获取更新之后的DOM。

<body>
<div id="app"></div>
<script type="text/javascript" src="./vue.js"></script>
<script type="text/javascript"> var App={ // 局部组件创建
data(){
return{
isShow:false
}
},
template:`<div>
<input type="text" v-if="isShow" ref="fos"/>
</div>`,
mounted(){ // 装载数据到DOM之后会调用
// vue实现响应式并不是数据发生变化后DOM立刻发生变化,而是按照一定的策略进行DOM的更新。 // $nextTick:
// 是在下次DOM更新循环结束之后执行的延迟回调,在修改数据之后使用这个方法则可以在回调中获取更新之后的DOM this.isShow = true;
console.log(this.$refs.fos); // 输出undefined
// focus()
// this.$refs.fos.focus(); // focus() 方法用于给予该元素焦点。
this.$nextTick(function () {
// 回调函数中获取更新之后真实的DOM
this.$refs.fos.focus();
})
}
}; new Vue({
el:'#app',
data(){
return{ }
},
template:`<App/>`,
components:{
App
}
}) </script>
</body>

  显示效果如下所示:

  

vue的一些特殊特性的更多相关文章

  1. vue 3.0 体验,vue 3.0新特性

    前言 昨天不是尤雨溪 不是刚在B站 直播玩了,分享了vue-next v3.0.0-beta.1 版本 哈哈, 不要太刺激哦 6大亮点 Performance:性能更比Vue 2.0强. Tree s ...

  2. 详解vue组件的is特性:限制元素&动态组件

    在vue.js组件教程的一开始提及到了is特性 意思就是有些元素,比如 ul 里面只能直接包含 li元素,像这样: <ul> <li></li> </ul&g ...

  3. vue总结 01基础特性

    最近有时间来总结一下vue的知识: 一.vue.js 被定义成一个开发web界面的前端库,是一个非常轻量的工具.vue.js本身具有响应式和组件化的特点. 我们不需要在维护视图和数据的统一上花费大量的 ...

  4. vue组件的is特性

    组件功能是vue项目的一大特色.组件可以扩展html元素,可以封装可重用的代码,可以增加开发效率.它是自定义元素,vue.js的编译器为它添加特殊功能.有些情况,组件也可以是原生HTML元素的形式,以 ...

  5. vue中的重要特性

    一.vue中的自定义组件 html的代码: <!DOCTYPE html> <html lang="en"> <head> <meta c ...

  6. vue.js用法和特性详解

      前  言 最近用Vue.js做了一个数据查询平台,还做了一个拼图游戏,突然深深的感到了vue的强大. Vue.js是一套构建用户界面(user interface)的渐进式框架.与其他重量级框架不 ...

  7. vue 组件属性props,特性驼峰命名,连接线使用

    网址:https://www.cnblogs.com/alasq/p/6363160.html 总结如下:vue的组件的props属性支持驼峰命名,不支持连接线命名,使用是用连接线进行赋值或者数据绑定 ...

  8. vue 3.0新特性

    参考:  https://www.cnblogs.com/Highdoudou/p/9993870.html https://www.cnblogs.com/ljx20180807/p/9987822 ...

  9. VUE学习,is 特性,转载来源:https://segmentfault.com/q/1010000007205176/

随机推荐

  1. [jvm]基于jvm的线程实现

    一.线程的实现 学过操作系统的肯定都知道: 进程:是并发执行的程序在执行过程中分配和管理资源的基本单位,是一个动态概念,竞争计算机系统资源的基本单位. 线程:是进程的一个执行单元,是进程内可调度实体. ...

  2. 【python跨目录调用】结合自己遇到的问题到解决问题,作个记录

    写PO的时候,想把page和case 文件分开存不同的文件夹,但是在调用模块的时候就出现了问题.后来终于解决了,记录下 ---------------------------------------- ...

  3. Centos7服务器启动jar包项目最佳方式

    jar后台运行:nohup java -jar xx.jar >/dev/null & 此处的“>/dev/null”作用是将终端输出信息输出到空洞中,即不保存输出信息,若要查看输 ...

  4. Domoticz 中接入斐讯 M1 空气质量检测仪

    前言 M1 是翻车讯出的一款空气质量检测仪,如今斐讯的服务器经常连不上了,M1 不动动手接到 Domoticz 怕是变成摆设了.教程参考了这里和官方的 Using Python plugins. 步骤 ...

  5. IDEA 在 专注模式下 显示 行号 和 缩进线...

    16down voteaccepted +50 Open the settings and navigate to Editor > General > Appearance and ti ...

  6. [转] open-falcon编写的整个脑洞历程

    [From] https://mp.weixin.qq.com/s?__biz=MjM5OTcxMzE0MQ==&mid=400225178&idx=1&sn=c98609a9 ...

  7. [转] 利用CORS实现跨域请求

    [From] http://newhtml.net/using-cors/ 跨域请求一直是网页编程中的一个难题,在过去,绝大多数人都倾向于使用JSONP来解决这一问题.不过现在,我们可以考虑一下W3C ...

  8. 日志统计--蓝桥杯--vector

    /* 标题:日志统计 小明维护着一个程序员论坛.现在他收集了一份"点赞"日志,日志共有N行.其中每一行的格式是: ts id 表示在ts时刻编号id的帖子收到一个"赞&q ...

  9. ibatis配置文件中的XML解析错误The content of elements must consist of well-formed character data or markup.

    在检查过所有的标签名都没有问题的情况下. xml中的小于号属于非法字符. SQL语句中则可能需要小于号,此时就需要用<![CDATA[  ]]>将小于号包裹,如此不会被xml解析器解析. ...

  10. mongodb的增删改查

    show dbs 显示所有有数据的数据库 use dbname:如use ela; 如果指定的数据库不存在,就会创建,否则就会切到该数据库上. db 显示当前数据库 db.dropDatabase() ...