1. 程式人生 > 程式設計 >Vue中component標籤解決專案元件化操作

Vue中component標籤解決專案元件化操作

一、 囉嗦幾句

在vue專案元件化的過程中,遇到了一些問題,什麼問題呢?就是在做一個多功能,多可用,多相容的大元件的時候,發現在這個元件內部,實現了太多的if、for邏輯,包括大量的html元素,雖然說每段功能塊都有批註,但是體積還是比較龐大,最近有些需求,需要將頁面上的一大塊篩選功能剝離開,形成單獨的元件,統一資料渲染,統一元件管理,且這些功能無論是樣式,或者是從結構來說,差異性都很大,所以考慮了以下幾種開發方式:

1. 大容量單元件開發,渲染和傳入的資料使用各種type、ctype判斷

2. 使用插槽開發,根據type呼叫對應的元件

3. 使用component載入元件的方式,動態渲染呼叫元件

最終選擇:第三種方式,採用<component>標籤動態引入的方式開發

二、 官方文件解釋

1. https://cn.vuejs.org/v2/guide/components.html#動態元件

2. https://cn.vuejs.org/v2/guide/components-dynamic-async.html

3. https://jsfiddle.net/chrisvfritz/o3nycadu/

三、 開發步驟

1. 首先按照大元件模式開發,功能拆分,統一在大元件中實現所有功能模組的樣式 ( 注意:需要在在區域性樣式覆蓋全域性樣式的條件需要在樣式中使用 /deep/ 、 >>> )

<template>
  <div class="filter-input-container">
 
    <!-- 選項卡 -->
    <div class="filter-line">
      //...
    </div>
 
    <!-- 時間選擇 -->
    <div class="filter-line">
      //...
    </div>
 
    <!-- 資訊列別下拉框 -->
    <div class="filter-line">
      //...
    </div>
 
    <!-- 搜尋表單框 -->
    <div class="filter-line">
      //...
    </div>
 
  </div>
</template>
 
<script scoped>
  import { DatePicker,Select,Option,Button,Input } from 'element-ui';
  export default {
    components:{
      'el-date-picker': DatePicker,'el-select': Select,'el-option': Option,'el-button': Button,'el-input': Input
    }
  } 
</script>
 
<style scoped lang="stylus">
  @import './stylus/filter-input.styl'
</style>

2. 單個功能元件剝離成單獨的元件檔案

(1)搜尋:fi-search.vue

(2)下拉: fi-select.vue

(3)標籤:fi-tab.vue

(4)時間:fi-time.vue

然後在每個單獨的元件內設定預設的props值,通過這個值來動態渲染元件和繫結資料,根據元件類別繫結click或者change事件

3. 選擇一個下拉功能檔案原始碼示例分析

<template>
  <div class="filter-line">
    <section class="filter-line-title">{{title}}</section>
    <section class="filter-line-content">
 
       <span class="flc-span-wrap">
        
        <!-- 下拉框選項卡 -->
        <el-select v-model="contents.value" placeholder="請選擇" :class="'selectBox'">
          <el-option
            v-for = "v,i in contents.options"
            :key = "i"
            :label = "v.label"
            :value = "v.value">
          </el-option>
        </el-select>
      </span>
 
    </section>
  </div>
</template>
 
<script scoped>
 
  import { Select,Option } from 'element-ui';
 
  export default {
    name: 'fi-select',data(){
      return {
        selectValue: ''
      }
    },props:{
      title:{
        type: String,default: '資訊類別'
      },contents:{
        type: Object,default:() => ({
          options: [
            { label: 'show option 1',value: 1 },{ label: 'show option 2',value: 2 },{ label: 'show option 3',value: 3 },{ label: 'show option 4',value: 4 }
          ],value: ''
        })
      }
    },methods:{
 
    },components:{
      'el-select': Select,'el-option': Option
    }
  }
</script>

4. 呼叫下拉框示例

<component v-bind:is="FiSelect" :title="'任務類別'"></component>

四、 資料渲染和管理的邏輯

我們將通過資料渲染及繫結所有元件內容,所以資料的結構如下:

export const listFilters = [{
  title: '工作狀態',type: 'tab',emit: '',contents: [
    {name:'all',text: '全部'},{name:'not-issued',text: '未完成'},{name: 'is-issued',text:'已完成'},{name: 'is-ended',text: '已結束'}
  ]
},{
  title: '工作時間',type: 'time',contents: [
    { type:'tab',name:'all',text: '全部' },{ type:'tab',name:'today',text: '今天' },name: 'week',text:'一週內' },text:'這個月' },{ type:'custom',name:'custom',sv:'',ev:'' }
  ]
},{
  title: '來源類別',type: 'select',contents: {
    options: [
      { label: '型別 1',{ label: '型別 2',{ label: '型別 3',{ label: '型別 4',value: 4 }
    ],value: ''
  }
},{
  title: '網站名稱',contents: {
    options: [
      { label: '騰訊網',{ label: '新浪網',{ label: '網易網',{ label: '鳳凰網',value: 4 },{ label: '搜狐網',value: 5 }
    ],{
  title: '工作搜尋',type: 'search',contents: {
    inputValue: ''
  }
}];

五、元件遍歷呼叫渲染

<template>
  <div class="filter-input-container">
    <!-- 最終可以動態呼叫所有元件 -->
    <component v-bind:is="'fi-'+v.type" :title="v.title" :contents="v.contents" v-for="v,i in listFilters" :key="i"></component>
  </div>
</template>
 
<script scoped>
 
  import {listFilters} from './scripts/filters.data.js';
 
  export default {
    data(){
      return {
        components:['fi-tab','fi-time','fi-select','fi-search','fi-input'],listFilters: listFilters
      }
    },props:{
      
    },methods:{
      
    },components:{
      'fi-search': () => import('../components/fi-search.vue'),//搜尋表單
      'fi-tab': () => import('../components/fi-tab.vue'),// tab切換
      'fi-time': () => import('../components/fi-time.vue'),// 時間選擇
      'fi-select': () => import('../components/fi-select.vue') // 選擇下拉框
    }
  } 
</script>
 
<style scoped lang="stylus">
  @import './stylus/filter-input.styl'
</style>

六、 最終案例預覽效果

Vue中component標籤解決專案元件化操作

補充知識:vue中component元件使用——模組化開發和全域性元件

1、模組化開發元件:

box1.vue檔案如下:

<template>
 <div class="hello">
  <h1>測試</h1>
 </div>
</template>
 
<script>
export default {
 
}
</script>

box2.vue檔案如下:import引入box1.vue,components設定,然後設定成標籤使用<box1><template>

<div>
  <box1></box1>
 </div>
</template>
 
<script>
import box1 from '@/components/box1'
export default {
 components: {'box1': box1},}
</script>

2、全域性組建

<div id="example">
 <my-component></my-component>
</div>
// 註冊
Vue.component('my-component',{
 template: '<div>A custom component!</div>'
})
// 建立根例項
new Vue({
 el: '#example'
})

渲染為:

<div id="example">
 <div>A custom component!</div>
</div>

以上這篇Vue中component標籤解決專案元件化操作就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援我們。