methods: { xxx(){ this.visible = !this.visible if(this.visible === true) { setTimeout(()=>{ // 主要是下面這四句實現,可是仍是有bug document.body.appendChild(this.$refs.contentWrapper) let {width, height, top, left} = this.$refs.triggerWrapper.getBoundingClientRect() this.$refs.contentWrapper.style.left = left + 'px' this.$refs.contentWrapper.style.top = top + 'px' // let eventHandler = ()=>{ this.visible = false; console.log('document 隱藏 popover') document.removeEventListener('click',eventHandler) } document.addEventListener('click', eventHandler) }) }else{ console.log('vm 隱藏 popover') } }
解決這個問題只要獲得二者之間的插值就好解決css
methods: { xxx(){ this.visible = !this.visible if(this.visible === true) { setTimeout(()=>{ document.body.appendChild(this['$refs']['contentWrapper']) let {top, left} =this['$refs']['triggerWrapper'].getBoundingClientRect() // 這兩句話解決 this['$refs']['contentWrapper'].style.left = left + window.scrollX + 'px' this['$refs']['contentWrapper'].style.top = top + window.scrollY +'px' // let eventHandler = ()=>{ this.visible = false; console.log('document 隱藏 popover') document.removeEventListener('click',eventHandler) } document.addEventListener('click', eventHandler) }) }else{ console.log('vm 隱藏 popover') } }
// 先將點按鈕和點外面的邏輯分開 onClick(event){ if(this.$refs.triggerWrapper.contains(event.target)){ console.log('按鈕') this.visible = !this.visible } else { console.log('其它') } } // 將以前的代碼移動進去 methods: { onClick(event){ if(this.$refs.triggerWrapper.contains(event.target)){ this.visible = !this.visible if(this.visible === true) { setTimeout(() => { document.body.appendChild(this['$refs']['contentWrapper']) let {top, left} = this['$refs']['triggerWrapper'].getBoundingClientRect() this['$refs']['contentWrapper'].style.left = left + window.scrollX + 'px' this['$refs']['contentWrapper'].style.top = top + window.scrollY + 'px' let eventHandler = (e) => { if(this['$refs']['contentWrapper'].contains(e.target)){ // 這句話解決了點擊內容消失的問題 } else { this.visible = false; document.removeEventListener('click', eventHandler) console.log('關閉') // document事件引發的 } } document.addEventListener('click', eventHandler) }) } } else { console.log('非按鈕') } } }
methods: { positionContent() { document.body.appendChild(this["$refs"]["contentWrapper"]) let {top, left} = this["$refs"]["triggerWrapper"].getBoundingClientRect() this["$refs"]["contentWrapper"].style.left = left + window.scrollX + "px" this["$refs"]["contentWrapper"].style.top = top + window.scrollY + "px" }, listenToDocument() { let eventHandler = (e) => { if (this["$refs"]["contentWrapper"].contains(e.target)) { // 這句話解決了點擊內容消失的問題 } else { this.visible = false console.log('關閉') document.removeEventListener("click", eventHandler) console.log("關閉") // document事件引發的 } } document.addEventListener("click", eventHandler) }, listenToDocument(){ let eventHandler = (e) => { if ( this["$refs"]["contentWrapper"] && this["$refs"]["contentWrapper"].contains(e.target)) { // 這句話解決了點擊內容消失的問題 return } else { this.visible = false document.removeEventListener("click", eventHandler) console.log("關閉") // document事件引發的 } } document.addEventListener("click", eventHandler) }, opShow(){ setTimeout(() => { this.positionContent() this.listenToDocument() }) }, onClick(event) { if (this["$refs"]["triggerWrapper"].contains(event.target)) { this.visible = !this.visible if (this.visible === true) { this.opShow() } else { console.log('關閉') } } } },
咱們須要把關閉入口收攏,這個就是代碼的緊密性,也就是高內聚低耦合的內聚。面試
methods: { onClickDocument(e){ if ( this["$refs"]["popover"] && (this["$refs"]["popover"] && this["$refs"]["popover"].contains(e.target))) {return} else { this.close() } }, positionContent() { document.body.appendChild(this["$refs"]["contentWrapper"]) let {top, left} = this["$refs"]["triggerWrapper"].getBoundingClientRect() this["$refs"]["contentWrapper"].style.left = left + window.scrollX + "px" this["$refs"]["contentWrapper"].style.top = top + window.scrollY + "px" }, open(){ // 打開的收攏 this.visible = true setTimeout(() => { this.positionContent() document.addEventListener("click", this.onClickDocument) }) }, close(){ // 關閉的收攏 this.visible = false document.removeEventListener("click", this.onClickDocument) }, onClick(event) { if (this["$refs"]["triggerWrapper"].contains(event.target)) { if (this.visible === true) { this.close() } else { this.open() } } } }, // 全部重要的操做都要進行收攏