Vue component初認(rèn)識(shí)

what is component

組件是Vue.js最強(qiáng)大的功能之一.組件可以擴(kuò)展HTMl元素,封裝可重用的代碼.在較高層面上,組件是自定義元素,Vue.js的編譯器為它添加特殊功能.在有些情況下,組件也可以是原生HTML元素的形式,以 'is' 特性擴(kuò)展.

how to use

注冊(cè)全局組件

    Vue.component('kai', {
        template: '<div>我是全局組件</div>'
    })
    var app = new Vue({
            el: "#app"
  })

一定要在初始化跟實(shí)例(app)之前注冊(cè)組件,否則無效
注冊(cè)完之后就可以在dom中跟html元素的使用方式一樣的使用

    <div id="app">
    <kai></kai>
      </div>

注冊(cè)局部組件

  var app = new Vue({
          el: "#app",
          components: {
              "localCom": {
                  template: "<p>我系局部組件</p>"
                  }
          }
      })
  • 通過使用組件實(shí)例選項(xiàng)(components)注冊(cè)可以是組件僅在另一個(gè)實(shí)例/組件的作用域中可用
  • 上邊注冊(cè)的組件 'localCom' 使用駝峰式命名,在使用時(shí) 要在每一個(gè)駝峰處使用 '-' 隔開
    使用方式:
  <div id="app">
    <kai></kai>
    <local-com></local-com>
  </div>

is特性

由于Vue只有在瀏覽器解析和標(biāo)準(zhǔn)化HTML后才能獲取模板內(nèi)容.比如<ul>中只可以直接包裹<li>所以當(dāng)你像下邊這樣使用組件

  <ul>
      <my-component></my-component>
  </ul>

瀏覽器會(huì)在Vue解析模板之前,標(biāo)準(zhǔn)化HTML,就會(huì)導(dǎo)致一些問題
變通的方案是使用特殊的 is 屬性:

    <ul>
          <li is="my-component"></li>
    </ul>

data 必須是函數(shù)

在自定義組件中data選項(xiàng)必須是函數(shù),其實(shí)不難理解,如果你像Vue跟實(shí)例那樣,在自定義組件中也直接使用對(duì)象的形式,那么如果這個(gè)組件被多個(gè)地方使用,而data是一個(gè)對(duì)象,在內(nèi)存中就是同一個(gè)內(nèi)存空間,那如果在某一個(gè)地方修改data中的內(nèi)容,那其他的地方的組件數(shù)據(jù)也會(huì)一起改變,顯然是不合理的,所以data要是一個(gè)函數(shù),然后返回一個(gè)對(duì)象.

    Vue.component("my-component", {
            template: "<span>{{message}}</span>"  
            data:  function () {
                    return {
                          message: "我是自定義全局組件"
                    }
            }
        }
  )

組件間通訊

在Vue中,父子組件的關(guān)系可以總結(jié)為 props down, events up, 父組件通過props向下傳遞數(shù)據(jù)給子組件,子組件通過events給父組件發(fā)送消息.看下圖

image.png

1. 父 -> 子

組件實(shí)例的作用域是孤立的.這意味著不能(也不應(yīng)該)在子組件的模板內(nèi)直接 引用父組件的數(shù)據(jù).要讓子組件使用粗組件的數(shù)據(jù),我們需要這樣做:


        <div id="app">
            <kai msg="niguanwo"></kai>
            <local-com></local-com>
          </div>

        Vue.component('kai', {
            template: '<div>我是全局組件{{msg}}</div>',
            props: ["msg"]
        });
  • HTMl特性是不區(qū)分大小寫的,所以當(dāng)使用的不是字符串模板, 駝峰式命名的 prop 需要轉(zhuǎn)換為相對(duì)應(yīng)的 短橫線隔開式命名
2.動(dòng)態(tài)綁定props
    <div id="app">
    <input type="text" v-model="time">
    <kai msg="niguanwo" v-bind:timer="time"></kai>
    <local-com></local-com>
