vue 組件

組件

組件系統(tǒng)是 Vue 的另一個重要概念,因?yàn)樗且环N抽象,允許我們使用小型录语、獨(dú)立和通常可復(fù)用的組件構(gòu)建大型應(yīng)用禾乘。仔細(xì)想想澎埠,幾乎任意類型的應(yīng)用界面都可以抽象為一個組件樹

  • 創(chuàng)建組件的兩種方式:1 全局組件 2 局部組件

全局組件

  • 說明:全局組件在所有的vue實(shí)例中都可以使用
  • 注意:先初始化根實(shí)例再注冊組件
  • 注意:組件中的 data 必須是函數(shù)
 <div id="app">
    <!-- 使用自定義元素的方式 -->
    <!-- 使用組件 -->
    <my-component></my-component>
</div>
<!-- 引入vue -->
<script src="./vue.js"></script>
<script>
    // 創(chuàng)建全局組件 不能放在 new Vue 的下面 否者會報(bào)錯 
    // 第一個參數(shù):表示組件名稱
    // 第二個參數(shù):表示組件的配置對象
    Vue.component('my-component', {
        // 指定組件中展示的HTML內(nèi)容
        // 注意:組件的模版中必須有唯一的根元素,否則始藕,會報(bào)錯
        // template: '指定需要展示的內(nèi)容',
        // ES6: 字符串模板 通過 反引號 使用
        template: `
             <div>
                <p>我是全局組件 </P>
                <div v-color>內(nèi)容 --- {{ msg }} --- {{ num }}</div>
                <button @click="fn">組件觸發(fā)事件</button>
              </div>
            `,
        data() {
            return {
                msg: '注意:組件的data必須是一個函數(shù)F盐取5鳌!',
                num:100
            }
        },
    // 用來設(shè)置模板中的事件
        methods:{
            fn(){
                this.num += 1
            }
        },
    // 自定義屬性
        directives:{
            color(el){
                el.style.color='red'
            }
        }
    });
    // 關(guān)聯(lián)到頁面中 (組件要渲染的地方)
    var vm = new Vue({
        el: '#app',
        data: {

        }
    })

      // ===> 渲染結(jié)果
           請看下面的這張圖片
</script> 
渲染結(jié)果.png

局部組件

  • 說明:局部組件江耀,是在某一個具體的vue實(shí)例中定義的剩胁,只能在這個vue實(shí)例中使用
 <div id="app">
        <hello></hello>
    </div>
    <script src="./vue.js"></script>
    <script>
        // 創(chuàng)建 vue 實(shí)例
        var vm = new Vue({
            el: '#app',
            data: {

            },
            // 創(chuàng)建局部組件
            components: {
                // hello 表示組件名稱
                // 對象表示該組件的配置對象
                hello: {
                    template: ` <h1>局部組件</h1>`
                }
            }

        });

組件通訊

父組件到子組件

  • 方式:通過props屬性來傳遞數(shù)據(jù)
  • 注意:屬性的值必須在組件中通過props屬性顯示指定,否則祥国,不會生效
  • 說明:傳遞過來的props屬性的用法與data屬性的用法相同
 <div id="app">
        <child :msg='parentProp'></child>
    </div>
    <script src="./vue.js"></script>
    <script>
        var vm = new Vue({
            el: '#app',
            data: {
                parentProp:'父組建中的屬性'
            },

            // 創(chuàng)建局部組件
            components:{
                // 子組件
                child:{
                    // props 監(jiān)聽父組件傳遞過來的信息
                    props:['msg'],
                    // 傳遞過來后昵观,可在 template 模板里直接引用,就如已經(jīng)傳遞過來數(shù)據(jù)塞到data
                    template:`<h1>{{ msg }}</h1>`
                }
            }
        })
    </script>

子組件到父組件

  • 方式:父組件給子組件傳遞一個函數(shù)舌稀,由子組件調(diào)用這個函數(shù)
  • 說明:借助vue中的自定義事件(v-on:cunstomFn="fn")
  • $emit():觸發(fā)事件
   <div id="app">
      <h1>父組件: 這是子組件傳遞過來的數(shù)據(jù) -----{{ msg }} </h1>
       <!-- 此處的方法 pfn 就是父組件中提供的屬性 -->
        <child v-on:pfn='parentFn'></child>
    </div>
    <script src="./vue.js"></script>
    <script>
        // 子組件傳遞數(shù)據(jù)給父組件
        // 1 由父組件提供一個方法
        // 2 這個方法需要讓子組件來調(diào)用
        // 3 在子組件中調(diào)用父組件的方法 啊犬,將要傳遞的數(shù)據(jù)作為 父組件方法的參數(shù)
        // 進(jìn)行傳遞
        var vm = new Vue({
            el: '#app',
            data: {
                msg :''
            },
            methods:{
                parentFn(arg){
                    console.log(arg)
                    this.msg = arg
                }
            },
            // 創(chuàng)建組件
            components : {
               // 子組件
                child :{
                    template :`
                      <button @click="test">子組件傳遞數(shù)據(jù)給父組件</button>`,
                     methods: {
                             // 子組件:通過$emit調(diào)用
                             test(){
                                    this.$emit('pfn','這是數(shù)據(jù)')
                             }
                      }
                }
            }
        })
    </script>
另外的一種情況是當(dāng)父組件和子組件都有一個獨(dú)立的文件時候怎么實(shí)現(xiàn)通訊呢?
  • 三個步驟:
1.在父組件中引入子組件
    // 導(dǎo)入 numberbox 組件
