Vuejs 頁(yè)面的區(qū)域化與組件封裝

組件的好處

當(dāng)我用vue寫頁(yè)面的時(shí)候,大量的數(shù)據(jù)頁(yè)面渲染,引入組件簡(jiǎn)化主頁(yè)面的代碼量,當(dāng)代碼區(qū)域塊代碼差不多相同時(shí),組件封裝會(huì)更加簡(jiǎn)化代碼。組件是Vue.js最強(qiáng)大的功能之一。

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

我用一個(gè)讀書軟件的圖書列表例子:

圖書展示頁(yè) 大家可以想想用vue如何實(shí)現(xiàn)這個(gè)頁(yè)面的前端頁(yè)面實(shí)現(xiàn),再來(lái)實(shí)現(xiàn)邏輯功能;
圖片顯示的 '推薦圖書' 和 '最新圖書' 的列表展示是一樣的,開(kāi)始可以用重復(fù)的代碼把先寫好的 '推薦圖書' 的代碼復(fù)制一份就可以輕輕松松實(shí)現(xiàn) '最新圖書' 頁(yè)面

image.png

如果其他頁(yè)面也需要這個(gè)展示,或我想代碼更加簡(jiǎn)潔一點(diǎn),那么來(lái)組件如何封裝就派上場(chǎng)啦

簡(jiǎn)要頁(yè)面:圖書列表展示頁(yè) - 圖書列表組件

|- book.vue // 圖書展示頁(yè)面
  |-- BookList.vue // 圖書列列表組件

基礎(chǔ)部分相信使用過(guò)vue的伙計(jì)都知道如何使用,我直接上代碼:

創(chuàng)建一個(gè)組件 - 注冊(cè)組件 - 使用組件

// 引入組件
import BookList from '../../components/bookList/BookList.vue';

// 注冊(cè)組件
components:{
  BookList,
},

// 使用組件
<book-list></book-list>
vue2.0 規(guī)定引入組件建議使用駝峰命名,使用時(shí)用 - 分開(kāi),vue才更好識(shí)別

之前沒(méi)封封裝組件的代碼就不上傳了,直接上代碼:

圖書列表頁(yè) - book.vue

|- book.vue - html 頁(yè)面
  <template> 
    <div>
    <h2>歡迎來(lái)到波波圖書館!</h2>
          
    <!-- 推薦讀書 -->
    <section class="box recommend-book">
      <!-- 大家注意 :books 是BookList.vue組件里圖書對(duì)象數(shù)組 heading 是傳給組件的標(biāo)題 -->
      <book-list :books="recommendArray" heading="推薦圖書"></book-list>
    </section>

    <!-- 最新圖書 -->
    <section class="box update-book">
      <!-- 大家注意 :books 是BookList.vue組件里圖書對(duì)象數(shù)組 heading 是傳給組件的標(biāo)題 -->
      <book-list  :books="updateBookArray" heading="最新圖書"></book-list>
    </section>

    </div>
  </template>

我是模擬數(shù)據(jù),開(kāi)發(fā)過(guò)程中是用api接口拿數(shù)據(jù)的,其實(shí)都一樣,代碼有點(diǎn)多,原理都一樣,大家看一下也可以了解一下json的知識(shí)

|- book.vue - js 
<script>
  import BookList from '../../components/bookList/BookList.vue';
  export default({
    data(){
        return {

        // 推薦圖書
        recommendArray:[
          {
            id:1,
            img_url: 'https://ss2.baidu.com/6ONYsjip0QIZ8tyhnq/it/u=671627465,1455045194&fm=173&s=23A2F3039C930EC41A2DB9090300D093&w=640&h=427&img.JPEG',
            book_name:'Vuejs-1',
            book_author:'liangfengbo',
          },

          {
            id:2,
            img_url: 'https://ss2.baidu.com/6ONYsjip0QIZ8tyhnq/it/u=671627465,1455045194&fm=173&s=23A2F3039C930EC41A2DB9090300D093&w=640&h=427&img.JPEG',
            book_name:'Vuejs-2',
            book_author:'liangfengbo',

          },

          {
            id:3,
            img_url: 'https://ss2.baidu.com/6ONYsjip0QIZ8tyhnq/it/u=671627465,1455045194&fm=173&s=23A2F3039C930EC41A2DB9090300D093&w=640&h=427&img.JPEG',
            book_name:'Vuejs-3',
            book_author:'liangfengbo',

          },
        ],

        // 最新圖書
        updateBookArray:[
          {
            id:5,
            img_url: 'https://ss2.baidu.com/6ONYsjip0QIZ8tyhnq/it/u=671627465,1455045194&fm=173&s=23A2F3039C930EC41A2DB9090300D093&w=640&h=427&img.JPEG',
            book_name:'Vuejs-5',
            book_author:'liangfengbo',

          },

          {
            id:6,
            img_url: 'https://ss2.baidu.com/6ONYsjip0QIZ8tyhnq/it/u=671627465,1455045194&fm=173&s=23A2F3039C930EC41A2DB9090300D093&w=640&h=427&img.JPEG',
            book_name:'Vuejs-6',
            book_author:'liangfengbo',

          },
          {
            id:7,
            img_url: 'https://ss2.baidu.com/6ONYsjip0QIZ8tyhnq/it/u=671627465,1455045194&fm=173&s=23A2F3039C930EC41A2DB9090300D093&w=640&h=427&img.JPEG',
            book_name:'Vuejs-7',
            book_author:'liangfengbo',

          },
        ],
      }
    },

    // 引入組件
    components:{
      BookList,
    },

    methods : {
          
    },
  })