</div>
    <script src="./vue.js"></script>
    <script>
    // 注冊(cè)全局組件
        Vue.component('kai', {
            template: '<div>我是全局組件{{msg}}時(shí)間{{timer}}</div>',
            props: ["msg", "timer"]
        });

        var app = new Vue({
            el: "#app",
            components: {
                "localCom": {
                    template: "<p>我系局部組件</p>"
                }
            },
            data: {
                time: "jidianl"
            }
        })
    </script>
  • 這樣,父組件你的time只要變化,子組件的timer也會(huì)動(dòng)態(tài)的跟著改變
3.還可以直接傳遞一個(gè)對(duì)象,寫法如下
    <div id="app">
    <input type="text" v-model="time">
    <kai v-bind="obj" v-bind:object="obj1"></kai>
    <local-com></local-com>
</div>
    <script src="./vue.js"></script>
    <script>
    // 注冊(cè)全局組件
        Vue.component('kai', {
            template: '<div>{{name}}{{age}}{{object.status}}{{object.year}}</div>',
            props: ["name", "age", "object"]
        });

        
        var app = new Vue({
            el: "#app",
            data: {
                obj: {
                    name: "kai",
                    age: 25
                },
                obj1: {
                        status: "ok",
                       year: "2017"
                 }
            }
        })
    </script>
  • 還是要在props顯示地寫出要接收的屬性的名稱,直接使用 v-bind="obj"
4.單向數(shù)據(jù)流

prop 是單向綁定的:當(dāng)父組件的屬性變化時(shí)聪舒,將傳導(dǎo)給子組件鼠哥,但是不會(huì)反過來坚踩。另外,每次父組件更新時(shí)偿短,子組件的所有 prop 都會(huì)更新為最新值。這意味著你不應(yīng)該在子組件內(nèi)部改變 prop佳遂。
如果需要修改使用下面兩種方式:
1. 定義一個(gè)局部變量落恼,并用 prop 的值初始化它:

      props: ['initialCounter'],
      data: function () {
        return { counter: this.initialCounter }
      }
  1. 定義一個(gè)計(jì)算屬性,處理 prop 的值并返回扯再。

    props: ['size'],
    computed: {
      normalizedSize: function () {
      return this.size.trim().toLowerCase()
      }
    }
    
5.非props特性
  • 所謂非prop特性,就是它可以直接傳入組件,而不需要定義相應(yīng)的prop.
  <bs-date-input data-3d-date-picker="true"></bs-date-input>

上邊這個(gè)會(huì)直接在bs-date-input的組件內(nèi)添加一個(gè)data-3d-date-picker的值為true不過需要在data返回的對(duì)象中聲明一個(gè)data-3d-date-picker屬性,并初始化一個(gè)默認(rèn)值出來

6.替換/覆蓋現(xiàn)有的特性
  • 對(duì)于多數(shù)特性來說芍耘,傳遞給組件的值會(huì)覆蓋組件本身設(shè)定的值。即例如傳遞 type="large" 將會(huì)覆蓋 type="date" 且有可能破壞該組件熄阻!所幸我們對(duì)待 class 和 style 特性會(huì)更聰明一些斋竞,這兩個(gè)特性的值都會(huì)做合并操作,生成最終的值.

子 -> 父

1. 使用v-on綁定自定義事件
image.png
  1. v-on:aaa 也可簡(jiǎn)寫成 @aaa
  2. 父組件可以在使用子組件的地方直接用 v-on 來監(jiān)聽子組件觸發(fā)的事件。
2. 給組件綁定原生事件
    <my-component v-on:click.native="doTheThing"></my-component>
  • v-on:click.native 會(huì)監(jiān)聽組件所在的根實(shí)例的(app)doTheThing事件
