添加自定义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 答案正确········



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




相关文章
|
4天前
|
缓存 JavaScript 前端开发
vue学习第四章
欢迎来到我的博客!我是瑞雨溪,一名热爱JavaScript与Vue的大一学生。本文介绍了Vue中计算属性的基本与复杂使用、setter/getter、与methods的对比及与侦听器的总结。如果你觉得有用,请关注我,将持续更新更多优质内容!🎉🎉🎉
vue学习第四章
|
4天前
|
JavaScript 前端开发
vue学习第九章(v-model)
欢迎来到我的博客,我是瑞雨溪,一名热爱JavaScript与Vue的大一学生,自学前端2年半,正向全栈进发。此篇介绍v-model在不同表单元素中的应用及修饰符的使用,希望能对你有所帮助。关注我,持续更新中!🎉🎉🎉
vue学习第九章(v-model)
|
4天前
|
JavaScript 前端开发 开发者
vue学习第十章(组件开发)
欢迎来到瑞雨溪的博客,一名热爱JavaScript与Vue的大一学生。本文深入讲解Vue组件的基本使用、全局与局部组件、父子组件通信及数据传递等内容,适合前端开发者学习参考。持续更新中,期待您的关注!🎉🎉🎉
vue学习第十章(组件开发)
|
10天前
|
JavaScript 前端开发 UED
vue学习第二章
欢迎来到我的博客!我是一名自学了2年半前端的大一学生,熟悉JavaScript与Vue,目前正在向全栈方向发展。如果你从我的博客中有所收获,欢迎关注我,我将持续更新更多优质文章。你的支持是我最大的动力!🎉🎉🎉
|
10天前
|
JavaScript 前端开发 开发者
vue学习第一章
欢迎来到我的博客!我是瑞雨溪,一名热爱JavaScript和Vue的大一学生。自学前端2年半,熟悉JavaScript与Vue,正向全栈方向发展。博客内容涵盖Vue基础、列表展示及计数器案例等,希望能对你有所帮助。关注我,持续更新中!🎉🎉🎉
|
10天前
|
JavaScript 前端开发
如何在 Vue 项目中配置 Tree Shaking?
通过以上针对 Webpack 或 Rollup 的配置方法,就可以在 Vue 项目中有效地启用 Tree Shaking,从而优化项目的打包体积,提高项目的性能和加载速度。在实际配置过程中,需要根据项目的具体情况和需求,对配置进行适当的调整和优化。
|
10天前
|
存储 缓存 JavaScript
在 Vue 中使用 computed 和 watch 时,性能问题探讨
本文探讨了在 Vue.js 中使用 computed 计算属性和 watch 监听器时可能遇到的性能问题,并提供了优化建议,帮助开发者提高应用性能。
|
10天前
|
存储 缓存 JavaScript
如何在大型 Vue 应用中有效地管理计算属性和侦听器
在大型 Vue 应用中,合理管理计算属性和侦听器是优化性能和维护性的关键。本文介绍了如何通过模块化、状态管理和避免冗余计算等方法,有效提升应用的响应性和可维护性。
|
10天前
|
存储 缓存 JavaScript
Vue 中 computed 和 watch 的差异
Vue 中的 `computed` 和 `watch` 都用于处理数据变化,但使用场景不同。`computed` 用于计算属性,依赖于其他数据自动更新;`watch` 用于监听数据变化,执行异步或复杂操作。
|
11天前
|
存储 JavaScript 开发者
Vue 组件间通信的最佳实践
本文总结了 Vue.js 中组件间通信的多种方法,包括 props、事件、Vuex 状态管理等,帮助开发者选择最适合项目需求的通信方式,提高开发效率和代码可维护性。