vue mixins代碼復用的項目實踐
導語:
兩年前來到新公司,開始使用vue開發,代碼復用程度比較低。到後期大量的開發經驗,以及看瞭一些設計模式類的書籍。才開始慢慢總結一些代碼復用的經驗。分享出來,
PS: Vue版本2.6
場景:
1. 代碼裡有很多當前組件需要的純函數,methods過多
<!-- 主文件 --> <template> <button @click="clickHandle">button</button> </template> <script> export default { name: 'PageDemo', methods: { func1(){}, func2(){}, func3(){}, clickHandle(){ this.func1(); this.func2() this.func3() console.log('button clicked') } }, } </script>
如果當前組件不好拆分,就會出現很多函數,代碼會顯得不清晰。 我現在的處理方法是通過mixins
混入,參照MVC思想,當前文件的的methods隻寫和模板直接引用的處理方法,其他的函數都通過混入方式引用。
// compose-demo.js export default { methods: { func1(){}, func2(){}, func3(){}, } }
<template> <button @click="clickHandle">button</button> </template> <script> // 主文件 import ComposeDemo from './compose-demo' export default { name: 'PageDemo', mixins: [ComposeDemo], methods: { clickHandle(){ this.func1(); this.func2() this.func3() console.log('button clicked') } }, } </script>
充分利用mixins
還有很多優點。
2. 舉個例子你有一個組件需要拋出兩個數據,直接的v-model
不適用。需要采用$emit
方法
// 組件 <template> <input v-model="a" @change="inputChangeHandle"/> <input v-model="b" @change="inputChangeHandle" /> </template> <script> export default { name: 'ComponentChild', props: { propA: { type: String }, propB: { type: String } }, data(){ return { a: this.propA, b: this.propB, } }, methods: { inputChangeHandle(){ this.$emit('update-data', {a:this.a, b:this.b}) } } } </script> // 調用方 <template> <component-child :propA="query.a" :propB="query.b" @update-data="getData"/> </template> <script> import ComponentChild from './component-child.vue' export default { name: 'Page1', components: {ComponentChild}, data(){ return { query: { a: '默認數據a', b: '默認數據b' } } }, methods: { getData(payload) { const {a,b}=payload; this.query.a = a; this.query.b = b; } } } </script>
如果你有多處地方需要用到ComponentChild
組件,那每個調用地方都需要寫一個方法來監聽@update-data
事件。
此時,可以這樣改一下
// 純函數,引入ComponentChild,並且聲明getData方法 // compose-component-child.js <script> import ComponentChild from './component-child.vue' </script> export default { components: {ComponentChild}, methods: { // 通常情況,復用的業務組件都會有同樣的數據結構,都帶有query.a和query.b。如果不一致,那直接在父組件重寫該方法 getData(payload) { const {a,b}=payload; this.query.a = a; this.query.b = b; } } } // 調用方 <template> <component-child :propA="query.a" :propB="query.b" @update-data="getData"/> </template> <script> import ComposeComponentChild from './compose-component-child.js' export default { name: 'Page1', mixins: [ComposeComponentChild] data(){ return { query: { a: '默認數據a', b: '默認數據b' } } }, methods: { } } </script>
借鑒瞭Angular的依賴註入,Page
不直接聲明、引用Component
,而是通過混入Compose
直接使用。
Component
組件,Compose
引入Component
並且註冊Component
(聲明額外的方法),Page
調用組件混入Compose
,就可以可以直接使用Component
組件
3. 同理,可以通過這個方式復用很多data數據,避免模板化的聲明
比如常用的表格需要一下數據
<script> import {defaultPageSize}from '@/setting' export default { data(){ return { tableList: [], pageSize: defaultPageSize, pageNo: 1, totalRecords: 0, } } } </script>
以上數據都可以組裝為一個compose-table.js
文件混入到你要使用的地方,當然也可以通過在compose-table
引用註冊表格組件。
總結:
- 優點:提高代碼復用性,同一個組件也可以進行更細致的功能劃分
- 缺點:mixins無法自動利用通過編輯器自動導航到實現的文件,需要全項目搜索,對於熟悉的人來說,使用很方便。對於新人來講,閱讀代碼會有些困難。
到此這篇關於vue mixins代碼復用的項目實踐的文章就介紹到這瞭,更多相關vue mixins代碼復用內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- vue在自定義組件上使用v-model和.sync的方法實例
- vue2.x中$attrs的使用方法教程
- Vue組件之間四種通信方式詳解
- Vue中Mixin&extends的詳細使用教程
- vue cli 局部混入mixin和全局混入mixin的過程