# 组件标志
开发者会遇到很多与组件标志有关的概念:id、ref、Element、NodeRef、context、ComponentPublicInstance...
上述概念,其实都是为了给组件一个标记,通过标记拿到组件的上下文对象,然后操作这个对象的方法。
但因为平台不同,制造了不同的概念。id在web和小程序中存在,NodeRef是小程序的概念、ref和ComponentPublicInstance是vue的概念。uni-app中这些皆而有之。
我们以video为例,解释这些概念的相同和差别之处。
## web开发中
### 内置html标签
html内置标签有id属性,通过document.getElmenetById("")可以返回一个Element。可以进一步调用Element的方法
```html
```
### vue自定义组件@vuecomponent
vue框架中组件有ref属性,选项式中通过this.refs可以返回一个组件实例ComponentPublicInstance,组合式则是定义一个同名的ref()变量。得到组件实例可以进一步调用组件的属性和方法。
对于html内置元素,在web中一般不通过ref获取。ref更多是服务于自定义的vue组件。
但在uni-app x中,ref获取内置组件时,App和Web平台得到的是UniElement。获取非内置组件才是vue组件实例。
假使有一个vue组件,其有一个方法getSome(),那么用法是:\
template区:
```html
```
scrip区:
```js
this.$refs.c1.getSome() //js写法
this.$refs["c1"].getSome() //与上一行等价
(this.$refs["c1"] as ComponentPublicInstance).getSome() //ts或uts写法,必须明确类型才能调用其方法和属性
```
## 小程序中
### 小程序内置组件
小程序的内置组件有id属性,有多种方式获取组件上下文对象:
1. 通过uni.createXXXContext来获取,比如uni.createVideoContext()
template区:
```html
```
scrip区:
```js
uni.createVideoContext('vid').play()
```
2. 通过uni.createSelectorQuery(),传入选择器,拿到返回的NodesRef,然后再.context,异步获取到组件的上下文对象
```js
uni.createSelectorQuery().select('.the-video-class').context(function(res){
console.log(res.context) // 节点对应的 Context 对象。如:选中的节点是