VUE組件與組件之間傳值

組件

  • 組件 (Component) 是 Vue.js 最強大的功能之一
  • 組件可以擴展 HTML 元素胆萧,封裝可重用的代

組件注冊

全局注冊

  • Vue.component('組件名稱', { }) 第1個參數是標簽名稱鄙币,第2個參數是一個選項對象
  • 全局組件注冊后,任何vue實例都可以用
組件基礎用
<div id="example">
  <!-- 2校翔、 組件使用 組件名稱 是以HTML標簽的形式使用  -->  
  <my-component></my-component>
</div>
<script>
    //   注冊組件 
    // 1蝗茁、 my-component 就是組件中自定義的標簽名
    Vue.component('my-component', {
      template: '<div>A custom component!</div>'
    })

    // 創(chuàng)建根實例
    new Vue({
      el: '#example'
    })

</script>
組件注意事項
  • 組件參數的data值必須是函數同時這個函數要求返回一個對象
  • 組件模板必須是單個根元素
  • 組件模板的內容可以是模板字符串
  • 組件命名如果用駝峰命名法蝗羊,那么插入實例的時候要換成短橫線精置,因為html標簽對大小寫不敏感
  <div id="app">
     <!-- 
        4、  組件可以重復使用多次 
          因為data中返回的是一個對象所以每個組件中的數據是私有的
          即每個實例可以維護一份被返回對象的獨立的拷貝   
    --> 
    <button-counter></button-counter>
    <button-counter></button-counter>
    <button-counter></button-counter>
      <!-- 8娇豫、必須使用短橫線的方式使用組件 -->
     <hello-world></hello-world>
  </div>

<script type="text/javascript">
    //5  在組件模板中 使用其他組件匙姜,可以使用駝峰命名法,也可以使用短橫線
    // 7锤躁、在普通實例的標簽模板中搁料,必須使用短橫線的方式使用組件
     Vue.component('HelloWorld', {
      data: function(){
        return {
          msg: 'HelloWorld'
        }
      },
      template: '<div>{{msg}}</div>'
    });
    
    
    
    Vue.component('button-counter', {
      // 1、組件參數的data值必須是函數 
      // 同時這個函數要求返回一個對象  
      data: function(){
        return {
          count: 0
        }
      },
      //  2系羞、組件模板必須是單個根元素
      //  3郭计、組件模板的內容可以是模板字符串  
      template: `
        <div>
          <button @click="handle">點擊了{{count}}次</button>
          <button>測試123</button>
            #  6 在字符串模板中可以使用駝峰的方式使用組件   
           <HelloWorld></HelloWorld>
        </div>
      `,
      methods: {
        handle: function(){
          this.count += 2;
        }
      }
    })
    var vm = new Vue({
      el: '#app',
      data: {
        
      }
    });
  </script>

局部注冊

  • 只能在當前注冊它的vue實例中使用
  <div id="app">
      <my-component></my-component>
  </div>


<script>
    // 定義組件的模板
    var Child = {
      template: '<div>A custom component!</div>'
    }
    new Vue({
      //局部注冊組件  
      components: {
        // <my-component> 將只在父模板可用  一定要在實例上注冊了才能在html文件中使用
        'my-component': Child
      }
    })
 </script>

Vue 調試工具

Vue組件之間傳值

**父組件向子組件傳值

  • 父組件發(fā)送的形式是以屬性的形式綁定值到子組件身上。
  • 然后子組件用屬性props接收
  • 在props中使用駝峰形式椒振,模板中需要使用短橫線的形式字符串形式的模板中沒有這個限制
  <div id="app">
    <div>{{pmsg}}</div>
     <!--1昭伸、menu-item  在 APP中嵌套著 故 menu-item   為  子組件      -->
     <!-- 給子組件傳入一個靜態(tài)的值 -->
    <menu-item title='來自父組件的值'></menu-item>
    <!-- 2、 需要動態(tài)的數據的時候 需要屬性綁定的形式設置 此時 ptitle  來自父組件data 中的數據 . 
          傳的值可以是數字澎迎、對象庐杨、數組等等
    -->
    <menu-item :title='ptitle' content='hello'></menu-item>
  </div>

  <script type="text/javascript">
    Vue.component('menu-item', {
      // 3、 子組件用屬性props接收父組件傳遞過來的數據  
      props: ['title', 'content'],
      data: function() {
        return {
          msg: '子組件本身的數據'
        }
      },
      template: '<div>{{msg + "----" + title + "-----" + content}}</div>'
    });
    var vm = new Vue({
      el: '#app',
      data: {
        pmsg: '父組件中內容',
        ptitle: '動態(tài)綁定屬性'
      }
    });
  </script>

