From 945d71b3bc4b42e28cdca08ce7acf59e45923308 Mon Sep 17 00:00:00 2001 From: 徐旺旺 <11530253@qq.com> Date: 星期五, 16 四月 2021 14:38:08 +0800 Subject: [PATCH] 弹框组件 --- /dev/null | 73 -------------- src/components/layer/src/layer.vue | 126 +++++++++++++++++++----- src/components/layer/src/layer.js | 58 +++-------- 3 files changed, 114 insertions(+), 143 deletions(-) diff --git a/src/components/layer/src/iframe.vue b/src/components/layer/src/iframe.vue deleted file mode 100644 index 4b9d07f..0000000 --- a/src/components/layer/src/iframe.vue +++ /dev/null @@ -1,126 +0,0 @@ -<template> - <div class="public-bounced map-background" v-drag> - <div class="public-bounced-title panel-title" ref="publicBounced"> - <span>{{options.title}}</span> - <i class="el-icon-circle-close" @click="close"></i> - </div> - <div class="public-bounced-content" :id="id"> - {{options.content}} - </div> - </div> -</template> - -<script> -import helper from './helper/helper.js' - -export default { - data () { - return { - cls: { - 'vl-notify-iframe': true - }, - id: 'vlip' + new Date().getTime() - } - }, - props: { - options: { - type: Object, - default: function () { - return {} - } - } - }, - computed: { - contentStyle () { - return { - height: 'calc(100% - 50px)', // parseInt(this.options.area[1]) - 50 + "px", - minHeight: '20px', - overflow: 'auto' - } - } - }, - async mounted () { - this.getContent() - helper.hiddenScrollBar(this.options) - }, - methods: { - close () { - - }, - async getContent () { - await helper.sleep(10) - const propsData = helper.deepClone(this.options.content.data) || {} - propsData.layerid = this.options.id - propsData.lydata = this.options.content.data - propsData.lyoption = this.options - console.log(this.options.content.content) - const instance = new this.options.content.content({ - // 鍏蜂綋鍙傛暟淇℃伅锛岃鍙傝�僾ue婧愮爜 - parent: this.options.content.parent, - propsData: propsData - }) - instance.vm = instance.$mount() - document.getElementById(this.id).appendChild(instance.vm.$el) - this.options.layer.instancesVue[this.options.id].iframe = instance.vm - }, - - btnyes (event) { - helper.btnyes(event, this.options) - }, - btncancel (event) { - helper.btncancel(event, this.options) - } - } -} -</script> - -<style lang="less" scoped> - .public-bounced { - z-index: 2000; - position: absolute; - top: 35%; - left: 20%; - - .public-bounced-title { - cursor: move; - height: 0.1rem; - padding: 10px 0; - display: flex; - align-items: center; - justify-content: space-between; - - span { - color: #f4f7ff; - margin: 0 15px; - font-size: 14px; - } - - i { - color: #C0C4CC; - margin: 0 15px; - font-size: 22px; - cursor: pointer; - } - - i:hover { - color: #00fff6; - } - } - - .public-bounced-content { - padding: 0.1rem; - display: flex; - //align-items: center; - //justify-content: space-around; - - .public-bounced-content-left { - //width: 4.8rem; - } - - .public-bounced-content-right { - //width: 3rem; - margin-left: 0.1rem; - } - } - } -</style> diff --git a/src/components/layer/src/layer.js b/src/components/layer/src/layer.js index b42ef27..2d2db28 100644 --- a/src/components/layer/src/layer.js +++ b/src/components/layer/src/layer.js @@ -1,27 +1,12 @@ import layerVue from './layer.vue' -const Notification = function (Vue, globalOption = { - msgtime: 1.5 // msg娑堝け鏃堕棿 -}) { - const NotificationConstructor = Vue.extend(layerVue) +const Layer = function (Vue) { + const LayerVueExtend = Vue.extend(layerVue) const self = {} const defOptions = { type: 0, // 0锛堜俊鎭锛岄粯璁わ級1锛堥〉闈㈠眰锛�2锛坕frame灞傦級3锛堝姞杞藉眰锛�4锛坱ips灞傦級,5msg,6prompt title: '淇℃伅', content: '', - area: 'auto', - offset: 'auto', - icon: -1, - btn: '纭畾', - time: 0, - maxmin: false, // 鏈�澶ф渶灏忓寲 - shade: true, - yes: '', - cancel: '', - tips: [0, {}], // 鏀寔涓婂彸涓嬪乏鍥涗釜鏂瑰悜锛岄�氳繃1-4杩涜鏂瑰悜璁惧畾,鍙互璁惧畾tips: [1, '#c00'] - tipsMore: false, // 鏄惁鍏佽澶氫釜tips - shadeClose: true, - scrollbar: true, // 鏄惁鍏佽娴忚鍣ㄥ嚭鐜版粴鍔ㄦ潯:榛樿鏄厑璁� - resize: false // 鏄惁鍏佽鎷変几锛岄粯璁ゆ槸涓嶅厑璁� + btn: '纭畾' } self.instances = {} self.instancesVue = [] @@ -34,17 +19,20 @@ * @param {[type]} options [description] * @return {[type]} [description] */ - self.open = function (options) { - options = mergeJson(options, defOptions) + self.open = function (opt) { + /* let option = { + type: 1, + content: opt.content, + area: opt.area + } */ + var options = mergeJson(opt, defOptions) const id = `notification_${new Date().getTime()}_${seed++}` options.id = id options.layer = self - const instance = new NotificationConstructor({ + options.content.content = Vue.extend(options.content.content) + const instance = new LayerVueExtend({ data: options }) - if (options.type === 1) { - options.content.content = Vue.extend(options.content.content) - } instance.id = id instance.vm = instance.$mount() self.instances[id] = { @@ -52,6 +40,7 @@ type: options.type } document.body.appendChild(instance.vm.$el) + instance.init() self.instancesVue[id] = { mask: '', main: instance.vm, @@ -59,28 +48,15 @@ } return id } - /** - * [description] - * @param {[type]} options [description] - * @return {[type]} [description] - */ - self.iframe = function (opt) { - let option = { - type: 1, - content: opt.content, - area: opt.area - } - option = mergeJson(option, opt) - console.log(option) - return self.open(option) - } + /** * 鍏抽棴涓�涓脊绐� * @param {[type]} id [description] * @return {[type]} [description] */ self.close = function (id) { - const oElm = document.getElementById(id) + console.log(id) + const oElm = document.getElementById(id).parentElement if (oElm) { document.body.removeChild(oElm) delete self.instances[id] @@ -192,4 +168,4 @@ } // module.exports = Notification; -export default Notification +export default Layer diff --git a/src/components/layer/src/layer.vue b/src/components/layer/src/layer.vue index 1ef2000..b29753a 100644 --- a/src/components/layer/src/layer.vue +++ b/src/components/layer/src/layer.vue @@ -1,46 +1,114 @@ -<template lang="html"> - <component :options="this.$data" :is="getActiveName"></component> +<template> + <div class="public-bounced map-background" v-drag> + <div class="public-bounced-title panel-title" ref="publicBounced"> + <span>{{title}}</span> + <i class="el-icon-circle-close" @click="close"></i> + </div> + <div class="public-bounced-content" :id="id"> + </div> + </div> </template> <script> -import pzpage from './page.vue' -import pziframe from './iframe.vue' +import helper from './helper/helper.js' export default { data () { return { - id: '', - type: 0, // 0锛坅lert榛樿锛�1锛堥〉闈㈠眰锛�2锛坕frame灞傦級3锛坙oading锛�4锛坱ips灞傦級,5(msg),6(prompt) - title: '淇℃伅', - content: '', - area: 'auto', - offset: 'auto', - icon: -1, - btn: '纭畾', - time: 0, - shade: true, - yes: '', - cancel: '' + cls: { + 'vl-notify-iframe': true + }, + id: 'vlip' + new Date().getTime() + } + }, + props: { + options: { + type: Object, + default: function () { + return {} + } } }, computed: { - getActiveName () { - const comps = [ - 'pzpage', - 'pziframe' - ] - return comps[this.$data.type] + contentStyle () { + return { + height: 'calc(100% - 50px)', // parseInt(this.options.area[1]) - 50 + "px", + minHeight: '20px', + overflow: 'auto' + } } }, - mounted () {}, - methods: {}, - watch: {}, - components: { - pzpage, - pziframe + async mounted () { + helper.hiddenScrollBar(this.options) + }, + methods: { + close () { + this.layer.close(this.id) + }, + init () { + const propsData = helper.deepClone(this.content.content.data) || {} + propsData.layerid = this.id + propsData.lydata = this.content.data + propsData.lyoption = this.options + const instance = new this.content.content({ + // 鍏蜂綋鍙傛暟淇℃伅锛岃鍙傝�僾ue婧愮爜 + parent: this.content.parent, + propsData: propsData + }) + instance.vm = instance.$mount() + document.getElementById(this.id).appendChild(instance.vm.$el) + } } } </script> -<style lang="less"> +<style lang="less" scoped> + .public-bounced { + z-index: 2000; + position: absolute; + top: 35%; + left: 20%; + + .public-bounced-title { + cursor: move; + height: 0.1rem; + padding: 10px 0; + display: flex; + align-items: center; + justify-content: space-between; + + span { + color: #f4f7ff; + margin: 0 15px; + font-size: 14px; + } + + i { + color: #C0C4CC; + margin: 0 15px; + font-size: 22px; + cursor: pointer; + } + + i:hover { + color: #00fff6; + } + } + + .public-bounced-content { + padding: 0.1rem; + display: flex; + //align-items: center; + //justify-content: space-around; + + .public-bounced-content-left { + //width: 4.8rem; + } + + .public-bounced-content-right { + //width: 3rem; + margin-left: 0.1rem; + } + } + } </style> diff --git a/src/components/layer/src/page.vue b/src/components/layer/src/page.vue deleted file mode 100644 index 153f993..0000000 --- a/src/components/layer/src/page.vue +++ /dev/null @@ -1,73 +0,0 @@ -<template lang="html"> - <div class="public-bounced map-background" v-drag v-show="flag"> - <div class="public-bounced-title panel-title" ref="publicBounced"> - <span>{{options.title}}</span> - <i class="el-icon-circle-close" @click="closePopup"></i> - </div> - <div class="public-bounced-content"> - {{options.content}} - </div> - </div> -</template> - -<script> -export default { - data () { - return { - moveLeft: 0, // 宸︾Щ鐨勮窛绂� - moveTop: 0, // 涓婄Щ鐨勮窛绂� - ismove: false - } - }, - props: { - options: { - type: Object, - default: function () { - return {} - } - } - }, - computed: {}, - mounted () { }, - methods: { - close: function (event) { - const mask = event.target.getAttribute('class') - if (mask && mask.indexOf('notify-mask') > -1) { - this.options.layer.close(this.options.id) - } - }, - moveStart: function (event) { - this.options.offset = this.options.offset === 'auto' ? [] : this.options.offset - if (this.options.offset.length === 0) { - this.options.offset.push(document.getElementById(this.options.id + '_alert').offsetLeft) - this.options.offset.push(document.getElementById(this.options.id + '_alert').offsetTop) - this.options.offset.push(0) - } - if (this.options.offset.length === 2) { - this.options.offset.push(0) - } - this.options.offset[0] = (document.getElementById(this.options.id + '_alert').offsetLeft) - this.options.offset[1] = (document.getElementById(this.options.id + '_alert').offsetTop) - this.moveLeft = event.clientX - this.moveTop = event.clientY - this.ismove = true - }, - move: function (event) { - if (this.ismove) { - const o = document.getElementById(this.options.id + '_alert') - o.style.left = this.options.offset[0] + (event.clientX - this.moveLeft) + 'px' - o.style.top = this.options.offset[1] + (event.clientY - this.moveTop) + 'px' - } - }, - moveEnd: function () { - this.ismove = false - } - }, - watch: { - - }, - components: { - - } -} -</script> -- Gitblit v1.8.0