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

目录
  • 前言
  • 一、后端返回数据与字典数据之前的转换
  • 二、文件下载的混入
  • 三、Element表格最后一行合计数据的混入

前言

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

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

到此这篇关于Vue混入mixins分发组件可复用功能的文章就介绍到这了,更多相关Vue混入mixins内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • vue中的mixins混入使用方法

    目录 作用 使用方法 全局混入 局部混入 作用 用简单的话去概括就是一种分发vue组件中的功能可以复用一个技术,使用这个技术我们可以把需要复用的内容封装成一个vue组件,方便下次使用方便 使用方法 首先在src中去创建一个自己的文件夹,然后把要封装的内容放入到这个文件夹,方便后续的调用 let mymixin={ methods:{ handleBtn(){ alert('封装的内容已经触发!') } } } export default mymixin 全局混入 全局混入就是我们可以把封装好的

  • Vue混入mixins滚动触底的方法

    前言 在app端常常看到类似加载数据的动画,接下来我们来实现滚动触底加载动画提示,以及如何复用这些逻辑. 如何判断滚动触底 来看下几张图: 情况一: 当文档高度还为超过可视区域高度时,不存在滚动,所以也没有滚动触底 情况二: 当文档高度超过可视区域的高度时,还有剩余的文档没有滚动完,也就是说 可视区域高度 + 滚动高度 < 文档高度 ,此时没有达到滚动触底的条件   情况三: 文档高度大于可视区域,并且滚动到文档底部, 也就是说 可视区域高度 + 滚动高度 = 文档高度 判断是否滚动到底 经过上

  • 深入了解Vue.js 混入(mixins)

    混入 (mixins)定义了一部分可复用的方法或者计算属性.混入对象可以包含任意组件选项.当组件使用混入对象时,所有混入对象的选项将被混入该组件本身的选项. 来看一个简单的实例: var vm = new Vue({ el: '#databinding', data: { }, methods : { }, }); // 定义一个混入对象 var myMixin = { created: function () { this.startmixin() }, methods: { startmix

  • Vue 详解mixins混入用法大全

    目录 前言 一.什么是Mixins? 二.什么时候使用Mixins? 三.如何创建Mixins? 四.如何使用Mixins? 五.Mixins的特点 六.Mixins合并冲突 七.与vuex的区别 八.与公共组件的区别 前言 当我们的项目越来越大,我们会发现组件之间可能存在很多相似的功能,你在一遍又一遍的复制粘贴相同的代码段(data,method,watch.mounted等),如果我们在每个组件中去重复定义这些属性和方法会使得项目出现代码冗余并提高了维护难度,针对这种情况官方提供了Mixin

  • Vue中mixins混入的介绍与使用详解

    目录 一.来自官网的描述 二.如何创建Mixins 三.项目中如何使用混入 四.与vuex的区别 五.与公共组件的区别 一.来自官网的描述 混入 (mixins): 是一种分发 Vue 组件中可复用功能的非常灵活的方式.混入对象可以包含任意组件选项.当组件使用混入对象时,所有混入对象的选项将被混入该组件本身的选项. 二.如何创建Mixins 在src目录下创建一个mixins文件夹,文件夹下新建一个myMixins.js文件.前面我们说了mixins是一个js对象,所以应该以对象的形式来定义my

  • vue中混入mixins的使用方法

    目录 前言 使用方法 总结 前言 Vue中有一个设置项叫做混入 (mixins), 它的使用是用来做代码复用的.同时, 这个mixins 也分为局部混入和全局混入 vue中的解释是这样的,如果觉得语言枯燥的可以自行跳过嘿~ 混入 (mixins): 是一种分发 Vue 组件中可复用功能的非常灵活的方式.混入对象可以包含任意组件选项.当组件使用混入对象时,所有混入对象的选项将被混入该组件本身的选项.应用场景 下面先说一下 mixins 的应用场景, 假设现在我们两个组件, 当这两个组件被点击时,

  • 详解Vue.js Mixins 混入使用

    Mixins一般有两种用途: 1.在你已经写好了构造器后,需要增加方法或者临时的活动时使用的方法,这时用混入会减少源代码的污染. 2.很多地方都会用到的公用方法,用混入的方法可以减少代码量,实现代码重用. 一.Mixins的基本用法 我们现在有个数字点击递增的程序,假设已经完成了,这时我们希望每次数据变化时都能够在控制台打印出提示:"数据发生变化". 代码实现过程: <!DOCTYPE html> <html lang="en"> <h

  • Vue中的混入的使用(vue mixins)

    使用场景: 例如我们在Vue单页面开发的时候当多个组件中都需要下拉刷新,或者使用的都是一个方法的时候,我们就可以使用vue mixins进行封装调用,以及继承,具体看代码. 选项合并 var mixin = { data: function () { return { message: 'hello' } }, created:function(){ console.log('我是mixins中的created') }, methods:{ show:function(num){ console

  • Vue之Mixins(混入)的使用方法

    混入 (mixin) 提供了一种非常灵活的方式,来分发 Vue 组件中的可复用功能.一个混入对象可以包含任意组件选项.当组件使用混入对象时,所有混入对象的选项将被"混合"进入该组件本身的选项. 当组件和混入对象含有同名选项时,这些选项将以恰当的方式进行"合并". 比如,数据对象在内部会进行递归合并,并在发生冲突时以组件数据优先. var Mymixin = { data: function(){ return { message: 'hello', foo: 'ab

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

    目录 前言 一.后端返回数据与字典数据之前的转换 二.文件下载的混入 三.Element表格最后一行合计数据的混入 前言 那就是说,你可以单独写个逻辑文件,默认导出一个对象,对象里面可以包含data.created.mounted.methods 等vue模板文件中的逻辑对象.接着可以将这个对象引入到多个vue模板中进行功能复用,从而达到功能模块的逻辑封装,便于使用及后期维护. 这里我举一些日常开发中最常用的示例来说,更多的是 methods 的混入. 一.后端返回数据与字典数据之前的转换 通常

  • Vue使用mixin分发组件的可复用功能

    vue创建高阶组件的实现不够react优雅,但那是vue和react的设计思想导致的.在react中一切都是函数,而在vue中,组件最终都是函数,但在开发时可以是JSON对象,而且每个vue组件要注意三个点:props.events和slots,就是这三个导致vue创建高阶组件时要传入相应的属性,较react要复杂. vue官方推荐使用mixins来完成高阶组件的功能,如果对vue实现高阶组件有兴趣的话推荐看[vue实现高阶组件][1] 下面是vue官网使用mixins的例子: // 定义一个混

  • vue使用mixins优化组件

    vue 提供了 mixins 这个 API,可以让我们将组件中的可复用功能抽取出来,放入 mixin 中,然后在组件中引入 mixin,可以让组件显得不再臃肿,提高了代码的可复用性. 如何理解 mixins 呢 ?我们可以将 mixins 理解成一个数组,数组中有单或多个 mixin,mixin 的本质就是一个 JS 对象,它可以有 data.created.methods 等等 vue 实例中拥有的所有属性,甚至可以在 mixins 中再次嵌套 mixins,It's amazing ! 举个

  • vue中使用elementUI组件手动上传图片功能

    Vue框架简介 Vue是一套构建用户界面的框架, 开发只需要关注视图层, 它不仅易于上手,还便于与第三方库或既有项目的整合.是基于MVVM(Model-View-ViewModel)设计思想.提供MVVM数据双向绑定的库,专注于UI层面 使用elementUI上传图片时遇到跨域问题,所以需要自己写一个手动上传图片的方法 代码: html <el-upload class="upload-demo" ref="upload"//绑定ref 清空时会用到 :lim

  • vue 底部footer导航组件问题

    Vue底部footer导航组件 底部导航一定要用路径!!! 贼关键 举个例子: 你随便定义了一个变量, flag : 0 跳转首页, falg:1,跳转我的, 底部导航的组件不可能全项目使用, 点击我的页面  这个时候flag 已经变成了1, 从我的页面进入详情页,从详情页返回的时候,虽然路由没有变,但是flag 已经初始化成了0, 我们的判断条件没办法自定义,每次从详情页返回的时候都会被初始化, !!! 判断一定要用路径 $route.path <template> <div clas

  • Vue.js之mixins混合组件详解

    混合以一种灵活的方式为组件提供分布复用功能.混合对象可以包含任意的组件选项.当组件使用了混合对象时,混合对象的所有选项将被"混入"组件自己的选项中. 一.Mixins的基本用法 现在有个数字点击递增的程序,假设已经完成了,这时我们希望每次数据变化时都能够在控制台打印出提示:"数据发生变化". 代码实现过程: <div id="app"> <p>num:{{ num }}</p> <P><but

随机推荐