@jslq/vue-iframe-messager

1.0.4 • Public • Published

Vue-iframe-messager

基于vue(vuex)实现的可跨域iframe通信的插件,有问题联系QQ: 917498254,或者提issue

🚀 下载

npm install @jslq/vue-iframe-messager --save

在iframe中使用

import Vue from 'vue'
import store from './store'
import VueIframeMessager from '@jslq/vue-iframe-messager'

Vue.use(new VueIframeMessager({
    role: 'iframe',
    vuex: {
        store,
        actionPrefix: "MESSAGER_",  //默认值就是这个
        mutationPrefix: "MESSAGER_" //没有默认值,需手动传入
    },
    options: {
        window: window,
        origin: process.env.VUE_APP_PARENT_ORIGIN  //在vue-cli3中可以存父窗口的origin,同域可以不传
    }
}))

在父窗口中使用

import Vue from 'vue'
import store from './store'
import VueIframeMessager from '@jslq/vue-iframe-messager'

Vue.use(new VueIframeMessager({
    role: 'parent',
    vuex: {
        store,
        actionPrefix: "MESSAGER_",  //默认值就是这个
        mutationPrefix: "MESSAGER_" //没有默认值,需手动传入
    },
    options: {
        iframeId: 'my-iframe'
        window: window,
        origin: process.env.VUE_APP_IFRAME_ORIGIN  //在vue-cli3中可以存父窗口的origin,同域可以不传
    }
}))

如何在组件中注册事件

//a.vue in parent
export default {
    ...
    data() {
        return {
            got
        }
    },
    messager: { //如果alias 赋值则使用那个值,parent和iframe的alias保持一直
        //会自动注册type===selected的事件
        selected(data) {
            this.got = data //'haha'
        }
    }
    ...
}

//b.vue in iframe
export default {
    ...
    method: {
        handlerClick() {
            this.$messager.send('selected', 'haha')
        }
    }
    ...
}
参数 类型 默认值 是否必传 描述
role string null 看上面
alias string messager 不是 如果用到vue插件也是以messager作为名字,为了防止冲突,可以起别名,不过一般不会有人用这个名字
vuex.store Vuex null 不是 Vuex store 实例
vuex.actionPrefix String null 不是 前缀
vuex.mutationPrefix String null 不是 前缀
options.iframeId string null role是'parent'时必传
options.origin string null role是'iframe'并且和父窗口跨域时必传
options.window DOMElement null window对象

在vuex中使用

import Vue from 'vue'
import Vuex from 'vuex'
const prefix = 'MESSAGER_'

Vue.use(Vuex)

export default new Vuex.Store({
    state: {},
    mutations: {
        `MESSAGER_${EVENT_NAME}`() {
            // do something
        }
    },
    actions: {
        `MESSAGER_${EVENT_NAME}`() {
            // do something
        }
    }
})

常见问题

父窗口mounted中调用this.$messager.send没有生效

虽然设置了origin,但是还是会有跨域问题,原因未知,不过可以用setTimeout延迟执行

提示跨域

报错信息 Failed to execute 'postMessage' on 'DOMWindow',设置下options.origin 即可

Package Sidebar

Install

npm i @jslq/vue-iframe-messager

Weekly Downloads

8

Version

1.0.4

License

ISC

Unpacked Size

17.6 kB

Total Files

12

Last publish

Collaborators

  • jslq