**子組件向父組件傳值

  • 子組件用$emit()觸發(fā)事件
  • $emit() 第一個參數為 自定義的事件名稱 第二個參數為需要傳遞的數據
  • 父組件用v-on 監(jiān)聽子組件的事件

 <div id="app">
    <div :style='{fontSize: fontSize + "px"}'>{{pmsg}}</div>
     <!-- 2 父組件用v-on 監(jiān)聽子組件的事件
        這里 enlarge-text  是從 $emit 中的第一個參數對應   handle 為對應的事件處理函數 
    --> 
    <menu-item :parr='parr' @enlarge-text='handle($event)'></menu-item>
  </div>
  <script type="text/javascript" src="js/vue.js"></script>
  <script type="text/javascript">
    /*
      子組件向父組件傳值-攜帶參數
    */
    
    Vue.component('menu-item', {
      props: ['parr'],
      template: `
        <div>
          <ul>
            <li :key='index' v-for='(item,index) in parr'>{{item}}</li>
          </ul>
            ###  1夹供、子組件用$emit()觸發(fā)事件
            ### 第一個參數為 自定義的事件名稱   第二個參數為需要傳遞的數據  
          <button @click='$emit("enlarge-text", 5)'>擴大父組件中字體大小</button>
          <button @click='$emit("enlarge-text", 10)'>擴大父組件中字體大小</button>
        </div>
      `
    });
    var vm = new Vue({
      el: '#app',
      data: {
        pmsg: '父組件中內容',
        parr: ['apple','orange','banana'],
        fontSize: 10
      },
      methods: {
        handle: function(val){
          // 擴大字體大小
          this.fontSize += val;
        }
      }
    });
  </script>

兄弟之間的傳遞

  • 兄弟之間傳遞數據需要借助于事件中心灵份,通過事件中心傳遞數據
    • 提供事件中心 var hub = new Vue()
  • 傳遞數據方,通過一個事件觸發(fā)hub.$emit(方法名哮洽,傳遞的數據)
  • 接收數據方填渠,通過mounted(){} 鉤子中 觸發(fā)hub.$on()方法名
  • 銷毀事件 通過hub.$off()方法名銷毀之后無法進行傳遞數據
 <div id="app">
    <div>父組件</div>
    <div>
      <button @click='handle'>銷毀事件</button>
    </div>
    <test-tom></test-tom>
    <test-jerry></test-jerry>
  </div>
  <script type="text/javascript" src="js/vue.js"></script>
  <script type="text/javascript">
    /*
      兄弟組件之間數據傳遞
    */
    //1、 提供事件中心
    var hub = new Vue();

    Vue.component('test-tom', {
      data: function(){
        return {
          num: 0
        }
      },
      template: `
        <div>
          <div>TOM:{{num}}</div>
          <div>
            <button @click='handle'>點擊</button>
          </div>
        </div>
      `,
      methods: {
        handle: function(){
          //2、傳遞數據方氛什,通過一個事件觸發(fā)hub.$emit(方法名莺葫,傳遞的數據)   觸發(fā)兄弟組件的事件
          hub.$emit('jerry-event', 2);
        }
      },
      mounted: function() {
       // 3、接收數據方枪眉,通過mounted(){} 鉤子中  觸發(fā)hub.$on(方法名
        hub.$on('tom-event', (val) => {
          this.num += val;
        });
      }
    });
    Vue.component('test-jerry', {
      data: function(){
        return {
          num: 0
        }
      },
      template: `
        <div>
          <div>JERRY:{{num}}</div>
          <div>
            <button @click='handle'>點擊</button>
          </div>
        </div>
      `,
      methods: {
        handle: function(){
          //2捺檬、傳遞數據方,通過一個事件觸發(fā)hub.$emit(方法名贸铜,傳遞的數據)   觸發(fā)兄弟組件的事件
          hub.$emit('tom-event', 1);
        }
      },
      mounted: function() {
        // 3堡纬、接收數據方,通過mounted(){} 鉤子中  觸發(fā)hub.$on()方法名
        hub.$on('jerry-event', (val) => {
          this.num += val;
        });
      }
    });
    var vm = new Vue({
      el: '#app',
      data: {
        
      },
      methods: {
        handle: function(){
          //4萨脑、銷毀事件 通過hub.$off()方法名銷毀之后無法進行傳遞數據  
          hub.$off('tom-event');
          hub.$off('jerry-event');
        }
      }
    });
  </script>

