vue.js組件之基礎篇

来源:https://www.cnblogs.com/netlws/archive/2018/08/19/9501483.html
-Advertisement-
Play Games

Vue.js 組件 模塊化:是從代碼邏輯的角度進行劃分的; 組件化:是從UI界面的角度進行劃分的。 組件(Component)是 Vue.js 最強大的功能之一,組件可以擴展 HTML 元素,封裝可重用的代碼。 組件系統讓我們可以用獨立可復用的小組件來構建大型應用,幾乎任意類型的應用的界面都可以抽象 ...


Vue.js 組件

  • 模塊化:是從代碼邏輯的角度進行劃分的;
  • 組件化:是從UI界面的角度進行劃分的。

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

組件系統讓我們可以用獨立可復用的小組件來構建大型應用,幾乎任意類型的應用的界面都可以抽象為一個組件樹,如下圖所示:

使用Vue.extend來創建全局vue組件:

var com1 = Vue.extend({
template: '<h3>這是使用 Vue.extend 創建的組件</h3>' // 通過template屬性,指定了組件要展示的HTML結構
})

此時只是聲明瞭一個叫com1的組件,如果要在vue實例中使用組件,還需要通過以下方式來註冊組件:

   Vue.component('myCom1', com1)

組件的調用: 

  <div id="app">
    <!-- 如果要使用組件,直接把組件的名稱以HTML標簽的形式,引入到頁面中即可 -->
    <my-com1></my-com1>
  </div>

 註意事項:

  1. 如果使用 Vue.component 註冊組件的時候,組件名稱使用了駝峰命名,則在引用組件的時候,需要把大寫的駝峰改為小寫的字母,同時,兩個單詞之間使用 “-” 連接
  2. 如果不使用駝峰,則直接拿名稱來使用即可;

其它兩種創建組件的方式:

    Vue.component('myCom1', Vue.extend({
      template: '<h3>這是使用Vue.extend創建的組件</h3>'
    }))
    Vue.component('mycom2', {
      template: '<div><h3>這是直接使用Vue.component創建出來的組件</h3><span>123</span></div>'
    })

註意:不論是哪種方式創建出來的組件,組件的 template 屬性指向的模板內容,必須有且只能有唯一的一個根元素

在被控制的#app外面,使用template元素,定義組件的HTML模板結構:

  <template id="tmpl">
    <div>
      <h1>這是通過 template 元素,在外部定義的組件結構,這個方式,有代碼的智能提示和語法高亮</h1>
    </div>
  </template>
   Vue.component('mycom3', {
      template: '#tmpl' //引用template的id屬性
    })

 私有組件:

  <template id="tmpl2">
    <h1>這是私有的 login 組件</h1>
  </template>
    var vm2 = new Vue({
      el: '#app2',
      components: { // 定義實例內部私有組件的
        login: {
          template: '#tmpl2'
        }
      },
    })

組件中的data和methods:

  1. 組件可以有自己的data數據;
  2. 組件的data和實例的data有點不一樣,實例中的data可以為一個對象,但是組件中的data必須是一個方法;
  3. 組件中的data除了必須為一個方法之外,這個方法內部還必須返回一個對象;
  4. 組件中的data數據,使用方式和實例中的data使用方式完全一樣
    Vue.component('mycom1', {
      template: '<h1>這是全局組件 --- {{msg}}</h1>',
      data: function () {
        return {
          msg: '這是組件的中data定義的數據'
        }
      }
    })

 為什麼組件中的data必須要是一個方法,演示如下:

Html代碼:

  <div id="app">
    <counter></counter>
    <hr>
    <counter></counter>
    <hr>
    <counter></counter>
  </div>
  <template id="tmpl">
    <div>
      <input type="button" value="+1" @click="increment">
      <h3>{{count}}</h3>
    </div>
  </template>

javascript代碼:

    var dataObj = { count: 0 }
    //這是一個計數器的組件, 身上有個按鈕,每當點擊按鈕,讓data中的count值+1
    Vue.component('counter', {
      template: '#tmpl',
      data: function () {
        // return dataObj
        return { count: 0 }
      },
      methods: {
        increment() {
          this.count++
        }
      }
    })
    // 創建 Vue 實例,得到 ViewModel
    var vm = new Vue({
      el: '#app',
      data: {},
      methods: {}
    });

