微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Vue混入mixins分发组件可复用功能

前言

那就是说,你可以单独写个逻辑文件认导出一个对象,对象里面可以包含data、created、mounted、methods 等vue模板文件中的逻辑对象。接着可以将这个对象引入到多个vue模板中进行功能复用,从而达到功能模块的逻辑封装,便于使用及后期维护。

这里我举一些日常开发中最常用的示例来说,更多的是 methods 的混入。

一、后端返回数据与字典数据之前的转换

通常情况下,像状态、类型、性质等属性,后端存储数据通过数字来进行存储,这些数字会有数据字典与之对应。那么在获取后端数据时,我们前端人员拿到的数据正是这些数字以及字典数据。在多个页面进行展示时,难道要在每个页面中写一个转换的方法吗?当然不是,这时候我们就可以使用混入来轻松解决这一问题。

数据转换的混入:

dataTrans.js

传入一个字典列表,传入一个数字状态。在字典数组中进行查找对应的文字说明。

export default {
    methods: {
        transDict(list,status) {
        // 这里使用 try--catch 是防止有的时候后端返回的数据中式null或空的情况,也就是说此条数据无状态,我们只需要在catch中返回 --- 或者 无状态 等字眼即可
            try {
                return list.find(item => item.dictValue == status).dictLabel
            } catch (error) {
                return '---'
            }
        }
    }
}

使用:

<template>
	<div>
		<el-table>
			<!-- 方式一 -->
			<el-table-column label="状态" prop="status" align="center" width="60" :formatter="e => transDict(status_list,e.status)" show-overflow-tooltip />
			<!-- 方式二 -->
			<el-table-column label="性质" prop="customerType">
                <template slot-scope="{ row }">{{ transDict(nature,row.customerType) }}</template>
            </el-table-column>
		</el-table>
	</div>
</template>
<script>
import { mapGetters } from 'vuex';
import dataTrans from '@/mixins/dataTrans';
export default {
	name: 'Index',mixins: [dataTrans],computed: {
		...mapGetters(['status_list','nature'])
	}
}
</script>

二、文件下载的混入

当我们遇到文件下载的需求时,请求接口后端返回的数据流,前端需要再写逻辑进行下载。这个时候当然也是可以通过写一个混入方法来做通用方法

tools.js 混入

export default {
    methods: {
    // 可传入字节流及想要的文件名。甚至可以传入文件后缀,进行多种文件类型下载,这里认的是下载Excel表格
        filesExport(res,title) {
            if(res != null) {
                res.download = `${title}.xlsx`
                let url = window.URL.createObjectURL(new Blob([res]))
                let link = document.createElement('a')
                link.style.display = 'none'
                link.href = url
                link.download = `${title}.xlsx`
                link.type = 'xls'
                document.body.appendChild(link)
                link.click()
            }else {
            	// 自定义的弹窗提示
                this.$commonjs.openNotify('导出失败','error')
            }
        }
    },}

使用:

<script>
import tools from '@/mixins/tools';
export default {
	name: 'Index',mixins: [tools],methods: {
		exportSheet() {
			let title = ''
			this.$commonjs.showLoading('正在导出')
			exportInvoiceApply(id).then((res) => {
                this.$commonjs.hideLoading()
                // 直接通过 this 调用 混入中的方法,传入 字节流标题
                this.filesExport(res,title)
            }).catch(() => {
                this.$commonjs.hideLoading()
            });
		}
	}
}
</script>

三、Element表格最后一行合计数据的混入

是的,这个合计当然也可以用混入,因为自定义的合计方法逻辑也是比较多的。

getSummaries.js 混入

export default {
    methods: {
    // params是el-table表格合计事件的认参数,里面包含表格中每一列的属性和数据 
    // prop 是自定义的传入的一个数组,意思是需要计算哪个属性的合计
    // title 是合计列 第一格的文字描述
        getSummariesMixins(params,prop,title) {
            const { columns,data } = params
            const sums = []
            columns.forEach((column,index) => {
                if(index === 0) {
                    sums[index] = title
                    return;
                }
                if(prop.includes(column.property)) {
                    const values = data.map(item => Number(item[column.property]));
                    if (!values.every(value => isNaN(value))) {
                        sums[index] = values.reduce((prev,curr) => {
                        const value = Number(curr);
                        if (!isNaN(value)) {
                            return prev + curr;
                        } else {
                            return prev;
                        }
                        },0);
                        sums[index] += '';
                    } else {
                        sums[index] = 'N/A';
                    } 
                }
            })
            return sums;
        }
    }
}

使用:

<template>
	<div>
		<el-table
             :data="dataList"
             border
             show-summary
             :summary-method="getSummaries"
             style="margin-top: 20px"
            >  
                <el-table-column type="index" width="55"/>
                <el-table-column label="名称" prop="goodsName" show-overflow-tooltip/>
                <el-table-column label="型号" prop="goodsModel" show-overflow-tooltip/>
                <el-table-column label="单位" prop="unit" show-overflow-tooltip>
                    <template slot-scope="{row}">{{ row.unit || row.goodsUnit }}</template>
                </el-table-column>
                <el-table-column label="数量" prop="number" show-overflow-tooltip>
                    <template slot-scope="{row,$index}">
                        <el-input v-model="row.number" @input="changeNumber($event,$index)" size="mini" type="number"/>
                    </template>
                </el-table-column>
                <el-table-column label="单价(含税)" prop="unitPrice" show-overflow-tooltip/>
                <el-table-column label="金额(含税)" prop="amount" show-overflow-tooltip />
                <el-table-column label="操作" align="center" fixed="right" width="100">
                    <template slot-scope="scope">
                        <el-button @click="deleteItems(scope)" type="text" style="color: #F56C6C;">删除</el-button>
                    </template>
                </el-table-column>
            </el-table>
	</div>
</template>
<script>
import getSummaries from '@/mixins/getSummaries';
export default {
	name: 'Index',mixins: [getSummaries],methods: {
		getSummaries(params) {
		// ['number','amount'] 是表格中的 prop 属性,需要对哪个属性进行合计 就写进数组里即可。
            return this.getSummariesMixins(params,['number','amount'],'合计')
        }
	}
}
</script>

除以上三种用法之外,还有很多其它用法,例如 审批功能 的实现,还需要在混入中写入 data 函数,来保存需要审批项的id和类型等字段。

好多种用法在混入中可以灵活使用,需要学会变通。

原文地址:https://blog.csdn.net/weixin_43729943/article/details/127023823

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