IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> JavaScript知识库 -> Vue2中混入(mixins)的实战应用 -> 正文阅读

[JavaScript知识库]Vue2中混入(mixins)的实战应用

混入的官方定义: 混入 (mixin) 提供了一种非常灵活的方式,来分发 Vue 组件中的可复用功能。一个混入对象可以包含任意组件选项。当组件使用混入对象时,所有混入对象的选项将被“混合”进入该组件本身的选项。

那也就是说,你可以单独写个逻辑文件,默认导出一个对象,对象里面可以包含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和类型等字段。

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

  JavaScript知识库 最新文章
ES6的相关知识点
react 函数式组件 & react其他一些总结
Vue基础超详细
前端JS也可以连点成线(Vue中运用 AntVG6)
Vue事件处理的基本使用
Vue后台项目的记录 (一)
前后端分离vue跨域,devServer配置proxy代理
TypeScript
初识vuex
vue项目安装包指令收集
上一篇文章      下一篇文章      查看所有文章
加:2022-09-30 00:43:36  更:2022-09-30 00:44:50 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/17 19:23:25-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码