3. sync 實(shí)現(xiàn)子父組件數(shù)據(jù)同步
image.png
4.其他
  1. 盡管有 props 和 events秃殉,但是有時(shí)仍然需要在 JavaScript 中直接訪問子組件坝初。為此可以使用 ref 為子組件指定一個(gè)索引 ID浸剩。|
  <div id="parent">
    <user-profile ref="profile"></user-profile>
  </div>
  var parent = new Vue({ el: '#parent' })
  // 訪問子組件
  var child = parent.$refs.profile
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市脖卖,隨后出現(xiàn)的幾起案子乒省,更是在濱河造成了極大的恐慌,老刑警劉巖畦木,帶你破解...
    沈念sama閱讀 222,464評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異砸泛,居然都是意外死亡十籍,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,033評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門唇礁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來勾栗,“玉大人,你說我怎么就攤上這事盏筐∥Х” “怎么了?”我有些...
    開封第一講書人閱讀 169,078評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵琢融,是天一觀的道長(zhǎng)界牡。 經(jīng)常有香客問我,道長(zhǎng)漾抬,這世上最難降的妖魔是什么宿亡? 我笑而不...
    開封第一講書人閱讀 59,979評(píng)論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮纳令,結(jié)果婚禮上挽荠,老公的妹妹穿的比我還像新娘。我一直安慰自己平绩,他們只是感情好圈匆,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,001評(píng)論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著捏雌,像睡著了一般跃赚。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上腹忽,一...
    開封第一講書人閱讀 52,584評(píng)論 1 312
  • 那天来累,我揣著相機(jī)與錄音,去河邊找鬼窘奏。 笑死嘹锁,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的着裹。 我是一名探鬼主播领猾,決...
    沈念sama閱讀 41,085評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了摔竿?” 一聲冷哼從身側(cè)響起面粮,我...
    開封第一講書人閱讀 40,023評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎继低,沒想到半個(gè)月后熬苍,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,555評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡袁翁,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,626評(píng)論 3 342
  • 正文 我和宋清朗相戀三年柴底,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片粱胜。...
    茶點(diǎn)故事閱讀 40,769評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡柄驻,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出焙压,到底是詐尸還是另有隱情鸿脓,我是刑警寧澤,帶...
    沈念sama閱讀 36,439評(píng)論 5 351
  • 正文 年R本政府宣布涯曲,位于F島的核電站野哭,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏掀抹。R本人自食惡果不足惜虐拓,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,115評(píng)論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望傲武。 院中可真熱鬧蓉驹,春花似錦、人聲如沸揪利。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,601評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)疟位。三九已至瞻润,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間甜刻,已是汗流浹背绍撞。 一陣腳步聲響...
    開封第一講書人閱讀 33,702評(píng)論 1 274
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留得院,地道東北人傻铣。 一個(gè)月前我還...
    沈念sama閱讀 49,191評(píng)論 3 378
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像祥绞,于是被迫代替她去往敵國(guó)和親非洲。 傳聞我的和親對(duì)象是個(gè)殘疾皇子鸭限,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,781評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容

  • Vue 實(shí)例 屬性和方法 每個(gè) Vue 實(shí)例都會(huì)代理其 data 對(duì)象里所有的屬性:var data = { a:...
    云之外閱讀 2,221評(píng)論 0 6
  • 下載安裝搭建環(huán)境 可以選npm安裝,或者簡(jiǎn)單下載一個(gè)開發(fā)版的vue.js文件 瀏覽器打開加載有vue的文檔時(shí)两踏,控制...
    冥冥2017閱讀 6,052評(píng)論 0 42
  • 這篇筆記主要包含 Vue 2 不同于 Vue 1 或者特有的內(nèi)容败京,還有我對(duì)于 Vue 1.0 印象不深的內(nèi)容。關(guān)于...
    云之外閱讀 5,052評(píng)論 0 29
  • 1.安裝 可以簡(jiǎn)單地在頁(yè)面引入Vue.js作為獨(dú)立版本梦染,Vue即被注冊(cè)為全局變量赡麦,可以在頁(yè)面使用了。 如果希望搭建...
    Awey閱讀 11,034評(píng)論 4 129
  • 此文基于官方文檔帕识,里面部分例子有改動(dòng)隧甚,加上了一些自己的理解 什么是組件? 組件(Component)是 Vue.j...
    陸志均閱讀 3,834評(píng)論 5 14