添加自定义vue全局方法,同时给自定义的方法 传递component调用其方法

简介: 项目中会遇到一个组件/方法, 在多个地方被调用,比较方便的的方式之一,this.$custom(agruments) 这样就比较方便,不然用组件引入的办法调用就就比较麻烦,每可能都需要这样调用import coustom from '.

项目中会遇到一个组件/方法, 在多个地方被调用,比较方便的的方式之一,this.$custom(agruments) 这样就比较方便

,不然用组件引入的办法调用就就比较麻烦,每可能都需要这样调用

import coustom from './coustom'
export default {
	components: {
		coustom
	}
}
<coustom :data="data" v-if="show"></coustom>

换个办法以自定义alert 为例


就这么一句就调用出来
this.$alert('哈哈哈');

alert.vue 如下

<template>
    <transition name="dialog-fade">
        <div v-if="show" class="modal fade dialog-modal" id="alert"  role="dialog" data-backdrop="false" aria-hidden="true">
            <div class="modal-dialog" role="document">
                <div class="modal-content">
                    <div class="modal-header row">
                        <h5 class="modal-title col-md-4">提示</h5>
                        <button type="button" class="close" aria-label="Close" @click="close">
                            <span aria-hidden="true">×</span>
                        </button>
                    </div>
                    <div class="modal-body">
                        <div class="col-xs-offset-1">{{message}}</div>
                    </div>
                    <div class="modal-footer">
                        <button type="button" class="btn btn-primary" @click="close">确定</button>
                    </div>
                </div>
            </div>
        </div>
    </transition>
</template>
<script>
export default {
    name: 'Alert',
    methods: {
        close: function() {
            this.show = false
        }
    }
}
</script>
对然后将Alert 挂载到vue全局  index.js

function install(Vue) {
    
    Object.defineProperty(Vue.prototype, '$alert', {
        get() {
            let div = document.createElement('div')
            document.body.appendChild(div);
            return (message) => {
                const Constructor = Vue.extend(Alert)
                let Instance = new Constructor({
                    data() {
                        return {
                            message: message,
                            show: true
                        }
                    }
                }).$mount(div);
            };
        }
    });
}

export default install


最后vue.use 一下

import alert from 'index'

Vue.use(alert)

就能直接调用了

当然前面有个坑 transition 的 vue 的过渡 alert的div不是一开始就加载到文档上的,通过后面的 

 document.body.appendChild(div);

动态写入,就造成 alert 显示时看不到transition效果,抛开vue来说也会遇到这样的情况 可以settimeout 下 给append的元素 addClass

同理在vue 中也可以,当然还有更好的办法暂时没想到。。。。


alert 只是纯的 传递一个param 但是需要 传递一个function 时,比如confirem


this.$confirm('请确定你是傻逼', () => console.log('yes')})

还是相同的味道,相同的道理

Confirm.vue

<template>
    <transition name="dialog-fade">
        <div v-if="show" class="modal fade" id="confirm" tabindex="-1" role="dialog" 
            data-backdrop="false"  aria-hidden="true">
            <div class="modal-dialog" role="document">
                <div class="modal-content">
                    <div class="modal-header row">
                        <h5 class="modal-title col-md-4">提示</h5>
                        <button type="button" class="close" @click="close">
                            <span aria-hidden="true">×</span>
                        </button>
                    </div>
                    <div class="modal-body">
                        <div class="col-xs-offset-1">{{message}}</div>
                    </div>
                    <div class="modal-footer">
                        <button type="button" class="btn btn-info" @click="close">取消</button>
                        <button type="button" class="btn btn-primary" @click="ConfirmSure">确定</button>
                    </div>
                </div>
            </div>
        </div>
    </transition>
</template>
<script>
export default {
    name: 'Confirm',
    methods: {
        close: function() {
            this.show = false
        },
        ConfirmSure() {
            this.confirmSure()//确定关闭 由install 传入
            this.close()
        }
    }
}
</script>

import Confirm from './Confirm.vue'

function install(Vue) {

    Object.defineProperty(Vue.prototype, '$confirm', {
        get() {
            let div = document.createElement('div')
            document.body.appendChild(div);
            return (message, confirmSure) => {
                const Constructor = Vue.extend(Confirm)
                const Instance = new Constructor({
                    data() {
                        return {
                            message: message,
                            show: true
                        }
                    },
                    methods: {
                        confirmSure: confirmSure    //确定方法
                    }
                }).$mount(div);
            };
        }
    });
}

