淺談Vue內(nèi)置component組件的應(yīng)用場(chǎng)景
官方的說(shuō)明
渲染一個(gè)“元組件”為動(dòng)態(tài)組件。依 is 的值,來(lái)決定哪個(gè)組件被渲染。
<!-- 動(dòng)態(tài)組件由 vm 實(shí)例的屬性值 `componentId` 控制 --> <component :is="componentId"></component>
具體可以官網(wǎng)文檔中的
場(chǎng)景
這里通過(guò)一個(gè)業(yè)務(wù)場(chǎng)景來(lái)闡述vue內(nèi)置component組件的應(yīng)用。 如圖所示,這里展示經(jīng)典注冊(cè)頁(yè)面,注冊(cè)分為郵箱注冊(cè)和手機(jī)注冊(cè),彈窗頂部有標(biāo)簽可以切換注冊(cè)類型,中間是注冊(cè)表單信息,郵箱注冊(cè)和手機(jī)注冊(cè)有著不一樣的表單內(nèi)容,底部是注冊(cè)按鈕以及其他操作。 經(jīng)過(guò)分析手機(jī)注冊(cè)界面與郵箱注冊(cè)除了中間的表單內(nèi)容不一致之外,其他的界面內(nèi)容是一樣的。
實(shí)際項(xiàng)目代碼設(shè)計(jì)中,為了保證復(fù)用性和可維護(hù)性,是會(huì)有一些可行的方案。這里我們采用vue內(nèi)置的component組件來(lái)實(shí)現(xiàn)這一點(diǎn)。
核心代碼實(shí)現(xiàn)
頂部tab切換的時(shí)候,type值發(fā)生改變,對(duì)應(yīng)的表單的組件也發(fā)生了變化
<template> <div> <a href="javascript:;" rel="external nofollow" rel="external nofollow" @click.prevent="handleCloseBtnClick"></a> <div> <h3>新用戶注冊(cè)</h3> <div> <span :class="{active: type === 'mobileForm'}" @click="type = mobileForm">手機(jī)注冊(cè)</span> <span :class="{active: type === 'emailForm'}" @click="type = emailForm">郵箱注冊(cè)</span> </div> </div> <component :is="type" ref="form"> <button @click="handleRegisterBtnClick">注冊(cè)</button> <div ><span ><span>注冊(cè)視為同意</span><a> 《法律條款和隱私說(shuō)明》</a></span></div> <div><span>已有賬號(hào)<a href="javascript:;" rel="external nofollow" rel="external nofollow" @click.prevent="handleLoginBtnClick">直接登入>></a></span></div> </component> </div> </template> <script> export default { methods: { handleRegisterBtnClick () { this.$refs.form.validateData().then(() => { this.$refs.form.getFormData() }) } } } </script>
mixins混合
用Vue內(nèi)置component組件情況下,一般實(shí)際被渲染的組件具有一定的共性,比如相同的屬性,相同的方法或者相同的初始化銷毀過(guò)程。比如目前這個(gè)場(chǎng)景中郵箱表單和手機(jī)表單都具有校驗(yàn)方法(validateData)和獲取表單數(shù)據(jù)方法(getFormData)。 這種情況下可以使用vue提供的混合的功能。進(jìn)一步抽離 mixins.js
export default { methods: { validateData() { return Promise.resolve() }, getFormData() { return {} } } }
email-form.vue
<script> import minx from './mixins' export default { mixins: [mixins], methods: { getFormData() { return { email: 'example@example.com' } } } } </script>
如果有自定義的需求,可以重寫(xiě)mixins中的方法。
表格的應(yīng)用
在管理后臺(tái)項(xiàng)目中,表格經(jīng)常會(huì)被用到。我們希望表格的td是文本、進(jìn)度條、checkbox等等,且希望通過(guò)傳一個(gè)json配置就可以渲染出。使用vue內(nèi)置的component組件可以起到很贊的作用。
比如這樣的一個(gè)table使用方式
<template> <vue-table ref="table" :columns="columns" :datum="datum"></vue-table> </template> <script> export default { data () { return { columns: [ { title: 'ID', width: '30', dataKey: 'id' }, { title: '進(jìn)度組件', dataKey: 'progress', render: { type: 'progress2', max: 100, precision: 2 } } ], datum: [{ id: '1', name: '進(jìn)度0', progress: 10 }] } } } </script>
table中使用component的實(shí)現(xiàn)
<td v-for="column of columns"> <component :is="`${TYPE_PRE}${columns.render.type}`" :row-data="rowData" :params="columns.render"></component> </td>
表單的應(yīng)用
在管理后臺(tái)項(xiàng)目中,表單也經(jīng)常需要用到,我們也同樣希望表單的某一項(xiàng)是文本框,下拉框,時(shí)間選擇框,富文本等等等等,且希望通過(guò)傳一個(gè)json配置就可以渲染出。vue內(nèi)置的component組件可以依然可以實(shí)現(xiàn)這樣一個(gè)美好的愿景。
比如這樣的一個(gè)form使用方式
<template> <c-form :cells="cells" ref="form"> <button class="button is-primary" :class="{ 'is-disabled': isSubmitBtnDisabled }" @click.prevent="submit">提交</button> </c-form> </template> <script> export default { computed: { cells () { return [ { field: 'name', label: '名稱', type: 'textfield', attrs: { placeholder: '名稱' }, validate: { required: { message: '請(qǐng)輸入名稱'} } }, { field: 'enable', label: '啟用標(biāo)志', type: 'dropdown', extra: {options: [{ label: '啟用', value: 1 }, { label: '禁用', value: 2 }] } } ] } } } </script>
form中使用component的實(shí)現(xiàn)
<form> <c-form-cell v-for="cell of cellList" :key="cell.field" :field="cell.field"> <component :is="`${TYPE_PRE}${cell.type}`" :field="cell.field" :attrs="cell.attrs" :extra="cell.extra" :validate="cell.validate" :cells="cell.cells"> </component> </c-form-cell> </form>
表單和表格在 基于VUE的后臺(tái)引擎 開(kāi)源項(xiàng)目中都有實(shí)現(xiàn),歡迎star和fork。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
基于Vue3實(shí)現(xiàn)一個(gè)簡(jiǎn)單的方位動(dòng)畫(huà)
這篇文章主要為大家詳細(xì)介紹了如何基于Vue3實(shí)現(xiàn)一個(gè)簡(jiǎn)單的方位動(dòng)畫(huà),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-02-02如何使用el-table實(shí)現(xiàn)純前端導(dǎo)出(適用于el-table任意表格)
我們?nèi)粘W鲰?xiàng)目,特別是后臺(tái)管理系統(tǒng),常常需要導(dǎo)出excel文件,這篇文章主要給大家介紹了關(guān)于如何使用el-table實(shí)現(xiàn)純前端導(dǎo)出的相關(guān)資料,本文適用于el-table任意表格,需要的朋友可以參考下2024-03-03Vue實(shí)現(xiàn)todo應(yīng)用的示例
這篇文章主要介紹了Vue實(shí)現(xiàn)todo應(yīng)用的示例,幫助大家更好的理解和學(xué)習(xí)使用vue框架,感興趣的朋友可以了解下2021-02-02關(guān)于vue中的ajax請(qǐng)求和axios包問(wèn)題
大家在vue中,經(jīng)常會(huì)用到數(shù)據(jù)請(qǐng)求問(wèn)題,常用的有vue-resourse、axios ,今天小編給大家介紹下axios的post請(qǐng)求 ,感興趣的朋友跟隨腳本之家小編一起看看吧2018-04-04Vue響應(yīng)式原理模擬實(shí)現(xiàn)原理探究
這篇文章主要介紹了Vue響應(yīng)式原理,響應(yīng)式就是當(dāng)對(duì)象本身(對(duì)象的增刪值)或者對(duì)象屬性(重新賦值)發(fā)生了改變的時(shí)候,就會(huì)運(yùn)行一些函數(shù),最常見(jiàn)的示render函數(shù)2022-09-09如何解決vue在ios微信"復(fù)制鏈接"功能問(wèn)題
這篇文章主要介紹了如何解決vue在ios微信"復(fù)制鏈接"功能問(wèn)題,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-03-03