ref:绑定dom节点,拿到的就是dom对象;
ref:绑定组件,拿到的就是组件对象;
ref绑在dom节点上:
//绑在dom上,
<input type="text" ref="mytext">
<input type="text" ref="myusername">
//this.$refs拿到的是原生dom节点
console.log(this.$refs)
结果:
console.log(this.$refs.mytext,this.$refs.myusername)
分别拿到两个input dom节点:
完整代码:
<body>
<div id="box">
<input type="text" ref="mytext">
<input type="text" ref="myusername">
<button @click="handleAdd">add</button>
</div>
<script>
new Vue({
el:"#box",
methods:{
handleAdd(){
console.log(this.$refs.mytext,this.$refs.myusername)
}
}
})
</script>
</body>
结果:
ref绑在组件上:
//绑在组件上
<child ref="mychild"></child>
//this.$refs.mychild获取的是组件对象,里面有很多组件里的属性方法
console.log(this.$refs.mychild)
结果:
我们在组件里定义一个状态:myname,通过“this.$refs.mychild”就能拿到整个组件对象,所以组件对象里的状态也就可以用访问了:
console.log(this.$refs.mychild.myname)
这样别的组件也就能拿到 child 组件上的状态了;
完整代码:
<body>
<div id="box">
<button @click="handleAdd">add</button>
<child ref="mychild"></child>
</div>
<script>
Vue.component("child",{
template:`
<div>child</div>
`,
data(){
return {
myname:"child-11111"
}
}
})
new Vue({
el:"#box",
methods:{
handleAdd(){
console.log(this.$refs.mychild.myname)
}
}
})
</script>
</body>
结果:
- 其他的组件也可以改这个状态;;
ref的缺点:
因为ref虽然能实现组件之间的通信,但是会造成数据流流向的紊乱,所以一般不用;
组件之间的通信有几种:
- 父传子--通过自定义属性(兄弟之间的通信通过父组件中间人)
- 子传父--通过自定义事件
- bus方式--发布者、订阅者
- vuex方式
- ref方式--打破组件间的壁垒,直接拿来用