Mixin混入原理及使用

MixinvueAPI 中的定义是混入,可以是 全局混入也可以 局部混入(注:不推荐在应用代码中使用);但是有一点要做注意,也是Mixin本身问题所在:
请谨慎使用全局混入,因为它会影响每个单独创建的 Vue 实例 (包括第三方组件)。大多数情况下,只应当应用于自定义选项,就像上面示例一样。推荐将其作为[插件](https://cn.vuejs.org/v2/guide/plugins.html)发布,以避免重复应用混入

使用方式

首先声明一个mixin对象,然后引入

//1.可以声明对象,也可以import引用对象,这里声明对象
var mixin = {
  data: function () {
    return {
      message: 'hello',
      foo: 'abc'
    }
  }
}
import store from '@/store/index'
import router from '@/router/index'
//2.可以写入,也可以import引用,这里使用引用
import mixin from '@/mixin/index'
new Vue({
    mixins: [mixin],
    store,
    router,
    render: h => h(App),
}).$mount('#app')

//src/mixin/index.js
import { parseTime } from '@/utils/index.js'
export default {
    inject: ['routerReload'],
    data() {
        return {
            mixinPageTotal: 0, // 总页码
            mixinLoading: false,
            mixinTableDatas: [], // 表格数据
            mixinPageInfo: {}, //分页数据
            mixinSubmitLoading: false, //提交按钮loading
            mixinShowLogDialog: false, // 显示弹窗组件,
            mixinRequestLogInfo: {}, //  查看日志请求数据
        }
    },
    computed: {
        /**
         * 获取明天日期
         * @date 2020.08.21
         */
        tomorrowDate() {
            return parseTime(new Date().getTime() + 24 * 60 * 60 * 1000, '{y}-{m}-{d}')
        },
        /**
         * 获取今天日期
         * @date 2020.08.21
         */
        todayDate() {

            return parseTime(new Date().getTime(), '{y}-{m}-{d}')
        },
        insetCityTwo() {
            const cityInfo = JSON.parse(localStorage.getItem('cityInfo'))
            return cityInfo.code == 999999 ? '' : cityInfo.code
        }
    },
    mounted() {

    },
    methods: {
        insetCity(formName, type = 'cityCode') {
            const cityInfo = JSON.parse(localStorage.getItem('cityInfo'))
            this[formName][type] = cityInfo.code == 999999 ? '' : cityInfo.code
        },
        /**
         * 筛选项重置
         * @param {*} key 需要重置的字段
         */
        mixinReset(key) {
            const cityInfo = JSON.parse(localStorage.getItem('cityInfo'))
            this[key] = this.$options.data()[key]
            if (cityInfo.code != 999999) { // 非超管
                const hasCityCode = 'cityCode' in this[key]
                const hasCityId = 'cityId' in this[key]
                if (hasCityCode) {
                    this[key].cityCode = cityInfo.code
                } else if (hasCityId) {
                    this[key].cityId = cityInfo.code
                }
            }
        },
        /**
         * 显示弹出层
         * @param {string,需要关闭元素的ref名称} refName
         */
        mixinShowDialog(refName) {
            this.$refs[refName].visible = true
        },
        /**
         * 关闭弹出层
         * @param {string,需要关闭元素的ref名称} refName
         */
        mixinCloseDialog(refName) {
            this.$refs[refName].visible = false
        },
        /**
         *  获取表格数据
         * @param {object, 请求参数} params
         * @param {function, 请求接口的方法} apiFn
         */
        async mixinGetTableDatas(params, apiFn) {
            this.mixinLoading = true
            const res = await apiFn(params)
            if (res) {
                this.mixinPageTotal = Number(res.total)
                this.mixinTableDatas = res.records || res
            } else {
                this.mixinPageTotal = 0
                this.mixinTableDatas = []
            }
            this.mixinLoading = false
        },
        /**
         * 分页操作
         * @param  {object, 返回的分页参数} param
         * @param  {string} formData
         * @param  {function, 回调函数} callback
         */
        mixinHandlePage(param, formData, callback) {
            this.mixinPageInfo = param
            Object.assign(this[formData], param)
            callback && callback()
        },
        /**
         * 提交表单
         * @param  {string, 返回的分页参数} formName
         * @param  {function, 请求接口的方法} apiFn
         * @param  {object, 请求接口的参数} data
         * @param  {function, 调用接口成功后的回调函数} successCallback
         * @param  {function, 调用接口失败后的回调函数} failCallback
         */
        mixinSubmit({ formName, apiFn, data = null, successCallback = null, failCallback = null }) {
            let formRef = this.$refs[formName].$refs.form
            formRef.validate(async(valid) => {
                if (valid) {
                    this.mixinSubmitLoading = true
                    if (!data) {
                        data = {}
                        formRef.$data.fields.forEach(e => {
                            data[e.labelFor] = e.fieldValue
                        })
                    }
                    const res = await apiFn(data)
                    if (res.code == 200) {
                        this.$message.success('操作成功')
                        successCallback && successCallback()
                        this.mixinSubmitLoading = false
                    } else {
                        failCallback && failCallback()
                        this.mixinSubmitLoading = false
                    }
                } else {
                    return false
                }
            })
        },
        /**
         * table行内按钮事件
         * @param {Number, 事件类型} type
         * @param {Object, 操作行数据} row
         * @param {Array, 整体数据} tableData
         * @date 2020.08.21
         */
        mixinTableOperation(type, row, tableData) {
            if (type === 1) {
                // 修改
                if (!this.copyRow) { // 之前的编辑操作未提交或保存 不允许操作新的行数据
                    this.tableOperationPublicFn(tableData, row, true)
                }
            } else if (type === 2) {
                // 提交
                this.$store.commit('addGoodsItem', this.copyRow) //问题应该出在这里
                this.tableOperationPublicFn(tableData, row, false)
            } else {
                // 取消
                const propIndex = tableData.findIndex(item => item.id == this.copyRow.id)
                tableData.splice(propIndex, 1, this.copyRow)
                this.tableOperationPublicFn(tableData, row, false)
            }
        },
        /**
         * table行操作提取公共方法,当前行深拷贝
         * @param {Array, 整体操作数据} tableData
         * @param {Object, 操作行数据} row
         * @param {Boolean, 控制当前行是否可编辑} show
         *
         */
        tableOperationPublicFn(tableData, row, show) {
            const propIndex = tableData.findIndex(item => item.id == row.id)
            this.$set(tableData[propIndex], 'show', show)
            if (show) {
                this.copyRow = JSON.parse(JSON.stringify(row))
            } else {
                this.copyRow = null
            }
        },
        /**
         * 编辑操作---适用于查询详情后弹出编辑框场景
         * @param  {object, 编辑的参数} row
         * @param  {string, 接口返回数据赋值} formData
         * @param  {function, 接口api} apiFn
         * @param  {string, 编辑框ref} dialogref
         */
        async mixinEditDetails({ row, formData, apiFn, dialogref }) {
            const res = await apiFn({ id: row.id })
            if (res.code == 200) {
                this[formData] = res.ro
                this.$refs[dialogref].visible = true
            }
        },
        /**
         * 操作日志---适用于页面出现操作日志情况
         * @param  {object, 编辑的参数} row
         * @param  {string, 日志类型} type
         */
        async mixinShowLog(row, type) {
            this.mixinShowLogDialog = true
            this.mixinRequestLogInfo = {
                id: row.id,
                systemLogEnum: type
            }
        },
        /**
         * 删除操作
         * @param  {string, 提示的错误} msg
         * @param  {function, 请求接口的方法} apiFn
         * @param  {object, 请求接口的参数} data
         * @param  {function, 调用接口成功后的回调函数} successCallback
         * @param  {function, 调用接口失败后的回调函数} failCallback
         */
        mixinDeleteElement({ msg, apiFn, data = null, successCallback = null, failCallback = null }) {
            console.log('组件', msg)
            this.$confirm(msg, '提示', {
                    confirmButtonText: '确定',
                    cancelButtonText: '取消',
                    type: 'warning'
                }).then(async() => {
                    //判断是否传入函数
                    if (apiFn) {
                        let res = await apiFn(data)
                        if (res) {
                            this.$message.success('操作成功')
                            console.log('删除')
                            successCallback && successCallback()
                        } else {
                            failCallback && failCallback()
                        }
                    } else {
                        successCallback && successCallback()
                    }

                })
                .catch(async() => {
                    console.log('取消操作')
                })
        }
        },
    }
}

本文章只做工作、知识点记录;

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,233评论 6 495
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,357评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,831评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,313评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,417评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,470评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,482评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,265评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,708评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,997评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,176评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,827评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,503评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,150评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,391评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,034评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,063评论 2 352

推荐阅读更多精彩内容