import NumberBox from '../common/NumberBox.vue'
2.在父組件export default{
   //里面 導(dǎo)入   components: {  NumberBox  }
}
3.在父組件中創(chuàng)建一個    <NumberBox ></NumberBox>標(biāo)簽壁查,這個標(biāo)簽用來存放子組件的內(nèi)容

非父子組件通訊

在簡單的場景下觉至,可以使用一個空的 Vue 實(shí)例作為事件總線

  • $on():綁定事件
var bus = new Vue()

// 觸發(fā)組件 A 中的事件
bus.$emit('id-selected', 1)

// 在組件 B 創(chuàng)建的鉤子中監(jiān)聽事件
bus.$on('id-selected', function (id) {
  // ...
})
  • 示例:組件A ---> 組件B
 <div id="app">
    <comb></comb>

    <coma></coma>
  </div>
  <script src="./vue.js"></script>
  <script>
    // a組件 傳遞數(shù)據(jù)給 b組件
    // 也就是:b組件注冊事件,由a組件觸發(fā)這個事件

    // 創(chuàng)建一個空的Vue實(shí)例對象睡腿,
    var bus = new Vue()

    var vm = new Vue({
      el: '#app',

      components: {
        // b組件
        comb: {
          template: '<h1>這是 B組件 --- {{ msg }}</h1>',
          data() {
            return {
              msg: ''
            }
          },
          created() {
            // 綁定事件
            bus.$on('fn', (arg) => {
              console.log(arg);
              this.msg = arg
            })
          }
        },

        // a組件
        coma: {
          template: `<button @click="send">A組件的按鈕</button>`,
          methods: {
            send() {
              bus.$emit('fn', '這是a傳遞給b的數(shù)據(jù)')
            }
          }
        }
      }
    })
  </script>
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末语御,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子席怪,更是在濱河造成了極大的恐慌沃暗,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,627評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件何恶,死亡現(xiàn)場離奇詭異孽锥,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)细层,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,180評論 3 399
  • 文/潘曉璐 我一進(jìn)店門惜辑,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人疫赎,你說我怎么就攤上這事盛撑。” “怎么了捧搞?”我有些...
    開封第一講書人閱讀 169,346評論 0 362
  • 文/不壞的土叔 我叫張陵抵卫,是天一觀的道長。 經(jīng)常有香客問我胎撇,道長介粘,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,097評論 1 300
  • 正文 為了忘掉前任晚树,我火速辦了婚禮姻采,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘爵憎。我一直安慰自己慨亲,他們只是感情好婚瓜,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,100評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著刑棵,像睡著了一般巴刻。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上蛉签,一...
    開封第一講書人閱讀 52,696評論 1 312
  • 那天冈涧,我揣著相機(jī)與錄音,去河邊找鬼正蛙。 笑死,一個胖子當(dāng)著我的面吹牛营曼,可吹牛的內(nèi)容都是我干的乒验。 我是一名探鬼主播,決...
    沈念sama閱讀 41,165評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼蒂阱,長吁一口氣:“原來是場噩夢啊……” “哼锻全!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起录煤,我...
    開封第一講書人閱讀 40,108評論 0 277
  • 序言:老撾萬榮一對情侶失蹤鳄厌,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后妈踊,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體了嚎,經(jīng)...
    沈念sama閱讀 46,646評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,709評論 3 342
  • 正文 我和宋清朗相戀三年廊营,在試婚紗的時候發(fā)現(xiàn)自己被綠了歪泳。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,861評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡露筒,死狀恐怖呐伞,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情慎式,我是刑警寧澤伶氢,帶...
    沈念sama閱讀 36,527評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站瘪吏,受9級特大地震影響癣防,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜掌眠,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,196評論 3 336
  • 文/蒙蒙 一劣砍、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧扇救,春花似錦刑枝、人聲如沸香嗓。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,698評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽靠娱。三九已至,卻和暖如春掠兄,著一層夾襖步出監(jiān)牢的瞬間像云,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,804評論 1 274
  • 我被黑心中介騙來泰國打工蚂夕, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留迅诬,地道東北人。 一個月前我還...
    沈念sama閱讀 49,287評論 3 379
  • 正文 我出身青樓婿牍,卻偏偏與公主長得像侈贷,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子等脂,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,860評論 2 361

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

  • 此文基于官方文檔俏蛮,里面部分例子有改動,加上了一些自己的理解 什么是組件上遥? 組件(Component)是 Vue.j...
    陸志均閱讀 3,834評論 5 14
  • 推薦我的vue教程:VUE系列教程目錄 上篇講解了vue-router路由入門搏屑,現(xiàn)在講講關(guān)于vue組件的內(nèi)容。如果...
    儂姝沁兒閱讀 2,360評論 6 20
  • 什么是Vue組件 組件 (Component) 是 Vue.js 最強(qiáng)大的功能之一粉楚。組件可以擴(kuò)展 HTML 元素辣恋,...
    bacbcc94613b閱讀 970評論 0 0
  • 在這一節(jié)里,我們將會了解到Vue的組件模软,理解組件是如何工作的抑党,并利用一系列的例子證明,用組件化的思想開發(fā)項(xiàng)目撵摆,會給...
    嘉寶_Appian閱讀 3,275評論 6 17
  • 此生有幸底靠,遇見了她 是偶然中的必然,也是必然中的偶然 同事紅線兩頭牽特铝,促成了我倆兩個小時歡愉的異地煲話 相識兩年半...
    黑水大鵬閱讀 171評論 0 2