refactor: 使用setup重构 src/layout/home/index.vue

This commit is contained in:
王奥斯 2022-02-16 10:25:51 +08:00
parent b7335d7e42
commit 91415edb20

View File

@ -9,7 +9,6 @@
margin-left: 15px; margin-left: 15px;
cursor: pointer; cursor: pointer;
" "
@click="Previous"
> >
<!-- 返回 --> <!-- 返回 -->
</p> </p>
@ -27,7 +26,6 @@
@change="importJSON" @change="importJSON"
style="display: none" style="display: none"
/> />
<!-- <el-button @click="Preservation">保存</el-button> -->
</div> </div>
</section> </section>
@ -147,22 +145,19 @@
<script> <script>
import utils from 'utils/index' // import utils from 'utils/index' //
import componentProperties from '@/utils/componentProperties' // import componentProperties from '@/utils/componentProperties' //
import html2canvas from 'html2canvas' //
import FileSaver from 'file-saver' // JSON import FileSaver from 'file-saver' // JSON
import { reactive, watch, toRefs, inject } from 'vue'
import { ElMessageBox, ElMessage } from 'element-plus'
export default { export default {
name: 'home', name: 'home',
inject: ['reload'], setup() {
data() { //
return { const realTimeView = reactive({ show: false })
realTimeView: {
show: false, // //
}, const datas = reactive({
id: null, // id: null, //id
deleShow: true, //
index: '', //index
rightcom: 'decorate', //
currentproperties: {}, //
pageSetup: { pageSetup: {
// //
name: '页面标题', // name: '页面标题', //
@ -173,31 +168,21 @@ export default {
bgColor: 'rgba(249, 249, 249, 10)', // bgColor: 'rgba(249, 249, 249, 10)', //
bgImg: '', // bgImg: '', //
}, },
pageComponents: [], // pageComponents: [] //
offsetY: 0, // })
pointer: { show: false }, //穿
onlyOne: ['1-5','1-16'], // (type)
}
},
mounted() {
this.pageSetup.name = '页面标题'
this.currentproperties = this.pageSetup
},
methods: {
// JSON // JSON
catJson() { const catJson = () => {
this.$alert( ElMessageBox.alert(
`{ `{
<br/> <br/>
"id": ${this.id}, "id": ${datas.id},
<br/> <br/>
"name": "${this.pageSetup.name}", "name": "${datas.pageSetup.name}",
<br/> <br/>
"templateJson": '${JSON.stringify(this.pageSetup)}', "templateJson": '${JSON.stringify(datas.pageSetup)}',
<br/> <br/>
"component": '${JSON.stringify(this.pageComponents)}', "component": '${JSON.stringify(datas.pageComponents)}',
<br/> <br/>
}`, }`,
'查看JSON', '查看JSON',
@ -208,58 +193,106 @@ export default {
callback: () => {}, callback: () => {},
} }
) )
}, }
/**
* 保存 // json
*/ const exportJSON = () => {
Preservation() { // json
/* 隐藏border和删除图标 */ const data = JSON.stringify({
this.deleShow = false id: datas.id,
/* 渲染结束截图 */ name: datas.pageSetup.name,
this.$nextTick(() => { templateJson: JSON.stringify(datas.pageSetup),
/* 截图 */ component: JSON.stringify(datas.pageComponents),
this.toImage()
}) })
}, const blob = new Blob([data], { type: '' })
FileSaver.saveAs(blob, `${datas.pageSetup.name}.json`)
}
// json
const importJSON = () => {
const file = document.getElementById('file').files[0]
const reader = new FileReader()
reader.readAsText(file)
let _this = datas
reader.onload = function () {
// this.resultjsonjson
let ImportJSON = JSON.parse(this.result)
//
console.log(ImportJSON, '-----------------导入成功')
// JSON
_this.id = ImportJSON.id
_this.pageSetup = JSON.parse(ImportJSON.templateJson)
_this.pageComponents = JSON.parse(ImportJSON.component)
}
}
/** /**
* 页面截图 * 切换组件位置 用于组件管理中删除功能
* *
* @param {Function} callBack 回调函数 * @param {Object} res 组件切换后返回的位置
*/ */
toImage() { const componenmanagement = (res) => {
/* 加载 */ console.log(6666666666666666)
const loading = this.$loading({ datas.pageComponents = res
lock: true, }
text: '保存中...',
spinner: 'el-icon-loading', //
background: 'rgba(0, 0, 0, 0.7)', const choose = reactive({
deleShow: true, //
index: '', //index
rightcom: 'decorate', //
currentproperties: {}, //
offsetY: 0, //
onlyOne: ['1-5', '1-16'], // (type)
pointer: { show: false }, //穿
})
/**
* 选择组件
*
* @param {Object} res 当前组件对象
*/
const activeComponent = (res, index) => {
choose.index = index
/* 切换组件 */
choose.rightcom = res.style
/* 丢样式 */
choose.currentproperties = res.setStyle
/* 替换 */
datas.pageComponents.forEach(res => {
/* 修改选中 */
if (res.active === true) res.active = false
}) })
const imageTofiles = document.querySelector('#imageTofile') /* 选中样式 */
/* 截图 */ res.active = true
html2canvas(this.$refs.imageTofile, { }
backgroundColor: null,
height: imageTofiles.scrollHeight, //
width: imageTofiles.scrollWidth, const headTop = () => {
useCORS: true, choose.rightcom = 'decorate'
}).then((canvas) => { /* 替换 */
/* 显示border和删除图标 */ datas.pageComponents.forEach(res => {
this.deleShow = true /* 修改选中 */
let url = canvas.toDataURL('image/png') if (res.active === true) res.active = false
const formData = new FormData() console.log(res,'res++++++++++')
formData.append('base64File', url)
console.log(formData, '--------------页面图片formData')
loading.close()
}) })
}, }
//
const deleteObj = (index) => {
datas.pageComponents.splice(index, 1)
if (choose.index === index) choose.rightcom = 'decorate'
if (index < choose.index) choose.index = choose.index - 1
}
/** /**
* 当将元素或文本选择拖动到有效放置目标每几百毫秒上时会触发此事件 * 当将元素或文本选择拖动到有效放置目标每几百毫秒上时会触发此事件
* *
* @param {Object} event event对象 * @param {Object} event event对象
*/ */
allowDrop(event) { const allowDrop = (event) => {
// //
event.preventDefault() event.preventDefault()
@ -267,33 +300,33 @@ export default {
let eventoffset = event.offsetY let eventoffset = event.offsetY
/* 如果没有移动不触发事件减少损耗 */ /* 如果没有移动不触发事件减少损耗 */
if (this.offsetY === eventoffset) return if (choose.offsetY === eventoffset) return
else this.offsetY = eventoffset else choose.offsetY = eventoffset
/* 获取组件 */ /* 获取组件 */
const childrenObject = event.target.children[0] const childrenObject = event.target.children[0]
// //
if (this.pageComponents.length) { if (datas.pageComponents.length) {
/* 如果只有一个组件并且第一个是提示组件直接返回 */ /* 如果只有一个组件并且第一个是提示组件直接返回 */
if ( if (
this.pageComponents.length === 1 && datas.pageComponents.length === 1 &&
this.pageComponents[0].type === 0 datas.pageComponents[0].type === 0
) )
return return
/* 如果鼠标的高度小于第一个的一半直接放到第一个 */ /* 如果鼠标的高度小于第一个的一半直接放到第一个 */
if (eventoffset < childrenObject.children[0].clientHeight / 2) { if (eventoffset < childrenObject.children[0].clientHeight / 2) {
/* 如果第一个是提示组件直接返回 */ /* 如果第一个是提示组件直接返回 */
if (this.pageComponents[0].type === 0) return if (datas.pageComponents[0].type === 0) return
/* 删除提示组件 */ /* 删除提示组件 */
this.pageComponents = this.pageComponents.filter( datas.pageComponents = datas.pageComponents.filter(
(res) => res.component !== 'placementarea' (res) => res.component !== 'placementarea'
) )
/* 最后面添加提示组件 */ /* 最后面添加提示组件 */
this.pageComponents.unshift({ datas.pageComponents.unshift({
component: 'placementarea', component: 'placementarea',
type: 0, type: 0,
}) })
@ -313,16 +346,16 @@ export default {
eventoffset eventoffset
) { ) {
/* 最后一个组件是提示组件返回 */ /* 最后一个组件是提示组件返回 */
if (this.pageComponents[this.pageComponents.length - 1].type === 0) if (datas.pageComponents[datas.pageComponents.length - 1].type === 0)
return return
/* 清除提示组件 */ /* 清除提示组件 */
this.pageComponents = this.pageComponents.filter( datas.pageComponents = datas.pageComponents.filter(
(res) => res.component !== 'placementarea' (res) => res.component !== 'placementarea'
) )
/* 最后一个不是提示组件添加 */ /* 最后一个不是提示组件添加 */
this.pageComponents.push({ datas.pageComponents.push({
component: 'placementarea', component: 'placementarea',
type: 0, type: 0,
}) })
@ -338,34 +371,34 @@ export default {
if (childoffset + childrens[i].clientHeight / 2 > event.offsetY) { if (childoffset + childrens[i].clientHeight / 2 > event.offsetY) {
/* 如果是提示组件直接返回 */ /* 如果是提示组件直接返回 */
if (this.pageComponents[i].type === 0) break if (datas.pageComponents[i].type === 0) break
if (this.pageComponents[i - 1].type === 0) break if (datas.pageComponents[i - 1].type === 0) break
/* 清除提示组件 */ /* 清除提示组件 */
this.pageComponents = this.pageComponents.filter( datas.pageComponents = datas.pageComponents.filter(
(res) => res.component !== 'placementarea' (res) => res.component !== 'placementarea'
) )
this.pageComponents.splice(i, 0, { datas.pageComponents.splice(i, 0, {
component: 'placementarea', component: 'placementarea',
type: 0, type: 0,
}) })
break break
} else if (childoffset + childrens[i].clientHeight > event.offsetY) { } else if (childoffset + childrens[i].clientHeight > event.offsetY) {
if (this.pageComponents[i].type === 0) break if (datas.pageComponents[i].type === 0) break
if ( if (
!this.pageComponents[i + 1] || !datas.pageComponents[i + 1] ||
this.pageComponents[i + 1].type === 0 datas.pageComponents[i + 1].type === 0
) )
break break
this.pageComponents = this.pageComponents.filter( datas.pageComponents = datas.pageComponents.filter(
(res) => res.component !== 'placementarea' (res) => res.component !== 'placementarea'
) )
this.pageComponents.splice(i, 0, { datas.pageComponents.splice(i, 0, {
component: 'placementarea', component: 'placementarea',
type: 0, type: 0,
}) })
@ -375,210 +408,137 @@ export default {
} }
} else { } else {
/* 一个组件都没有直接push */ /* 一个组件都没有直接push */
this.pageComponents.push({ datas.pageComponents.push({
component: 'placementarea', component: 'placementarea',
type: 0, type: 0,
}) })
} }
}, }
/** /**
* 当在有效放置目标上放置元素或选择文本时触发此事件 * 当在有效放置目标上放置元素或选择文本时触发此事件
* *
* @param {Object} event event对象 * @param {Object} event event对象
*/ */
drop(event) { const drop = (event) => {
/* 获取数据 */ /* 获取数据 */
let data = utils.deepClone( let data = utils.deepClone(
componentProperties.get(event.dataTransfer.getData('componentName')) componentProperties.get(event.dataTransfer.getData('componentName'))
) )
console.log(data,'data++++++++++++++++++++++++++++++++++')
/* 查询是否只能存在一个的组件 */ /* 查询是否只能存在一个的组件 */
let someResult = this.pageComponents.some((item) => { let someResult = datas.pageComponents.some((item) => {
console.log(item.component,'--------------item.component') console.log(item.component, '--------------item.component')
return ( return (
this.onlyOne.includes(item.type) && choose.onlyOne.includes(item.type) &&
item.component === event.dataTransfer.getData('componentName') item.component === event.dataTransfer.getData('componentName')
) )
}) })
if (someResult) { if (someResult) {
this.$message.info('当前组件只能添加一个!') ElMessage.info('当前组件只能添加一个!')
/* 删除提示组件 */ /* 删除提示组件 */
this.pageComponents = this.pageComponents.filter( datas.pageComponents = datas.pageComponents.filter(
(res) => res.component !== 'placementarea' (res) => res.component !== 'placementarea'
) )
return return
} }
/* 替换 */ /* 替换 */
utils.forEach(this.pageComponents, (res, index) => { datas.pageComponents.forEach((res, index) => {
/* 修改选中 */ /* 修改选中 */
if (res.active === true) res.active = false if (res.active === true) res.active = false
/* 替换提示 */ /* 替换提示 */
this.index = index choose.index = index
if (res.component === 'placementarea') if (res.component === 'placementarea')
this.pageComponents[index] = data datas.pageComponents[index] = data
if (this.pageComponents.length === index + 1) if (datas.pageComponents.length === index + 1)
this.pageComponents = this.pageComponents.filter( datas.pageComponents = datas.pageComponents.filter(
(res) => res.component !== 'placementarea' (res) => res.component !== 'placementarea'
) )
}) })
/* 切换组件 */ /* 切换组件 */
this.rightcom = data.style choose.rightcom = data.style
/* 丢样式 */ /* 丢样式 */
this.currentproperties = data.setStyle choose.currentproperties = data.setStyle
console.log( console.log(
data, data,
this.rightcom, choose.rightcom,
this.currentproperties, choose.currentproperties,
'----------components data' '----------components data'
) )
}, }
/** /**
* 当拖动的元素或文本选择离开有效的放置目标时会触发此事件 * 当拖动的元素或文本选择离开有效的放置目标时会触发此事件
* *
* @param {Object} event event对象 * @param {Object} event event对象
*/ */
dragleaves() { const dragleaves = () => {
/* 删除提示组件 */ /* 删除提示组件 */
this.pageComponents = this.pageComponents.filter( datas.pageComponents = datas.pageComponents.filter(
(res) => res.component !== 'placementarea' (res) => res.component !== 'placementarea'
) )
}, }
/** const reload = inject('reload')
* 切换组件位置 //
* const reloads = () => {
* @param {Object} res 组件切换后返回的位置 ElMessageBox.confirm(
*/ '重置后您添加或者修改的数据将会失效, 是否继续?',
componenmanagement(res) { '提示',
this.pageComponents = res {
}, confirmButtonText: '确定',
cancelButtonText: '取消',
/** type: 'warning',
* 选择组件 }
* )
* @param {Object} res 当前组件对象
*/
activeComponent(res, index) {
this.index = index
/* 切换组件 */
this.rightcom = res.style
/* 丢样式 */
this.currentproperties = res.setStyle
/* 替换 */
utils.forEach(this.pageComponents, (res) => {
/* 修改选中 */
if (res.active === true) res.active = false
})
/* 选中样式 */
res.active = true
},
/**
* 标题切换
*
* @param {Object} res 当前组件对象
*/
headTop() {
this.rightcom = 'decorate'
/* 替换 */
utils.forEach(this.pageComponents, (res) => {
/* 修改选中 */
if (res.active === true) res.active = false
})
},
/* 删除组件 */
deleteObj(index) {
this.pageComponents.splice(index, 1)
if (this.index === index) this.rightcom = 'decorate'
if (index < this.index) this.index = this.index - 1
},
/* 页面刷新 */
reloads() {
this.$confirm('重置后您添加或者修改的数据将会失效, 是否继续?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
})
.then(() => { .then(() => {
this.reload() reload()
}) })
.catch(() => {}) .catch(() => {})
}, }
// //
Previous() { watch(
this.$confirm('返回列表您添加或者修改的数据将会失效, 是否继续?', '提示', { () => choose.rightcom,
confirmButtonText: '确定', (newval) => {
cancelButtonText: '取消', if (newval === 'decorate') {
type: 'warning', datas.pageComponents.forEach(res => {
}) /* 修改选中 */
.then(() => { if (res.active === true) res.active = false
this.$router.go(-1) })
}) choose.currentproperties = datas.pageSetup
.catch(() => {}) return
}, }
if (newval === 'componenmanagement') {
// json /* 替换 */
exportJSON() { datas.pageComponents.forEach(res => {
// json /* 修改选中 */
const data = JSON.stringify({ if (res.active === true) res.active = false
id: this.id, })
name: this.pageSetup.name, choose.currentproperties = datas.pageComponents
templateJson: JSON.stringify(this.pageSetup), }
component: JSON.stringify(this.pageComponents),
})
const blob = new Blob([data], { type: '' })
FileSaver.saveAs(blob, `${this.pageSetup.name}.json`)
},
// json
importJSON() {
const file = document.getElementById('file').files[0]
const reader = new FileReader()
reader.readAsText(file)
let _this = this
reader.onload = function () {
// this.resultjsonjson
let ImportJSON = JSON.parse(this.result)
//
console.log(ImportJSON, '-----------------导入成功')
// JSON
_this.id = ImportJSON.id
_this.pageSetup = JSON.parse(ImportJSON.templateJson)
_this.pageComponents = JSON.parse(ImportJSON.component)
} }
}, )
}, return {
realTimeView,
watch: { ...toRefs(datas),
/* 监听右侧属性设置切换 */ ...toRefs(choose),
rightcom(newval) { catJson,
if (newval === 'decorate') { componenmanagement,
utils.forEach(this.pageComponents, (res) => { activeComponent,
/* 修改选中 */ headTop,
if (res.active === true) res.active = false deleteObj,
}) exportJSON,
this.currentproperties = this.pageSetup importJSON,
return allowDrop,
} drop,
if (newval === 'componenmanagement') { dragleaves,
/* 替换 */ reloads,
utils.forEach(this.pageComponents, (res) => { }
/* 修改选中 */
if (res.active === true) res.active = false
})
this.currentproperties = this.pageComponents
}
},
}, },
} }
</script> </script>