</script>

|- book.vue - css
<style>
  *{
    margin: 0;
    padding: 0;
  }
  li{
    list-style:none;
  }
    .box{
    height: auto;
    border-bottom: 1px solid #efefef;
    margin: 10px 0;
    padding: 5px 0;
  }
</style> 

組件 - BookList.vue

|- 組件 - BookList.vue - html
<template>
  <div>
    <!-- 頭部 -->
    <!--這個(gè)是頁(yè)面?zhèn)鱽?lái)的標(biāo)題 -->
    <h3 class="heading">{{heading}}</h3>
    <!-- 列表 -->
    <article class="book-list">
      <!-- 遍歷圖書數(shù)據(jù) -->
      <li v-for="book in books">

        <router-link :to="{ name:'BookDetail',params:{ id: book.id }}">
          ![](book.img_url) <!-- 圖書圖片 -->
          {{book.book_name}}  <!-- 圖書名字 -->
        </router-link>

      </li>      
      </article>
  </div>
</template>
|- 組件 - BookList.vue - html
<script>
  export default({
    // props 數(shù)據(jù)傳遞的意思
    props:[
      'heading',//標(biāo)題
      'books',//圖書對(duì)象數(shù)組
    ],
    data(){
      return {
    
      }
    },
    methods : {
          
    },
  })
</script>
|- 組件 - BookList.vue - css
<style scoped>
    /*圖書列表*/
  .book-list {
    width:100%;
    height:128px;
    display: flex;
    justify-content: space-around;
  }
  .heading {
    border-left: 4px solid #333;
    margin: 10px 0;
    padding-left: 4px;
  }
  .book-list li {
    width:80px;
    height: 100%;
    flex:1;
    margin:0 10px;

  }

  .book-list li img{
    height: 100px;
    width: 100%;
  }
  .book-list li a{
    text-align: center;
    font-size: 12px;
    text-decoration: none;
    display: inline-block;
    width: 100%;
  }
</style>

全部的代碼就在這里啦,大家可以細(xì)心發(fā)現(xiàn),組件封裝,其實(shí)就向我們之前JavaScript函數(shù)封裝一樣,傳遞參數(shù),接收參數(shù),渲染數(shù)據(jù),重復(fù)利用,大家可以直接復(fù)制代碼運(yùn)行看一下,注釋有解釋啦。

小干貨

父組件 調(diào)用 子組件 方法為 :

在子組件上寫上名字 如:
<start-set-timeout seconds=60 ref="contTimer"></start-set-timeout>
調(diào)用方法:this.$refs.contTimer.countTime(60)

但是

因?yàn)橛袛?shù)據(jù)的延遲 經(jīng)常會(huì)出現(xiàn)調(diào)用子組件的事件出現(xiàn)undefined的事情:
TypeError: Cannot read property 'countTime' of undefined

解決方法是

// 調(diào)用時(shí)加一個(gè)定時(shí)器
setTimeout(() => {
  this.$refs.contTimer.countTime(60)
}, 20)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 178,872評(píng)論 25 709
  • 轉(zhuǎn)載 :OpenDiggawesome-github-vue 是由OpenDigg整理并維護(hù)的Vue相關(guān)開(kāi)源項(xiàng)目庫(kù)...
    果汁密碼閱讀 23,394評(píng)論 8 124
  • 下班的時(shí)候,雨還嘩嘩地下著。因?yàn)橄掠?,打不到車,快走到家的時(shí)候,雨就停了。雨總是這樣,在你不希望下的時(shí)候,下了,在...
    蘇蘇整理家閱讀 194評(píng)論 0 0
  • l2016-03-03 寶木大仙 淺白軒 我妹妹小棉,身高1米7,長(zhǎng)相標(biāo)致,會(huì)化妝,會(huì)搭配,從農(nóng)村丫頭到網(wǎng)紅sty...
    寶木大仙閱讀 758評(píng)論 0 1
  • 我的婆婆今年74歲了,是典型的勤勞婦女。現(xiàn)在這么大年紀(jì)了,她也閑不住。喜歡走去廠里做一些小工。以前因?yàn)樽鲂」さ氖拢?..
    志成媽媽閱讀 392評(píng)論 0 0

友情鏈接更多精彩內(nèi)容