mirror of
				https://github.com/vform666/variant-form3-vite.git
				synced 2025-10-31 16:51:49 +08:00 
			
		
		
		
	3.0.3(2022.03.02)更新:
1. 修复Pad/H5布局预览的样式显示问题; 2. 修复升级新版element-plus后事件代码编辑弹窗无法显示的问题; 3. 修复provide传递的formConfig属性不能获取最新值的问题,改用provide函数实现; 4. element-plus版本升级到2.0.4。
This commit is contained in:
		| @@ -14,7 +14,7 @@ | |||||||
|     "axios": "^0.24.0", |     "axios": "^0.24.0", | ||||||
|     "clipboard": "^2.0.8", |     "clipboard": "^2.0.8", | ||||||
|     "core-js": "^3.6.5", |     "core-js": "^3.6.5", | ||||||
|     "element-plus": "^1.3.0-beta.9", |     "element-plus": "^2.0.4", | ||||||
|     "file-saver": "^2.0.5", |     "file-saver": "^2.0.5", | ||||||
|     "mitt": "^3.0.0", |     "mitt": "^3.0.0", | ||||||
|     "sortablejs": "1.14.0", |     "sortablejs": "1.14.0", | ||||||
|   | |||||||
| @@ -1,4 +1,13 @@ | |||||||
| export default { | export default { | ||||||
|  |   inject: ['getFormConfig'], | ||||||
|  |  | ||||||
|  |   computed: { | ||||||
|  |     formConfig() { | ||||||
|  |       return this.getFormConfig() | ||||||
|  |     }, | ||||||
|  |  | ||||||
|  |   }, | ||||||
|  |  | ||||||
|   methods: { |   methods: { | ||||||
|     appendTableRow(widget) { |     appendTableRow(widget) { | ||||||
|       this.designer.appendTableRow(widget) |       this.designer.appendTableRow(widget) | ||||||
|   | |||||||
| @@ -55,7 +55,6 @@ | |||||||
|     components: { |     components: { | ||||||
|       FormItemWrapper, |       FormItemWrapper, | ||||||
|     }, |     }, | ||||||
|     inject: ['refList', 'formConfig', 'globalOptionData', 'globalModel'], |  | ||||||
|     data() { |     data() { | ||||||
|       return { |       return { | ||||||
|         oldFieldValue: null, //field组件change之前的值 |         oldFieldValue: null, //field组件change之前的值 | ||||||
|   | |||||||
| @@ -58,7 +58,6 @@ | |||||||
|     components: { |     components: { | ||||||
|       FormItemWrapper, |       FormItemWrapper, | ||||||
|     }, |     }, | ||||||
|     inject: ['refList', 'formConfig', 'globalOptionData', 'globalModel'], |  | ||||||
|     data() { |     data() { | ||||||
|       return { |       return { | ||||||
|         oldFieldValue: null, //field组件change之前的值 |         oldFieldValue: null, //field组件change之前的值 | ||||||
|   | |||||||
| @@ -49,7 +49,6 @@ | |||||||
|     components: { |     components: { | ||||||
|       FormItemWrapper, |       FormItemWrapper, | ||||||
|     }, |     }, | ||||||
|     inject: ['refList', 'formConfig', 'globalOptionData', 'globalModel'], |  | ||||||
|     data() { |     data() { | ||||||
|       return { |       return { | ||||||
|         oldFieldValue: null, //field组件change之前的值 |         oldFieldValue: null, //field组件change之前的值 | ||||||
|   | |||||||
| @@ -56,7 +56,6 @@ | |||||||
|     components: { |     components: { | ||||||
|       FormItemWrapper, |       FormItemWrapper, | ||||||
|     }, |     }, | ||||||
|     inject: ['refList', 'formConfig', 'globalOptionData', 'globalModel'], |  | ||||||
|     data() { |     data() { | ||||||
|       return { |       return { | ||||||
|         oldFieldValue: null, //field组件change之前的值 |         oldFieldValue: null, //field组件change之前的值 | ||||||
|   | |||||||
| @@ -54,7 +54,6 @@ | |||||||
|     components: { |     components: { | ||||||
|       FormItemWrapper, |       FormItemWrapper, | ||||||
|     }, |     }, | ||||||
|     inject: ['refList', 'formConfig', 'globalOptionData', 'globalModel'], |  | ||||||
|     data() { |     data() { | ||||||
|       return { |       return { | ||||||
|         oldFieldValue: null, //field组件change之前的值 |         oldFieldValue: null, //field组件change之前的值 | ||||||
|   | |||||||
| @@ -3,9 +3,13 @@ import FormValidators from '@/utils/validators' | |||||||
| import eventBus from "@/utils/event-bus" | import eventBus from "@/utils/event-bus" | ||||||
|  |  | ||||||
| export default { | export default { | ||||||
|   inject: ['refList', 'formConfig', 'globalOptionData', 'globalModel', 'getOptionData'], |   inject: ['refList', 'getFormConfig', 'globalOptionData', 'globalModel', 'getOptionData'], | ||||||
|  |  | ||||||
|   computed: { |   computed: { | ||||||
|  |     formConfig() { | ||||||
|  |       return this.getFormConfig() | ||||||
|  |     }, | ||||||
|  |  | ||||||
|     widgetSize() { |     widgetSize() { | ||||||
|       return this.field.options.size || 'default' |       return this.field.options.size || 'default' | ||||||
|     }, |     }, | ||||||
|   | |||||||
| @@ -77,7 +77,6 @@ | |||||||
|       SvgIcon, |       SvgIcon, | ||||||
|       FormItemWrapper, |       FormItemWrapper, | ||||||
|     }, |     }, | ||||||
|     inject: ['refList', 'formConfig', 'globalOptionData', 'globalModel'], |  | ||||||
|     data() { |     data() { | ||||||
|       return { |       return { | ||||||
|         oldFieldValue: null, //field组件change之前的值 |         oldFieldValue: null, //field组件change之前的值 | ||||||
|   | |||||||
| @@ -93,8 +93,12 @@ | |||||||
|  |  | ||||||
|       rules: Array, |       rules: Array, | ||||||
|     }, |     }, | ||||||
|     inject: ['formConfig'], |     inject: ['getFormConfig'], | ||||||
|     computed: { |     computed: { | ||||||
|  |       formConfig() { | ||||||
|  |         return this.getFormConfig() | ||||||
|  |       }, | ||||||
|  |  | ||||||
|       selected() { |       selected() { | ||||||
|         return !!this.designer && this.field.id === this.designer.selectedId |         return !!this.designer && this.field.id === this.designer.selectedId | ||||||
|       }, |       }, | ||||||
|   | |||||||
| @@ -61,7 +61,6 @@ | |||||||
|     components: { |     components: { | ||||||
|       FormItemWrapper, |       FormItemWrapper, | ||||||
|     }, |     }, | ||||||
|     inject: ['refList', 'formConfig', 'globalOptionData', 'globalModel'], |  | ||||||
|     data() { |     data() { | ||||||
|       return { |       return { | ||||||
|         oldFieldValue: null, //field组件change之前的值 |         oldFieldValue: null, //field组件change之前的值 | ||||||
|   | |||||||
| @@ -53,7 +53,6 @@ | |||||||
|     components: { |     components: { | ||||||
|       FormItemWrapper, |       FormItemWrapper, | ||||||
|     }, |     }, | ||||||
|     inject: ['refList', 'formConfig', 'globalOptionData', 'globalModel'], |  | ||||||
|     data() { |     data() { | ||||||
|       return { |       return { | ||||||
|         oldFieldValue: null, //field组件change之前的值 |         oldFieldValue: null, //field组件change之前的值 | ||||||
|   | |||||||
| @@ -60,7 +60,6 @@ | |||||||
|     components: { |     components: { | ||||||
|       FormItemWrapper, |       FormItemWrapper, | ||||||
|     }, |     }, | ||||||
|     inject: ['refList', 'formConfig', 'globalOptionData', 'globalModel'], |  | ||||||
|     data() { |     data() { | ||||||
|       return { |       return { | ||||||
|         oldFieldValue: null, //field组件change之前的值 |         oldFieldValue: null, //field组件change之前的值 | ||||||
| @@ -180,8 +179,12 @@ | |||||||
|       handlePictureRemove(file, fileList) { |       handlePictureRemove(file, fileList) { | ||||||
|         this.fileList = deepClone(fileList)  //this.fileList = fileList |         this.fileList = deepClone(fileList)  //this.fileList = fileList | ||||||
|         this.updateUploadFieldModelAndEmitDataChange(fileList) |         this.updateUploadFieldModelAndEmitDataChange(fileList) | ||||||
|  |  | ||||||
|         this.uploadBtnHidden = fileList.length >= this.field.options.limit |         this.uploadBtnHidden = fileList.length >= this.field.options.limit | ||||||
|  |  | ||||||
|  |         if (!!this.field.options.onFileRemove) { | ||||||
|  |           let customFn = new Function('file', 'fileList', this.field.options.onFileRemove) | ||||||
|  |           customFn.call(this, file, fileList) | ||||||
|  |         } | ||||||
|       }, |       }, | ||||||
|  |  | ||||||
|       handelUploadError(err, file, fileList) { |       handelUploadError(err, file, fileList) { | ||||||
|   | |||||||
| @@ -58,7 +58,6 @@ | |||||||
|     components: { |     components: { | ||||||
|       FormItemWrapper, |       FormItemWrapper, | ||||||
|     }, |     }, | ||||||
|     inject: ['refList', 'formConfig', 'globalOptionData', 'globalModel'], |  | ||||||
|     data() { |     data() { | ||||||
|       return { |       return { | ||||||
|         oldFieldValue: null, //field组件change之前的值 |         oldFieldValue: null, //field组件change之前的值 | ||||||
|   | |||||||
| @@ -52,7 +52,6 @@ | |||||||
|     components: { |     components: { | ||||||
|       FormItemWrapper, |       FormItemWrapper, | ||||||
|     }, |     }, | ||||||
|     inject: ['refList', 'formConfig', 'globalOptionData', 'globalModel'], |  | ||||||
|     data() { |     data() { | ||||||
|       return { |       return { | ||||||
|         oldFieldValue: null, //field组件change之前的值 |         oldFieldValue: null, //field组件change之前的值 | ||||||
|   | |||||||
| @@ -71,7 +71,6 @@ | |||||||
|       // } |       // } | ||||||
|       quillEditor, |       quillEditor, | ||||||
|     }, |     }, | ||||||
|     inject: ['refList', 'formConfig', 'globalOptionData', 'globalModel'], |  | ||||||
|     data() { |     data() { | ||||||
|       return { |       return { | ||||||
|         oldFieldValue: null, //field组件change之前的值 |         oldFieldValue: null, //field组件change之前的值 | ||||||
|   | |||||||
| @@ -61,7 +61,6 @@ | |||||||
|     components: { |     components: { | ||||||
|       FormItemWrapper, |       FormItemWrapper, | ||||||
|     }, |     }, | ||||||
|     inject: ['refList', 'formConfig', 'globalOptionData', 'globalModel'], |  | ||||||
|     data() { |     data() { | ||||||
|       return { |       return { | ||||||
|         oldFieldValue: null, //field组件change之前的值 |         oldFieldValue: null, //field组件change之前的值 | ||||||
|   | |||||||
| @@ -50,7 +50,6 @@ | |||||||
|     components: { |     components: { | ||||||
|       FormItemWrapper, |       FormItemWrapper, | ||||||
|     }, |     }, | ||||||
|     inject: ['refList', 'formConfig', 'globalOptionData', 'globalModel'], |  | ||||||
|     data() { |     data() { | ||||||
|       return { |       return { | ||||||
|         oldFieldValue: null, //field组件change之前的值 |         oldFieldValue: null, //field组件change之前的值 | ||||||
|   | |||||||
| @@ -51,7 +51,6 @@ | |||||||
|     components: { |     components: { | ||||||
|       FormItemWrapper, |       FormItemWrapper, | ||||||
|     }, |     }, | ||||||
|     inject: ['refList', 'formConfig', 'globalOptionData', 'globalModel'], |  | ||||||
|     data() { |     data() { | ||||||
|       return { |       return { | ||||||
|         oldFieldValue: null, //field组件change之前的值 |         oldFieldValue: null, //field组件change之前的值 | ||||||
|   | |||||||
| @@ -53,7 +53,6 @@ | |||||||
|     components: { |     components: { | ||||||
|       FormItemWrapper, |       FormItemWrapper, | ||||||
|     }, |     }, | ||||||
|     inject: ['refList', 'formConfig', 'globalOptionData', 'globalModel'], |  | ||||||
|     data() { |     data() { | ||||||
|       return { |       return { | ||||||
|         oldFieldValue: null, //field组件change之前的值 |         oldFieldValue: null, //field组件change之前的值 | ||||||
|   | |||||||
| @@ -57,7 +57,6 @@ | |||||||
|     components: { |     components: { | ||||||
|       FormItemWrapper, |       FormItemWrapper, | ||||||
|     }, |     }, | ||||||
|     inject: ['refList', 'formConfig', 'globalOptionData', 'globalModel'], |  | ||||||
|     data() { |     data() { | ||||||
|       return { |       return { | ||||||
|         oldFieldValue: null, //field组件change之前的值 |         oldFieldValue: null, //field组件change之前的值 | ||||||
|   | |||||||
| @@ -54,7 +54,6 @@ | |||||||
|     components: { |     components: { | ||||||
|       FormItemWrapper, |       FormItemWrapper, | ||||||
|     }, |     }, | ||||||
|     inject: ['refList', 'formConfig', 'globalOptionData', 'globalModel'], |  | ||||||
|     data() { |     data() { | ||||||
|       return { |       return { | ||||||
|         oldFieldValue: null, //field组件change之前的值 |         oldFieldValue: null, //field组件change之前的值 | ||||||
|   | |||||||
| @@ -53,7 +53,7 @@ | |||||||
|     provide() { |     provide() { | ||||||
|       return { |       return { | ||||||
|         refList: this.widgetRefList, |         refList: this.widgetRefList, | ||||||
|         formConfig: this.formConfig, |         getFormConfig: () => this.formConfig,  /* 解决provide传递formConfig属性的响应式更新问题!! */ | ||||||
|         globalOptionData: this.optionData, |         globalOptionData: this.optionData, | ||||||
|         getOptionData: () => this.optionData, |         getOptionData: () => this.optionData, | ||||||
|         globalModel: { |         globalModel: { | ||||||
| @@ -172,7 +172,6 @@ | |||||||
|  |  | ||||||
| <style lang="scss" scoped> | <style lang="scss" scoped> | ||||||
|   .container-scroll-bar { |   .container-scroll-bar { | ||||||
|  |  | ||||||
|     :deep(.el-scrollbar__wrap), :deep(.el-scrollbar__view) { |     :deep(.el-scrollbar__wrap), :deep(.el-scrollbar__view) { | ||||||
|       overflow-x: hidden; |       overflow-x: hidden; | ||||||
|     } |     } | ||||||
| @@ -186,14 +185,6 @@ | |||||||
|     overflow-y: auto; |     overflow-y: auto; | ||||||
|  |  | ||||||
|     .el-form.full-height-width { |     .el-form.full-height-width { | ||||||
|       /* |  | ||||||
|       margin: 0 auto; |  | ||||||
|       width: 420px; |  | ||||||
|       border-radius: 15px; |  | ||||||
|       //border-width: 10px; |  | ||||||
|       box-shadow: 0 0 1px 10px #495060; |  | ||||||
|       */ |  | ||||||
|  |  | ||||||
|       height: 100%; |       height: 100%; | ||||||
|       padding: 3px; |       padding: 3px; | ||||||
|       background: #ffffff; |       background: #ffffff; | ||||||
|   | |||||||
| @@ -180,14 +180,6 @@ | |||||||
|  |  | ||||||
|     }, |     }, | ||||||
|     created() { |     created() { | ||||||
|       // eventBus.$on('editEventHandler', (eventName, eventParams) => { |  | ||||||
|       //   this.editEventHandler(eventName, eventParams) |  | ||||||
|       // }) |  | ||||||
|  |  | ||||||
|       // eventBus.$on('editEventHandler', (eventParams) => { |  | ||||||
|       //   this.editEventHandler(eventParams[0], eventParams[1]) |  | ||||||
|       // }) |  | ||||||
|  |  | ||||||
|       this.on$('editEventHandler', (eventParams) => { |       this.on$('editEventHandler', (eventParams) => { | ||||||
|         //debugger |         //debugger | ||||||
|         this.editEventHandler(eventParams[0], eventParams[1]) |         this.editEventHandler(eventParams[0], eventParams[1]) | ||||||
|   | |||||||
| @@ -7,7 +7,6 @@ export default { | |||||||
|   methods: { |   methods: { | ||||||
|     editEventHandler(eventName, eventParams) { |     editEventHandler(eventName, eventParams) { | ||||||
|       this.dispatch('SettingPanel', 'editEventHandler', [eventName, [...eventParams]]) |       this.dispatch('SettingPanel', 'editEventHandler', [eventName, [...eventParams]]) | ||||||
|       // eventBus.$emit('editEventHandler', [eventName, [...eventParams]]) |  | ||||||
|     }, |     }, | ||||||
|  |  | ||||||
|   } |   } | ||||||
|   | |||||||
| @@ -44,9 +44,10 @@ | |||||||
|     <div v-if="showPreviewDialogFlag" class="" v-drag="['.drag-dialog.el-dialog', '.drag-dialog .el-dialog__header']"> |     <div v-if="showPreviewDialogFlag" class="" v-drag="['.drag-dialog.el-dialog', '.drag-dialog .el-dialog__header']"> | ||||||
|       <el-dialog :title="i18nt('designer.toolbar.preview')" v-model="showPreviewDialogFlag" |       <el-dialog :title="i18nt('designer.toolbar.preview')" v-model="showPreviewDialogFlag" | ||||||
|                  :show-close="true" :close-on-click-modal="false" :close-on-press-escape="false" center |                  :show-close="true" :close-on-click-modal="false" :close-on-press-escape="false" center | ||||||
|                  :destroy-on-close="true" custom-class="drag-dialog small-padding-dialog" width="75%" :fullscreen="layoutType === 'H5'"> |                  :destroy-on-close="true" custom-class="drag-dialog small-padding-dialog" width="75%" | ||||||
|  |                  :fullscreen="(layoutType === 'H5') || (layoutType === 'Pad')"> | ||||||
|         <div> |         <div> | ||||||
|           <div class="form-render-wrapper" :class="[layoutType === 'H5' ? 'h5-layout' : '']"> |           <div class="form-render-wrapper" :class="[layoutType === 'H5' ? 'h5-layout' : (layoutType === 'Pad' ? 'pad-layout' : '')]"> | ||||||
|             <VFormRender ref="preForm" :form-json="formJson" :form-data="testFormData" :preview-state="true" |             <VFormRender ref="preForm" :form-json="formJson" :form-data="testFormData" :preview-state="true" | ||||||
|                          :option-data="testOptionData" |                          :option-data="testOptionData" | ||||||
|                          @appendButtonClick="testOnAppendButtonClick" @buttonClick="testOnButtonClick" |                          @appendButtonClick="testOnAppendButtonClick" @buttonClick="testOnButtonClick" | ||||||
| @@ -705,7 +706,7 @@ | |||||||
|  |  | ||||||
|   .form-render-wrapper { |   .form-render-wrapper { | ||||||
|     //height: calc(100vh - 142px); |     //height: calc(100vh - 142px); | ||||||
|     all: revert !important; /* 防止表单继承el-dialog等外部样式,未生效,原因不明?? */ |     //all: revert !important; /* 防止表单继承el-dialog等外部样式,未生效,原因不明?? */ | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   .form-render-wrapper.h5-layout { |   .form-render-wrapper.h5-layout { | ||||||
| @@ -714,7 +715,16 @@ | |||||||
|     border-radius: 15px; |     border-radius: 15px; | ||||||
|     //border-width: 10px; |     //border-width: 10px; | ||||||
|     box-shadow: 0 0 1px 10px #495060; |     box-shadow: 0 0 1px 10px #495060; | ||||||
|     height: calc(100vh - 142px); |     height: calc(100vh - 175px); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   .form-render-wrapper.pad-layout { | ||||||
|  |     margin: 0 auto; | ||||||
|  |     width: 960px; | ||||||
|  |     border-radius: 15px; | ||||||
|  |     //border-width: 10px; | ||||||
|  |     box-shadow: 0 0 1px 10px #495060; | ||||||
|  |     height: calc(100vh - 175px); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   .node-tree-drawer { |   .node-tree-drawer { | ||||||
|   | |||||||
| @@ -55,7 +55,7 @@ | |||||||
|       }, |       }, | ||||||
|  |  | ||||||
|     }, |     }, | ||||||
|     inject: ['refList', 'globalModel', 'formConfig', 'previewState'], |     inject: ['refList', 'globalModel', 'getFormConfig', 'previewState'], | ||||||
|     data() { |     data() { | ||||||
|       return { |       return { | ||||||
|         layoutProps: { |         layoutProps: { | ||||||
| @@ -70,6 +70,10 @@ | |||||||
|       } |       } | ||||||
|     }, |     }, | ||||||
|     computed: { |     computed: { | ||||||
|  |       formConfig() { | ||||||
|  |         return this.getFormConfig() | ||||||
|  |       }, | ||||||
|  |  | ||||||
|       customClass() { |       customClass() { | ||||||
|         return this.widget.options.customClass || '' |         return this.widget.options.customClass || '' | ||||||
|       }, |       }, | ||||||
|   | |||||||
| @@ -73,7 +73,7 @@ | |||||||
|       return { |       return { | ||||||
|         refList: this.widgetRefList, |         refList: this.widgetRefList, | ||||||
|         sfRefList: this.subFormRefList,  //收集SubForm引用 |         sfRefList: this.subFormRefList,  //收集SubForm引用 | ||||||
|         formConfig: this.formConfig, |         getFormConfig: () => this.formJsonObj.formConfig,  /* 解决provide传递formConfig属性的响应式更新问题!! */ | ||||||
|         globalOptionData: this.optionData, |         globalOptionData: this.optionData, | ||||||
|         getOptionData: () => this.optionData,  /* 该方法用于在异步更新option-data之后重新获取到最新值 */ |         getOptionData: () => this.optionData,  /* 该方法用于在异步更新option-data之后重新获取到最新值 */ | ||||||
|         globalModel: { |         globalModel: { | ||||||
| @@ -357,7 +357,6 @@ | |||||||
|             this.buildFormModel(newFormJsonObj.widgetList) |             this.buildFormModel(newFormJsonObj.widgetList) | ||||||
|  |  | ||||||
|             this.formJsonObj['formConfig'] = newFormJsonObj.formConfig |             this.formJsonObj['formConfig'] = newFormJsonObj.formConfig | ||||||
|             // this._provided.formConfig = newFormJsonObj.formConfig  //强制更新provide的formConfig对象 |  | ||||||
|             this.formJsonObj['widgetList'] = newFormJsonObj.widgetList |             this.formJsonObj['widgetList'] = newFormJsonObj.widgetList | ||||||
|  |  | ||||||
|             this.$nextTick(() => { |             this.$nextTick(() => { | ||||||
|   | |||||||
| @@ -11,139 +11,142 @@ export function addDirective(app) { | |||||||
|     mounted(el, binding) { |     mounted(el, binding) { | ||||||
|       if (!binding.value) return false; |       if (!binding.value) return false; | ||||||
|  |  | ||||||
|       const dragDom = document.querySelector(binding.value[0]) |       binding.instance.$nextTick(() => { | ||||||
|       const dragHeader = document.querySelector(binding.value[1]) |         const dragDom = document.querySelector(binding.value[0]) | ||||||
|  |         const dragHeader = document.querySelector(binding.value[1]) | ||||||
|  |  | ||||||
|       dragHeader.onmouseover = () => (dragHeader.style.cursor = `move`); |         dragHeader.onmouseover = () => (dragHeader.style.cursor = `move`); | ||||||
|  |  | ||||||
|       function down(e, type) { |         function down(e, type) { | ||||||
|         // 鼠标按下,计算当前元素距离可视区的距离 |           // 鼠标按下,计算当前元素距离可视区的距离 | ||||||
|         const disX = type === 'pc' ? e.clientX - dragHeader.offsetLeft : e.touches[0].clientX - dragHeader.offsetLeft; |           const disX = type === 'pc' ? e.clientX - dragHeader.offsetLeft : e.touches[0].clientX - dragHeader.offsetLeft; | ||||||
|         const disY = type === 'pc' ? e.clientY - dragHeader.offsetTop : e.touches[0].clientY - dragHeader.offsetTop; |           const disY = type === 'pc' ? e.clientY - dragHeader.offsetTop : e.touches[0].clientY - dragHeader.offsetTop; | ||||||
|  |  | ||||||
|         // body当前宽度 |           // body当前宽度 | ||||||
|         const screenWidth = document.body.clientWidth; |           const screenWidth = document.body.clientWidth; | ||||||
|         // 可见区域高度(应为body高度,可某些环境下无法获取) |           // 可见区域高度(应为body高度,可某些环境下无法获取) | ||||||
|         const screenHeight = document.documentElement.clientHeight; |           const screenHeight = document.documentElement.clientHeight; | ||||||
|  |  | ||||||
|         // 对话框宽度 |           // 对话框宽度 | ||||||
|         const dragDomWidth = dragDom.offsetWidth; |           const dragDomWidth = dragDom.offsetWidth; | ||||||
|         // 对话框高度 |           // 对话框高度 | ||||||
|         const dragDomheight = dragDom.offsetHeight; |           const dragDomheight = dragDom.offsetHeight; | ||||||
|  |  | ||||||
|         const minDragDomLeft = dragDom.offsetLeft; |           const minDragDomLeft = dragDom.offsetLeft; | ||||||
|         const maxDragDomLeft = screenWidth - dragDom.offsetLeft - dragDomWidth; |           const maxDragDomLeft = screenWidth - dragDom.offsetLeft - dragDomWidth; | ||||||
|  |  | ||||||
|         const minDragDomTop = dragDom.offsetTop; |           const minDragDomTop = dragDom.offsetTop; | ||||||
|         const maxDragDomTop = screenHeight - dragDom.offsetTop - dragDomheight; |           const maxDragDomTop = screenHeight - dragDom.offsetTop - dragDomheight; | ||||||
|  |  | ||||||
|         // 获取到的值带px 正则匹配替换 |           // 获取到的值带px 正则匹配替换 | ||||||
|         let styL = getComputedStyle(dragDom).left; |           let styL = getComputedStyle(dragDom).left; | ||||||
|         let styT = getComputedStyle(dragDom).top; |           let styT = getComputedStyle(dragDom).top; | ||||||
|  |  | ||||||
|         // 注意在ie中 第一次获取到的值为组件自带50% 移动之后赋值为px |           // 注意在ie中 第一次获取到的值为组件自带50% 移动之后赋值为px | ||||||
|         if (styL.includes('%')) { |           if (styL.includes('%')) { | ||||||
|           styL = +document.body.clientWidth * (+styL.replace(/%/g, '') / 100); |             styL = +document.body.clientWidth * (+styL.replace(/%/g, '') / 100); | ||||||
|           styT = +document.body.clientHeight * (+styT.replace(/%/g, '') / 100); |             styT = +document.body.clientHeight * (+styT.replace(/%/g, '') / 100); | ||||||
|         } else { |           } else { | ||||||
|           styL = +styL.replace(/\px/g, ''); |             styL = +styL.replace(/\px/g, ''); | ||||||
|           styT = +styT.replace(/\px/g, ''); |             styT = +styT.replace(/\px/g, ''); | ||||||
|  |           } | ||||||
|  |  | ||||||
|  |           return { | ||||||
|  |             disX, | ||||||
|  |             disY, | ||||||
|  |             minDragDomLeft, | ||||||
|  |             maxDragDomLeft, | ||||||
|  |             minDragDomTop, | ||||||
|  |             maxDragDomTop, | ||||||
|  |             styL, | ||||||
|  |             styT, | ||||||
|  |           }; | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         return { |         function move(e, type, obj) { | ||||||
|           disX, |           let { disX, disY, minDragDomLeft, maxDragDomLeft, minDragDomTop, maxDragDomTop, styL, styT } = obj; | ||||||
|           disY, |  | ||||||
|           minDragDomLeft, |  | ||||||
|           maxDragDomLeft, |  | ||||||
|           minDragDomTop, |  | ||||||
|           maxDragDomTop, |  | ||||||
|           styL, |  | ||||||
|           styT, |  | ||||||
|         }; |  | ||||||
|       } |  | ||||||
|  |  | ||||||
|       function move(e, type, obj) { |           // 通过事件委托,计算移动的距离 | ||||||
|         let { disX, disY, minDragDomLeft, maxDragDomLeft, minDragDomTop, maxDragDomTop, styL, styT } = obj; |           let left = type === 'pc' ? e.clientX - disX : e.touches[0].clientX - disX; | ||||||
|  |           let top = type === 'pc' ? e.clientY - disY : e.touches[0].clientY - disY; | ||||||
|  |  | ||||||
|         // 通过事件委托,计算移动的距离 |           // 边界处理 | ||||||
|         let left = type === 'pc' ? e.clientX - disX : e.touches[0].clientX - disX; |           if (-left > minDragDomLeft) { | ||||||
|         let top = type === 'pc' ? e.clientY - disY : e.touches[0].clientY - disY; |             left = -minDragDomLeft; | ||||||
|  |           } else if (left > maxDragDomLeft) { | ||||||
|  |             left = maxDragDomLeft; | ||||||
|  |           } | ||||||
|  |  | ||||||
|         // 边界处理 |           if (-top > minDragDomTop) { | ||||||
|         if (-left > minDragDomLeft) { |             top = -minDragDomTop; | ||||||
|           left = -minDragDomLeft; |           } else if (top > maxDragDomTop) { | ||||||
|         } else if (left > maxDragDomLeft) { |             top = maxDragDomTop; | ||||||
|           left = maxDragDomLeft; |           } | ||||||
|  |  | ||||||
|  |           // 移动当前元素 | ||||||
|  |           dragDom.style.cssText += `;left:${left + styL}px;top:${top + styT}px;`; | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         if (-top > minDragDomTop) { |         /** | ||||||
|           top = -minDragDomTop; |          * pc端 | ||||||
|         } else if (top > maxDragDomTop) { |          * onmousedown 鼠标按下触发事件 | ||||||
|           top = maxDragDomTop; |          * onmousemove 鼠标按下时持续触发事件 | ||||||
|         } |          * onmouseup 鼠标抬起触发事件 | ||||||
|  |          */ | ||||||
|  |         dragHeader.onmousedown = (e) => { | ||||||
|  |           const obj = down(e, 'pc'); | ||||||
|  |           document.onmousemove = (e) => { | ||||||
|  |             move(e, 'pc', obj); | ||||||
|  |           }; | ||||||
|  |           document.onmouseup = () => { | ||||||
|  |             document.onmousemove = null; | ||||||
|  |             document.onmouseup = null; | ||||||
|  |           }; | ||||||
|  |         }; | ||||||
|  |  | ||||||
|         // 移动当前元素 |         /** | ||||||
|         dragDom.style.cssText += `;left:${left + styL}px;top:${top + styT}px;`; |          * 移动端 | ||||||
|       } |          * ontouchstart 当按下手指时,触发ontouchstart | ||||||
|  |          * ontouchmove 当移动手指时,触发ontouchmove | ||||||
|       /** |          * ontouchend 当移走手指时,触发ontouchend | ||||||
|        * pc端 |          */ | ||||||
|        * onmousedown 鼠标按下触发事件 |         dragHeader.ontouchstart = (e) => { | ||||||
|        * onmousemove 鼠标按下时持续触发事件 |           const obj = down(e, 'app'); | ||||||
|        * onmouseup 鼠标抬起触发事件 |           document.ontouchmove = (e) => { | ||||||
|        */ |             move(e, 'app', obj); | ||||||
|       dragHeader.onmousedown = (e) => { |           }; | ||||||
|         const obj = down(e, 'pc'); |           document.ontouchend = () => { | ||||||
|         document.onmousemove = (e) => { |             document.ontouchmove = null; | ||||||
|           move(e, 'pc', obj); |             document.ontouchend = null; | ||||||
|  |           }; | ||||||
|         }; |         }; | ||||||
|         document.onmouseup = () => { |       }) | ||||||
|           document.onmousemove = null; |  | ||||||
|           document.onmouseup = null; |  | ||||||
|         }; |  | ||||||
|       }; |  | ||||||
|  |  | ||||||
|       /** |  | ||||||
|        * 移动端 |  | ||||||
|        * ontouchstart 当按下手指时,触发ontouchstart |  | ||||||
|        * ontouchmove 当移动手指时,触发ontouchmove |  | ||||||
|        * ontouchend 当移走手指时,触发ontouchend |  | ||||||
|        */ |  | ||||||
|       dragHeader.ontouchstart = (e) => { |  | ||||||
|         const obj = down(e, 'app'); |  | ||||||
|         document.ontouchmove = (e) => { |  | ||||||
|           move(e, 'app', obj); |  | ||||||
|         }; |  | ||||||
|         document.ontouchend = () => { |  | ||||||
|           document.ontouchmove = null; |  | ||||||
|           document.ontouchend = null; |  | ||||||
|         }; |  | ||||||
|       }; |  | ||||||
|     }, |     }, | ||||||
|   }) |   }) | ||||||
|  |  | ||||||
|   // v-dialogDragWidth: 弹窗宽度拖大 拖小 |   // v-dialogDragWidth: 弹窗宽度拖大 拖小 | ||||||
|   app.directive('dialogDragWidth', { |   app.directive('dialogDragWidth', { | ||||||
|     mounted(el, binding) { |     mounted(el, binding) { | ||||||
|       const dragDom = binding.value.$el.querySelector('.el-dialog') |       binding.instance.$nextTick(() => { | ||||||
|  |         const dragDom = binding.value.$el.querySelector('.el-dialog') | ||||||
|  |         el.onmousedown = (e) => { | ||||||
|  |           // 鼠标按下,计算当前元素距离可视区的距离 | ||||||
|  |           const disX = e.clientX - el.offsetLeft | ||||||
|  |  | ||||||
|       el.onmousedown = (e) => { |           document.onmousemove = function(e) { | ||||||
|         // 鼠标按下,计算当前元素距离可视区的距离 |             e.preventDefault() // 移动时禁用默认事件 | ||||||
|         const disX = e.clientX - el.offsetLeft |  | ||||||
|  |  | ||||||
|         document.onmousemove = function(e) { |             // 通过事件委托,计算移动的距离 | ||||||
|           e.preventDefault() // 移动时禁用默认事件 |             const l = e.clientX - disX | ||||||
|  |             dragDom.style.width = `${l}px` | ||||||
|  |           } | ||||||
|  |  | ||||||
|           // 通过事件委托,计算移动的距离 |           document.onmouseup = function(e) { | ||||||
|           const l = e.clientX - disX |             document.onmousemove = null | ||||||
|           dragDom.style.width = `${l}px` |             document.onmouseup = null | ||||||
|  |           } | ||||||
|         } |         } | ||||||
|  |       }) | ||||||
|         document.onmouseup = function(e) { |  | ||||||
|           document.onmousemove = null |  | ||||||
|           document.onmouseup = null |  | ||||||
|         } |  | ||||||
|       } |  | ||||||
|     } |     } | ||||||
|   }) |   }) | ||||||
|  |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user