export default install


同样use 一下

import alert from 'index' Vue.use(alert)




 this.$confirm('你是猴子请来的唐僧么', () => console.log('yes,哈哈哈哈哈'))


传了两个arguments,累了吧,轻松点,

片分三级,嗯········参数也得 至少能传 三个。。。。


嗯,往哪里看呐···!

这里传递的params 才传递到第二个,才实现第二个功能,要么要实现第三个功能呢,dialog对话框内容,根据环境应用环境传递进去显示 


如此中间的form 表单是动态传递进入的

 <div class="midpass">
        <div class="form-group form-group-inline flex" :class="errors.has('ans') ? 'has-error has-danger' : '' ">
            <label class="form-control-label">1+1=?</label>
            <div class="form-input-longer">
                <input type="password" class="form-control form-control-title" name="ans" v-model="input.value"
                    v-validate="'required|min:1'"  placeholder="请输入答案">
                <div class="help-block">请输入答案</div>
            </div>
        </div>
    </div>
export default {
    name: 'oneaddone',
    data() {
        return {
            input: {
               
                value: null
            }
        }
    }
}



用到了前端验证 vue veevalidate 这样传递进去 要调教数据时,触发验证,就是父组件调用子组件的方法
this.$children 即可

dialog.vue

<template>
    <transition name="dialog-fade">
        <div v-if="show" class="modal fade" id="popform" tabindex="-1" 
            role="dialog" data-backdrop="false" aria-hidden="true">
            <div class="hide" id="formpop-btn" data-toggle="modal" data-target="#popform"></div>
            <div class="modal-dialog" role="document">
                <div class="modal-content">
                    <div class="modal-header row">
                        <h4 class="modal-title col-md-6 col-xs-4">{{message}}</h4>
                        <button type="button" class="close col-md-1" aria-label="Close"  @click="close">
                            <span aria-hidden="true">×</span>
                        </button>
                    </div>
                    <form @submit.prevent="submit">
                        <div class="modal-body">
                            <keep-alive>
                                <component :is="modalBody" ref="forms"></component>
                            </keep-alive>
                        </div>
                        <div class="modal-footer">
                            <div class="center-block" style="width: 230px;">
                                <button type="button" class="btn btn-secondary" @click="close">取消</button>
                                <button type="submit" class="btn btn-primary">保存</button>
                            </div>
                        </div>
                    </form>
                </div>
            </div>
        </div>
    </transition>
</template>

<script>
export default {
    name: 'dialog',
    data() {
        return {
            Submit: () => {}
        }
    },
    methods: {
        close() {
            this.show = false
        },
        setSubmit(dataKey, Submit) {
            this.submit = () => {   //给submit btn 设置提交方法
                this.$children.map(function (child) {
                    let data = child.$data[dataKey] //data 的key 调用时传递的 data key 可以根据情景定义
                    child.$validator.validateAll().then((result) => {
                        if (result) {
                            Submit(data).then(res => {
                                if (res) this.close()
                            })
                        }
                    });
                })
            }
        },
    }
}
</script>

再来一遍



import dialog from './dialog.vue'

function install(Vue) {
    Object.defineProperty(Vue.prototype, '$dialog', {
        get() {
            let div = document.createElement('div');
            document.body.appendChild(div);
            return (message, modalBody) => {
                const Constructor = Vue.extend(dialog)
                const Instance = new Constructor({
                    data() {
                        return {
                            message: message,
                            show: true,
                            modalBody: modalBody
                        }
                    }
                }).$mount(div)
                return Instance.setSubmit  //放回 一个方法用于 传递 自定义的数据和 submit 时方法
            };
            
        }
    });
}

export default install
Vue.use 同上
this.$dialog('请计算下面的数学题', resolve => 
                require(['./oneaddone.vue'], resolve))('input', (data) => {
		this.$alert('哈哈哈,正确')
                    console.log(data)
                    return data
                }
            )

PS:这里需要注意的是 this.$dialog()(); 是这样的 因为里面返回的是一个方法,同时$mount 不能直接挂载在body 或者html下 必须在body的 子元素中  所以,createElement('div')

