vue实例对象中$开头的常用属性和方法简介

一、 vue常见实例化方式

  1. new Vue
    直接调用new方法创建实例
  2. class Page extends Vue
    类的方式准备一个vue对象,使用<Page />创建实例
  3. {name: 'aInput', data:..., render:...}
    对象组件的方式准备一个类vue对象component,使用new Vue(component)或者使用Vue.component(component.name, component)之后使用<a-input />创建实例

二、$开头属性和方法

  1. $data

    • 代理data里面的非'_'和'$'开头的属性
            export default {
                data: () => {
                   return {
                     a:'',
                     b:'',
                     c:'',
                    };
                 },
             };
    
    • vue实例后需要通过this.$data.a来获取a的值,this.a或者this.data.a都会返回undefined
             class parentPage extends Vue {
                 private a: string = '';
                 private b;
                 private c = undefined;
              };
    
    • 如上图使用类的方式来定义data,必须为属性赋初始值(非undefined)才能被$data代理。对于非响应变量b,c来说,推荐命名为_b,_c
  2. $props

    • 代理当前组件接收到的 props 对象
      {
        name: 'aInput',
        data: () => {
           return {
           };
        },
        props: {
          a
          b
        },
     };
    
      <a-input 
        a='1'
        b='2'
        c='3'
      />
    
    
    • 如上图:this.$props={a:1,b:2}
  3. $attrs

    • 包含了父作用域中不被 prop 识别的特性绑定 (class 和 style 除外)
      {
        name: 'aInput',
        data: () => {
           return {
           };
        },
        props: {
          a
          b
        },
     };
    
      <a-input 
        a='1'
        b='2'
        c='3'
      />
    
    
    • 如上图: 由于props定义了a和b属性,没有申明c属性。则此时的c属性将会被this.$attrs代理。this.$attrs={c:'3'}
    • vue对象的inheritAttrs属性值默认为true(可设置和true/false,为true时它会将$attrs的值以attr的形式渲染到dom节点上
  4. $listeners

    • 代理了父组件传过来的事件(不含 .native 修饰器的v-on或者onXXX的方式传递过来的函数)
      {
        name: 'aInput',
        data: () => {
           return {
           };
        },
        props: {
          a
          b
        },
     };
    
      <a-input 
        a='1'
        onChange={()=>{}}
        onBlur={()=>{}}
      />
    
    
    • this.$listeners = {change: ()=>{}, blur: ()=>{}}
    • 子页面使用this.$emit('change',()=>{})派发父页面onChange事件,详情参考$emit
  5. $on、$emit、$off、$once

    • 以上方法最常用于事件车(eventBus)做组件间的联动
    • $on用来注册一个事件
    • $emit用来触发$on注册的事件,也可以用来触发$listeners代理的事件
    • $off用来关闭$on注册的事件。常用于组件销毁时使用
    • $once用来注册一个一次性事件。$emit派发事件后,此事件会自动销毁,无法再次被派发。不需要$off来手动关闭
          //eventBus
          const eventBus = new Vue();          
    
          //父组件
           class parentPage extends Vue {
                mounted() {
                  bus.$on('callFather', () => {
                    console,log('儿子叫我了')
                  })
                  bus.$once('transmitMessage', (message) => {
                    console,log('儿子告诉我妈妈的钱藏在哪里',message)
                  })
                }
                render() {
                    return (
                        <ChildPage  
                           onTestListeners=()=>{console.log('儿子使用了$emit')} 
                        />
                    )
                }
           }
          
          //儿子组件
          class ChildPage extends Vue {
                mounted() {
                  //呼叫老爸
                  bus.$emit('callFather')
                  //传递信息后被打死了,不需要off
                  bus.$emit('transmitMessage', '妈妈的钱藏在床底下')
    
                  //不要忘了派发我
                  this.$emit('testListeners')
                }
                beforeDestroy() {
                  //组件销毁前需要此页面独用的事件
                  bus.$off('callFather')
                  //因为事件是注册在了eventBus里面,如果注册的事件一直不销毁,则eventBus就会越来越大,而且也会出现多个页面注册同一个事件的情况,代码就不可跟踪了
                }
                
           }
    
  6. $refs

    • $refs可以用来获取dom节点,进行一些dom的操作
    • $refs可以用来获取组件对象(Vue实例)
    • $refs在for循环中可以配合refInFor={true}来以数组形式获取多个组件对象
          {
              render:(h: CreateElement) {
                  return (
                    <div ref='divRef'>
                      {
                        [1,2].map(()=>{
                            return <input ref='inputRef'  refInFor={true}   />
                        })
                      }              
                    </div>
                )
              }
          }
    
    • this.$refs = {divRef: HTMLDivElement, inputRef: [HTMLInputElement, HTMLInputElement]}
  1. $nextTick

    • 回调延迟到下次 DOM 更新循环之后执行。
    • 使用场景举例
      • 在created()里使用this.$nextTick()可以等待dom生成以后再来获取dom对象。(不要问我为什么不在mounted里面取dom对象)
      • 在一个ajax请求的回调里使用this.$nextTick()可以等待render重新渲染后再来获取dom对象来做一些比如合并table单元格、滚动条滚到指定位置等dom操作
      created() {
           this.$nextTick(() => {
                //this.$refs.input
           });
           Ajax(options,(data) => {
               this.data = data;
               this.$nextTick(() => {
                  //this.$refs.input
               });
           })
      }
    
  2. $forceUpdate

    • 强制重新执行render方法
    • 使用场景举例
      • 非响应式的值改变,又需要刷新DOM,可使用此方法
      created() {
           Ajax(options,(data) => {
               this._data = data; //非响应式数据更新
               this.$nextTick(() => {
                  //this.$refs.input
               });
               //强制刷新当前组件的render
               this.$forceUpdate();
           })
      }
    

三、更多

可以通过打印Vue对象查看它的所有属性和方法,后续再慢慢补吧

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,236评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,867评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,715评论 0 340
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,899评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,895评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,733评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,085评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,722评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,025评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,696评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,816评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,447评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,057评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,009评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,254评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,204评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,561评论 2 343

推荐阅读更多精彩内容