问题|iframe监听时,菜单栏初始状态为放开时,点击按钮菜单栏可收缩;而菜单栏初始状态为防收缩时,点击按钮菜单栏呈放开状态。

解决思路:在菜单栏缩放按钮上绑定两个事件,作为区分是手动改变状态还是自动改变状态。
并使用存储作为判断条件进行判断。最后再刷新时,菜单栏回到放开状态。
⚠️:由于iframe监听传值时会多次触发,iframe有一个销毁事件,但一般可不用,如需避免多次触发,使用命名函数即可。
 
一个按钮绑定多个点击事件
Vue 中同一个元素可以绑定多个点击事件,且绑定的事件同时触发。
语法如下: 不同方法之间用;隔开。
应用场景:当需要判断一个元素是自动触发还是被动触发时。
<div @click="handleChange(); setSatus()" ></div>
 
-------------------------------------------------------------------------------------------------------------------------------------------
把一个项目的页面引入到另一个项目中,需要用到iframe。当点击子项目中的按钮触发父级项目的事件需要用iframe监听。
(具体描述,当模版点击新建或修改时且左侧菜单栏处于放开状态,进入下一页面时左侧菜单栏收起,返回时恢复放开状态;若菜单栏初始状态为收缩状态,则进入下一页面时不发生改变。)
示例如下:
  • 子项目的按钮的页面
methods: {
    // iframe 回传数据
    iframeMessageSendleft () {
        window.parent.postMessage({ leftMenu: 'no' }, '*')
        localStorage.setItem('leftMenu', 'no')
    },
    //触发按钮时调用方法
    addContentClick () {
        this.iframeMessageSendleft()
    }
}
  • 父项目要触发改变的页面
mounted () {
    // 刷新后菜单栏是放开状态
    window.localStorage.setItem('collapsed', 1)
    this.initCollapsed()
},
methods: {
    initCollapsed () {
        const _this = this
        // (父)接收监听window.addEventListener 命名函数————解决iframe.postMessage()多次触发请求问题
        window.onmessage = function (e) {
            if (e.data && e.data.leftMenu === 'no') {
                if (window.localStorage.getItem('collapsed') === '1') {
                    _this.handleChange()
                }
            }
        }
    },
    handleChange () {
        this.$emit('on-change', !this.collapsed)
    },
    // 手动改变菜单栏
    setSatus () {
        if (!this.collapsed) {
            // 菜单栏缩起
            window.localStorage.setItem('collapsed', 0)
        } else {
            // 菜单栏放开
            window.localStorage.setItem('collapsed', 1)
        }
    }
}
</script>

 

posted @ 2022-07-28 09:57  三水儿  阅读(150)  评论(0编辑  收藏  举报