調用測試結果如下 :

每個計數器的count是獨立的,如將將返回的值改為:

        return dataObj
        //return { count: 0 }

結果為:

每個組件的count是共用的,組件的data必須是一個方法,且必須返回一個對象。要解決的問題就是提高組件的復用性,防止組件與組件之間成員干擾。

組件的切換:

<body>
  <div id="app">
    <a href="" @click.prevent="flag=true">登錄</a>
    <a href="" @click.prevent="flag=false">註冊</a>
    <login v-if="flag"></login>
    <register v-else="flag"></register>
  </div>
  <script>
    Vue.component('login', {
      template: '<h3>登錄組件</h3>'
    })
    Vue.component('register', {
      template: '<h3>註冊組件</h3>'
    })
    var vm = new Vue({
      el: '#app',
      data: {
        flag: true
      },
      methods: {}
    });
  </script>
</body>

演示結果如下,預設顯示登錄組件,點擊註冊切換到註冊組件,點擊登錄切換的登錄組件。

 

 

 

缺點分析:如果在一個需求中需要切換更多的組件,這種方式不利於擴展。

    <!-- Vue提供了component ,來展示對應名稱的組件 -->     <!-- component 是一個占位符, “:is”是屬性,可以用來指定要展示的組件的名稱 -->
  <div id="app">
    <a href="" @click.prevent="comName='login'">登錄</a>
    <a href="" @click.prevent="comName='register'">註冊</a>
    <component :is="comName"></component>
  </div>
  <script>
    // 組件名稱是字元串
    Vue.component('login', {
      template: '<h3>登錄組件</h3>'
    })
    Vue.component('register', {
      template: '<h3>註冊組件</h3>'
    })
    // 創建 Vue 實例,得到 ViewModel
    var vm = new Vue({
      el: '#app',
      data: {
        comName: 'login' //當前component中的 :is 綁定的組件的名稱
      },
    });
  </script>

組件切換動畫:

html代碼:

  <div id="app">
    <a href="" @click.prevent="comName='login'">登錄</a>
    <a href="" @click.prevent="comName='register'">註冊</a>

    <!-- 通過 mode 屬性,設置組件切換時候的模式為先出後進-->
    <transition mode="out-in">
      <component :is="comName"></component>
    </transition>

  </div>

  <script>
    // 組件名稱是 字元串
    Vue.component('login', {
      template: '<h3>登錄組件</h3>'
    })

    Vue.component('register', {
      template: '<h3>註冊組件</h3>'
    })
    var vm = new Vue({
      el: '#app',
      data: {
        comName: 'login' // 當前 component 中的 :is 綁定的組件的名稱
      },
    });
  </script>

css代碼:

  <style>
    .v-enter,
    .v-leave-to {
      opacity: 0;
      transform: translateX(150px);
    }

    .v-enter-active,
    .v-leave-active {
      transition: all 0.5s ease;
    }
  </style>

子組件引用父組件的值:

 1     <div id="app">
 2         <com1></com1>
 3     </div>
 4     <script>
 5 
 6             Vue.component
 7             var vm = new Vue({
 8                 el:'#app',
 9                 data:{
10                     msg:"heelo !"
11                 },
12                 methods:{
13                 },
14                 components:{
15                     com1:{
16                         template:'<h1>這是子組件---{{msg}}</h1>'
17                     }
18                 }
19             })
20         </script>

執行結果:

預設情況下子組件是不能引用父組件的屬性和對象的,我們可以在引用子組件的時候,通過屬性綁定的形式(v-bind)的形式,把需要傳遞給子組件的數據,以屬性綁定的形式傳遞到子組件內部,供子組件使用,並且在props中聲明該屬性(props中的數據都是通過父組傳遞過來的,這裡的數據是只讀的),代碼如下:

 1     <div id="app">
 2         <com1 v-bind:parentmsg="msg"></com1>
 3     </div>
 4     <script>
 5         Vue.component
 6         var vm = new Vue({
 7             el: '#app',
 8             data: {
 9                 msg: "heelo !"
10             },
11             methods: {
12             },
13             components: {
14                 data() {
15                     return {
16                         title: '123',
17                         content: 'pppp'
18                     }
19                 },
20                 com1: {
21                     props: ['parentmsg'],
22                     template: '<h1>這是子組件---{{parentmsg}}</h1>'
23                 }
24             }
25         })
26     </script>