?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末隐轩,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子渤早,更是在濱河造成了極大的恐慌,老刑警劉巖瘫俊,帶你破解...
    沈念sama閱讀 212,816評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件鹊杖,死亡現場離奇詭異,居然都是意外死亡扛芽,警方通過查閱死者的電腦和手機骂蓖,發(fā)現死者居然都...
    沈念sama閱讀 90,729評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來川尖,“玉大人登下,你說我怎么就攤上這事《T” “怎么了被芳?”我有些...
    開封第一講書人閱讀 158,300評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長馍悟。 經常有香客問我畔濒,道長,這世上最難降的妖魔是什么锣咒? 我笑而不...
    開封第一講書人閱讀 56,780評論 1 285
  • 正文 為了忘掉前任侵状,我火速辦了婚禮,結果婚禮上毅整,老公的妹妹穿的比我還像新娘。我一直安慰自己悼嫉,他們只是感情好艇潭,可當我...
    茶點故事閱讀 65,890評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般闯团。 火紅的嫁衣襯著肌膚如雪房交。 梳的紋絲不亂的頭發(fā)上候味,一...
    開封第一講書人閱讀 50,084評論 1 291
  • 那天白群,我揣著相機與錄音帜慢,去河邊找鬼粱玲。 笑死抽减,一個胖子當著我的面吹牛,可吹牛的內容都是我干的法牲。 我是一名探鬼主播淹办,決...
    沈念sama閱讀 39,151評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼副硅,長吁一口氣:“原來是場噩夢啊……” “哼恐疲!你這毒婦竟也來了培己?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,912評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎笤受,沒想到半個月后敌蜂,有當地人在樹林里發(fā)現了一具尸體章喉,經...
    沈念sama閱讀 44,355評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡秸脱,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,666評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片幢踏。...
    茶點故事閱讀 38,809評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡咧擂,死狀恐怖贸桶,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情设联,我是刑警寧澤艘包,帶...
    沈念sama閱讀 34,504評論 4 334
  • 正文 年R本政府宣布舌厨,位于F島的核電站揉燃,受9級特大地震影響弊攘,放射性物質發(fā)生泄漏。R本人自食惡果不足惜醋界,卻給世界環(huán)境...
    茶點故事閱讀 40,150評論 3 317
  • 文/蒙蒙 一脂新、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧滞乙,春花似錦、人聲如沸男韧。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽甚纲。三九已至口锭,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間介杆,已是汗流浹背鹃操。 一陣腳步聲響...
    開封第一講書人閱讀 32,121評論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留春哨,地道東北人荆隘。 一個月前我還...
    沈念sama閱讀 46,628評論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像赴背,于是被迫代替她去往敵國和親椰拒。 傳聞我的和親對象是個殘疾皇子晶渠,可洞房花燭夜當晚...
    茶點故事閱讀 43,724評論 2 351

推薦閱讀更多精彩內容

  • 組件 組件 (Component) 是 Vue.js 最強大的功能之一組件可以擴展 HTML 元素缆毁,封裝可重用的代...
    新苡米閱讀 762評論 0 2
  • Vue 作為一個輕量級的前端框架番川,其核心就是組件化開發(fā)。Vue 就是由一個一個的組件構成的脊框,組件化是它的精髓颁督,也是...
    摸魚貓閱讀 525評論 0 0
  • 父組件向子組件傳值 父組件發(fā)送的形式是以屬性的形式綁定值到子組件身上。 然后子組件用屬性props接收 在prop...
    過盡千帆_YL閱讀 810評論 0 11
  • 目錄 一浇雹、父組件向子組件傳值 二沉御、子組件向父組件傳值 三、兄弟組件之間的傳值 如上圖所示箫爷,2是1的子組件嚷节,1是3的...
    平常心t閱讀 456評論 0 0
  • 組件 (Component) 是 Vue.js 最強大的功能之一,組件可以擴展 HTML 元素虎锚,封裝可重用的代碼硫痰。...
    Imkata閱讀 595評論 0 0