vue api强化学习之-------实例的属性
vue组件在构建的过程中,vue构建器给每个vue实例添加的属性对象。
常用vue实例属性
vm.$refs
vue在构建过程中,将注册过ref的所有dom元素和组件实例添加到一个对象中,并将此对象添加到当前vue实例的$refs属性下。 $refs 只会在组件渲染完成之后生效,并且它们不是响应式的。这仅作为一个用于直接操作子组件的“逃生舱”——你应该避免在模板或计算属性中访问 $refs
vm.$parent
当前vue实例若有父实例,则将父实例对象保存到当前实例的$parent属性上。
vm.$data
Vue 实例观察的数据对象。Vue 实例代理了对其 data 对象属性的访问,所谓代理,简单理解,就是把data中的每一个数据在vue实例对象中逐个保存一份
vm.$props
当前组件接受到的props参数,vue实例代理了此对象,代理原理同$data
vm.$el
获取vue实例使用的根dom元素,即当前组件中template模板包含的根dom元素
vm.$options
用于当前 Vue 实例的初始化选项。需要在选项中包含自定义属性时会有用处:
new Vue({
customOption
: 'foo',
created
: function () {
console
.log(this.$options
.customOption
)
}
})
vm.$slots
用来访问被插槽分发的内容,根据具名插槽的名称即可拿到被分发到此插槽的内容,没有被命名的插槽,默认default,所有被分发的内容都被分发到default名下;
vm.$children
一个当前组件实例的直接子组件实例的数组,
vm.$root
当前组件树的根 Vue 实例,通常就是我们的总入口组件实例。如果当前实例没有父实例,此实例将会是其自己,
vm.$listeners
类型:{ [key: string]: Function | Array } 父作用域中(不包括.native修饰符修饰的)v-on事件监听器,是一种组件之间通信的方式, 通常使用v-on="$listeners" 传入内部组件——在创建更高层次的组件时非常有用;
vm.$attrs
包含了父作用域中不作为 prop 被识别 (且获取) 的特性绑定 (class 和 style 除外)。当一个组件没有声明任何 prop 时,这里会包含所有父作用域的绑定 (class 和 style 除外),并且可以通过 v-bind="$attrs" 传入内部组件——在创建高级别的组件时非常有用
vm.$scopedSlots
用来访问作用域插槽。对于包括 默认 slot 在内的每一个插槽,该对象都包含一个返回相应 VNode 的函数。vm.$scopedSlots 在使用渲染函数开发一个组件时特别有用
vm.$isServer
当前 Vue 实例是否运行于服务器
实例属性使用示例
父组件 instanceAttr.vue
<template
>
<div
class="instance">
<div
>vue实例属性api介绍
</div
>
<div ref
="divref">{{val
}}</div
>
<login ref
="loginref" :pra
="val" @myevent
="methods1" :val
="val" :age
="age" :job
="job" >
<div slot
="loginslot">我是被插槽分发的东西
</div
>
</login
>
<button @click
="clickMethod">获取$refs属性
</button
>
</div
>
</template
>
<script
>
import login
from '../components/login.vue'
import index
from '../components/index.vue'
export default {
name
: 'InstanceAttr',
data(){
return {
val
:666,
age
:25,
job
:"java"
}
},
components
:{
index
,
login
},
methods
:{
clickMethod(){
var htmlcontent
= this.$refs
.divref
.innerHTML
;
var vueinstanceMethorData
= this.$refs
.loginref
.login()
console
.log(htmlcontent
,".........this.$refs,............",vueinstanceMethorData
);
},
methods1(){alert('instanceAttr中的方法methods1被调用了')},
methods2(){}
},
mounted(){
console
.log(this.$data
.val
,"......this.$data.val......");
console
.log(this.$el
,"...instanceAttr组件中....获取根实例");
console
.log(this.$options
,'..获取初始化项....instanceAttr组件中....');
console
.log(this.$slots
,"............instanceAttr组件。。。。。。this.$slots");
console
.log(this.$children
[0].name
,"......this.$children.....");
console
.log(this.$root
,"......this.$root......instanceAttr组件中....");
console
.log(this.$listeners
,".this.$listeners.........instanceAttr组件中..");
console
.log(this.$attrs
,"this.$attrs............instanceAttr组件中......");
console
.log(this.$scopedSlots
,"this.$scopedSlots............instanceAttr组件中......");
console
.log(this.$isServer
,".this.$isServer..................instanceAttr组件中.......")
}
}
</script
>
<!-- Add
"scoped" attribute to limit
CSS to
this component only
-->
<style scoped
>
.divlistener
{
width
: 100px
;
height
: 50px
;
background
: green
;
border
: 1px solid red
;
}
</style
>
instanceAttr的子组件login.vue
<template
>
<div
class="login base">
<div
>
我是login 组件
</div
>
<slot name
="loginslot"></slot
>
<!-- 通过此方式将当前接受到的事件监听器 传递到当前组件的子组件中去
-->
<index v
-on
="$listeners" v
-bind
="$attrs"/>
</div
>
</template
>
<script
>
import index
from './index.vue'
export default {
name
: 'login',
components
:{
index
},
props
:{
pra
:{
type
:Number
,
default:''
},
age
:''
},
data(){
return {
name
:'lgx',
}
},
methods
:{
login(){
console
.log(this.name
,"登录了.................");
console
.log(this.$refs
,"......子组件中.this.$refs....");
console
.log(this.$parent
,"....子组件中父实例..此处应该是instanceAttr组件...........");
console
.log(this.$props
.pra
,"....this.$props.........")
}
},
mounted(){
console
.log(this.$el
.attributes
,"...login组件中....获取根实例",this.$el
.classList
);
console
.log(this.$slots
.loginslot
[0].elm
,"............login组件。。。。。。this.$slots");
console
.log(this.$root
,"......this.$root......login组件中....");
console
.log(this.$listeners
,".this.$listeners.........login组件中..");
console
.log(this.$attrs
,"this.$attrs............login组件中......");
console
.log(this.$scopedSlots
.loginslot(),"this.$scopedSlots............login组件中.......");
}
}
</script
>
<!-- Add
"scoped" attribute to limit
CSS to
this component only
-->
<style scoped
>
.hello div
{
background
: green
;
width
: 200px
;
height
: 100px
;
}
</style
>
login的子组件index.vue
<template
>
<div
class="hello">
<div v
-color
="'red'">
我是index 组件
</div
>
<!-- 定义名为index的插槽
-->
<slot name
="index"></slot
>
</div
>
</template
>
<script
>
export default {
name
: 'index',
directives
:{
color
:function(el
,binding
){
el
.style
.color
= binding
.value
}
},
mounted(){
console
.log(this.$listeners
,"..............this.$listeners.......index组件中");
console
.log(this.$attrs
,"this.$attrs............index组件中......");
},
}
</script
>
<!-- Add
"scoped" attribute to limit
CSS to
this component only
-->
<style scoped
>
.hello div
{
background
: green
;
width
: 200px
;
height
: 100px
;
}
</style
>