子組件調用父組件的方法:

請詳細看下麵代碼中的註釋

 1  <div id="app">
 2      
3 <com2 @func="show"></com2> 4 </div> 5 <template id="tmpl"> 6 <div> 7 <h1>這是子組件</h1> 8 <input type="button" value="這是子組件中的點擊按鈕" @click="myclick"> 9 </div> 10 </template> 11 <script> 12 //定義了一個字面量類型的組件模板對象 13 var com2 = { 14 template: '#tmpl', 15 data() { 16 return { 17 sonmsg: { name: 'wjl', age: 16 } 18 } 19 }, 20 methods: { 21 myclick() { 22 //當點擊子組件的按鈕時,通過$emit拿到父組件傳遞過來的func 23 //emit的英文願意為觸發、調用、發射的意思 24 this.$emit('func', this.sonmsg, 123, 456) 25 } 26 } 27 } 28 var vm = new Vue({ 29 el: '#app', 30 data: { 31 datamsg: null 32 }, 33 methods: { 34 show(data, data1, data2) { 35 console.log('調用了父組件的show方法:' + data.name + data1 + data2); 36 } 37 }, 38 components: { 39 com2 40 } 41 }) 42 </script>

執行結果:

我的博客即將搬運同步至騰訊雲+社區,邀請大家一同入駐:https://cloud.tencent.com/developer/support-plan?invite_code=2lv2gsiubr6sw


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • npm run build報錯 原理 按照他人的說法是,伺服器記憶體不夠用了,這樣就給他配置一個單獨的記憶體出來就解決了 解決方法 sudo /bin/dd if=/dev/zero of=/var/swap.1 bs=1M count=1024 sudo /sbin/mkswap /var/swap. ...
  • html中的定位體系 一、 分類 1、常規流static 2、浮動float 3、相對定位relative 4、絕對定位absolute 5、固定定位fixed 二、使用時的區分 在網頁佈局中,常常都會使用到這5中定位方式 ,總體分為三大類:靜態static、浮動float、絕對定位(relativ... ...
  • var i = 2, x = 5;var fn = function (x) { x += 3; return function (y) { console.log((x++) + y + (--i)); }};var f = fn(1);f(2);fn(3)(4);f(5); 答案:f(2) => ...
  • HTTP協議的發展歷史 HTTP/0.9 0.9版本是第一個定稿的HTTP版本,相對較為簡陋。它有以下特點: 只有一個命令GET 沒有header等描述數據的信息 伺服器發送完畢,就關閉TCP連接 註意一點,0.9版本的HTTP協議只要伺服器發送完畢,就直接關閉TCP連接,也就是說,一次TCP連接只 ...
  • 方法一: 容器確定寬高:知識點:transform只能設置在display為block的元素上。 方法一效果圖: 方法二: ...
  • Day3 Form表單 一.form表單 :提交數據 表單在網頁中主要負責數據採集功能,它用<form>標簽定義。 用戶輸入的信息都要包含在form標簽中,點擊提交後,<form>和</form>裡面包含的數據將被提交到伺服器或者電子郵件里。 所有的用戶輸入內容的地方都用表單來寫,如登錄註冊、搜索框 ...
  • 協議可以實現前後端全雙工通信,從而取代浪費資源的長輪詢。在此協議的基礎上,可以實現前後端數據、多端數據,真正的 實時響應 。在學習 的過程中,實現了一個簡化版群聊,過程和代碼詳細記錄在這篇文章中。 本篇文章來自 "董沅鑫的個人網站" ,引用、轉載請指明出處 。 查看更多知識,或者技術交流:請訪問 " ...
  • react教程(零)—— 安裝 react項目的基本配置,使用create-react-app和webpack構建react-app。主要介紹如何新建一個react-app,並對webpack如何創建react-app做了詳細介紹。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...