Skip to content

处理边界情况

ref是Vue实例vm的property

访问元素 & 组件

访问根实例

访问父级组件实例

访问子组件实例或子元素

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

vm.ref 方法

返回一个对象,这个对象包含注册过 ref attribute 的所有 DOM 元素和组件实例。

javascript
表达式的值:string

1 ref 被用来给元素或子组件注册引用信息。
2 引用信息将会注册在父组件的 $refs 对象上。=== vm.$refs也可以访问
3 如果在普通的 DOM 元素上使用,引用指向的就是 DOM 元素;
4 如果用在子组件上,引用就指向组件实例:
5 没有设置ref属性时,对象为空
javascript
Vue()实例vm.refs()返回一个对象 
{ref名:对应标签,...}
{inp:input,my:div,btn:button,base:VueComponent}

//html
<div id="app">
    <input type="text" ref="inp">
    <div ref="my">my</div>
    <button ref="btn" @click="fn">点我</button> 
    <base-input ref="base"></base-input>
</div>
 
 
//Vue实例
new Vue({
    methods:{
        fn(e){
        // <button></button>
        console.log('通过event获取DOM对象',e.target);  
        // <button></button>
        console.log('通过document获取DOM对象',document.querySelector("button"));
        // Vue()实例vm
        console.log('this指向',this); 
        // Vue()实例vm.refs()返回一个对象 {ref名:对应标签,...}
        console.log('$ref获取DOM对象',this.$refs);
        // <button></button>
        console.log('通过$ref方法获取DOM对象',this.$refs.btn);
        // value的值
        console.log('通过$ref方法获取DOM对象属性值',this.$refs.inp.value)
	 }
   },
})

ref和v-for

refv-for 一起使用的时候,你得到的 ref 将会是一个包含了对应数据源的这些子组件的数组。

html
// html
<div id="app">
    <ul>
        <li ref="hololive" v-for="arr in arrs" :key="arr">{{arr}}</li>
    </ul>
</div>
javascript
// script
new Vue({
    el:'#app',
    data:{
        arrs:["Minato Aqua","Shirakami Fubuki","Nakiri Ayame","Akai Haato"],
    },
    methods:{
    },
    mounted(){
        // 选择遍历后的第一个元素 li
        console.log(this.$refs.hololive[0])
    }

$refs 只会在组件渲染完成之后生效,并且它们不是响应式的。这仅作为一个用于直接操作子组件的“逃生舱”——你应该避免在模板或计算属性中访问 $refs

ref和组件

子组件上的ref引用信息将会注册在父组件的 $refs 对象上。=== vm.$refs可以得到子组件实例。

javascript
Vue.component("hanser",{
   data(){
      return{
          num:1
      }
  },
  template:(`
  <button @click="num++">{{num}}</button>
  `),
})

new Vue({
    el:'#app',
    data:{
        arrs:["Minato Aqua","Shirakami Fubuki","Nakiri Ayame","Akai Haato"],
    },
    methods:{
        fn(){
            this.$refs.hanserRef.num++;
            console.log(this); // vm.$ref() 返回{hanserRef:VueComponent}
        },
    },
})
html
<div id="app">
    <button @click="fn">父点击</button>
    <hanser ref="hanserRef" ></hanser>
</div>