1+1 = 2 答案正确········



有需要的交流的可以加个好友




相关文章
|
3月前
|
人工智能 JavaScript 算法
Vue 中 key 属性的深入解析:改变 key 导致组件销毁与重建
Vue 中 key 属性的深入解析:改变 key 导致组件销毁与重建
491 0
|
3月前
|
JavaScript UED
用组件懒加载优化Vue应用性能
用组件懒加载优化Vue应用性能
|
3月前
|
JavaScript 前端开发 开发者
Vue 自定义进度条组件封装及使用方法详解
这是一篇关于自定义进度条组件的使用指南和开发文档。文章详细介绍了如何在Vue项目中引入、注册并使用该组件,包括基础与高级示例。组件支持分段配置(如颜色、文本)、动画效果及超出进度提示等功能。同时提供了完整的代码实现,支持全局注册,并提出了优化建议,如主题支持、响应式设计等,帮助开发者更灵活地集成和定制进度条组件。资源链接已提供,适合前端开发者参考学习。
339 17
|
3月前
|
JavaScript 前端开发 UED
Vue 表情包输入组件实现代码及详细开发流程解析
这是一篇关于 Vue 表情包输入组件的使用方法与封装指南的文章。通过安装依赖、全局注册和局部使用,可以快速集成表情包功能到 Vue 项目中。文章还详细介绍了组件的封装实现、高级配置(如自定义表情列表、主题定制、动画效果和懒加载)以及完整集成示例。开发者可根据需求扩展功能,例如 GIF 搜索或自定义表情上传,提升用户体验。资源链接提供进一步学习材料。
182 1
|
3月前
|
存储 JavaScript 前端开发
如何高效实现 vue 文件批量下载及相关操作技巧
在Vue项目中,实现文件批量下载是常见需求。例如文档管理系统或图片库应用中,用户可能需要一次性下载多个文件。本文介绍了三种技术方案:1) 使用`file-saver`和`jszip`插件在前端打包文件为ZIP并下载;2) 借助后端接口完成文件压缩与传输;3) 使用`StreamSaver`解决大文件下载问题。同时,通过在线教育平台的实例详细说明了前后端的具体实现步骤,帮助开发者根据项目需求选择合适方案。
235 0
|
存储 前端开发 JavaScript
为什么我不再用Vue,改用React?
当我走进现代前端开发行业的时候,我做了一个每位开发人员都要做的决策:选择一个合适的框架。当时正逢 jQuery 被淘汰,前端开发者们不再用它编写难看的、非结构化的老式 JavaScript 程序了。
|
5月前
|
JavaScript
vue实现任务周期cron表达式选择组件
vue实现任务周期cron表达式选择组件
666 4
|
4月前
|
JavaScript 数据可视化 前端开发
基于 Vue 与 D3 的可拖拽拓扑图技术方案及应用案例解析
本文介绍了基于Vue和D3实现可拖拽拓扑图的技术方案与应用实例。通过Vue构建用户界面和交互逻辑,结合D3强大的数据可视化能力,实现了力导向布局、节点拖拽、交互事件等功能。文章详细讲解了数据模型设计、拖拽功能实现、组件封装及高级扩展(如节点类型定制、连接样式优化等),并提供了性能优化方案以应对大数据量场景。最终,展示了基础网络拓扑、实时更新拓扑等应用实例,为开发者提供了一套完整的实现思路和实践经验。
500 77
|
5月前
|
缓存 JavaScript 前端开发
Vue 基础语法介绍
Vue 基础语法介绍
|
3月前
|
监控 JavaScript 前端开发
Vue 文件批量下载组件封装完整使用方法及优化方案解析
本文详细介绍了批量下载功能的技术实现与组件封装方案。主要包括两种实现方式:**前端打包方案(基于file-saver和jszip)** 和 **后端打包方案**。前者通过前端直接将文件打包为ZIP下载,适合小文件场景;后者由后端生成ZIP文件流返回,适用于大文件或大量文件下载。同时,提供了可复用的Vue组件`BatchDownload`,支持进度条、失败提示等功能。此外,还扩展了下载进度监控和断点续传等高级功能,并针对跨域、性能优化及用户体验改进提出了建议。可根据实际需求选择合适方案并快速集成到项目中。
329 17