Merge pull request #86 from JeremyYu-cn/feat-upgrade-vue3

Feat: convert CompListWrap component to composition API
This commit is contained in:
Jeremy Yu 2024-03-13 23:58:57 +00:00 committed by GitHub
commit 325274bbce
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 195 additions and 163 deletions

View File

@ -11,15 +11,15 @@ const cutToken = 'ghp_qpV8PUxwY7as4jc'
const reader = new FileReader() const reader = new FileReader()
function getBase64(file: File) { function getBase64(file: File) {
return new Promise((resolve) => { return new Promise((resolve) => {
reader.onload = function (event: any) { reader.onload = function (event) {
const fileContent = event.target.result const fileContent = event.target && event.target.result
resolve(fileContent.split(',')[1]) resolve((fileContent as string).split(',')[1])
} }
reader.readAsDataURL(file) reader.readAsDataURL(file)
}) })
} }
const putPic = async (file: any) => { const putPic = async (file: File) => {
const repo = 'shawnphang/files' const repo = 'shawnphang/files'
const d = new Date() const d = new Date()
const content = typeof file === 'string' ? file : await getBase64(file) const content = typeof file === 'string' ? file : await getBase64(file)

View File

@ -41,12 +41,12 @@ type IGetTempListResult = TPageRequestResult<IGetTempListData[]>
// 获取模板列表 // 获取模板列表
export const getTempList = (params: IGetTempListParam) => fetch<IGetTempListResult>('design/list', params, 'get') export const getTempList = (params: IGetTempListParam) => fetch<IGetTempListResult>('design/list', params, 'get')
type TGetTempDetail = { export type TGetTempDetail = {
id: number id: number
type?: number type?: number
} }
type TTempDetail = { export type TTempDetail = {
/** 分类 */ /** 分类 */
category: number category: number
/** 封面 */ /** 封面 */
@ -93,7 +93,7 @@ type TGetCompListParam = {
page?: number page?: number
type?: number type?: number
pageSize: number pageSize: number
cate: number cate?: number | string
} }
/** 获取组件返回类型 */ /** 获取组件返回类型 */
@ -104,13 +104,19 @@ export type TGetCompListResult = {
state: number state: number
title: string title: string
width: number width: number
name?: string
} }
type getCompListReturn = TPageRequestResult<TGetCompListResult[]> type getCompListReturn = TPageRequestResult<TGetCompListResult[]>
// 组件相关接口 // 组件相关接口
export const getCompList = (params: TGetCompListParam) => fetch<getCompListReturn>('design/list', params, 'get') export const getCompList = (params: TGetCompListParam) => fetch<getCompListReturn>('design/list', params, 'get')
export const removeComp = (params: Type.Object = {}) => fetch('design/del', params, 'post')
type TRemoveComp = {
id: string | number
}
export const removeComp = (params: TRemoveComp) => fetch<void>('design/del', params, 'post')
// export const getCompDetail = (params: Type.Object = {}) => fetch('/api/template/temp_info', params, 'get') // export const getCompDetail = (params: Type.Object = {}) => fetch('/api/template/temp_info', params, 'get')
// 保存作品 // 保存作品

View File

@ -15,50 +15,70 @@
</el-input> </el-input>
</div> </div>
<el-divider content-position="left">推荐组件</el-divider> --> <el-divider content-position="left">推荐组件</el-divider> -->
<classHeader v-show="!currentCategory" :types="types" @select="selectTypes"> <classHeader v-show="!state.currentCategory" :types="state.types" @select="selectTypes">
<template v-slot="{ index }"> <template v-slot="{ index }">
<div class="list-wrap"> <div class="list-wrap">
<div v-for="(item, i) in showList[index]" :key="i + 'sl'" draggable="false" @mousedown="dragStart($event, item)" @mousemove="mousemove" @mouseup="mouseup" @click.stop="selectItem(item)" @dragstart="dragStart($event, item)"> <div
v-for="(item, i) in state.showList[index]" :key="i + 'sl'"
draggable="false"
@mousedown="dragStart($event, item)" @mousemove="mousemove"
@mouseup="mouseup" @click.stop="selectItem(item)"
@dragstart="dragStart($event, item)"
>
<el-image class="list__img-thumb" :src="item.cover" fit="contain" lazy loading="lazy"></el-image> <el-image class="list__img-thumb" :src="item.cover" fit="contain" lazy loading="lazy"></el-image>
</div> </div>
</div> </div>
</template> </template>
</classHeader> </classHeader>
<ul v-if="currentCategory" v-infinite-scroll="load" class="infinite-list" :infinite-scroll-distance="150" style="overflow: auto"> <ul v-if="state.currentCategory" v-infinite-scroll="load" class="infinite-list" :infinite-scroll-distance="150" style="overflow: auto">
<classHeader :is-back="true" @back="back">{{ currentCategory.name }}</classHeader> <classHeader :is-back="true" @back="back">{{ state.currentCategory.name }}</classHeader>
<el-space fill wrap :fillRatio="30" direction="horizontal" class="list"> <el-space fill wrap :fillRatio="30" direction="horizontal" class="list">
<div v-for="(item, i) in list" :key="i + 'i'" class="list__item" draggable="false" @mousedown="dragStart($event, item)" @mousemove="mousemove" @mouseup="mouseup" @click.stop="selectItem(item)" @dragstart="dragStart($event, item)"> <div
v-for="(item, i) in state.list" :key="i + 'i'"
class="list__item" draggable="false"
@mousedown="dragStart($event, item)" @mousemove="mousemove"
@mouseup="mouseup" @click.stop="selectItem(item)"
@dragstart="dragStart($event, item)"
>
<!-- <edit-model :isComp="true" @action="action($event, item, i)"> --> <!-- <edit-model :isComp="true" @action="action($event, item, i)"> -->
<el-image class="list__img" :src="item.cover" fit="contain" lazy loading="lazy" /> <el-image class="list__img" :src="item.cover" fit="contain" lazy loading="lazy" />
<!-- </edit-model> --> <!-- </edit-model> -->
</div> </div>
</el-space> </el-space>
<div v-show="loading" class="loading"><i class="el-icon-loading"></i> 拼命加载中</div> <div v-show="state.loading" class="loading"><i class="el-icon-loading"></i> 拼命加载中</div>
<div v-show="loadDone" class="loading">全部加载完毕</div> <div v-show="state.loadDone" class="loading">全部加载完毕</div>
</ul> </ul>
</div> </div>
</template> </template>
<script lang="ts"> <script lang="ts" setup>
import { defineComponent, reactive, toRefs, onMounted, watch } from 'vue' import { reactive, onMounted } from 'vue'
import api from '@/api' import api from '@/api'
import { useStore } from 'vuex' import { useStore } from 'vuex'
import getComponentsData from '@/common/methods/DesignFeatures/setComponents' import getComponentsData from '@/common/methods/DesignFeatures/setComponents'
import DragHelper from '@/common/hooks/dragHelper' import DragHelper from '@/common/hooks/dragHelper'
import setItem2Data from '@/common/methods/DesignFeatures/setImage' import setItem2Data from '@/common/methods/DesignFeatures/setImage'
import { TGetCompListResult, TGetTempDetail, TTempDetail } from '@/api/home'
export default defineComponent({ type TState = {
components: {}, loading: boolean
setup(props) { loadDone: boolean
// list: TGetCompListResult[]
const dragHelper = new DragHelper() searchValue: string
let isDrag = false currentCategory: TGetCompListResult | null
let startPoint = { x: 99999, y: 99999 } types: []
let tempDetail: any = null showList: TGetCompListResult[][]
// }
const compsCache: any = {}
const state = reactive({ //
const dragHelper = new DragHelper()
let isDrag = false
let startPoint = { x: 99999, y: 99999 }
let tempDetail: TTempDetail | null = null
//
const compsCache: any = {}
const state = reactive<TState>({
loading: false, loading: false,
loadDone: false, loadDone: false,
list: [], list: [],
@ -66,11 +86,11 @@ export default defineComponent({
currentCategory: null, currentCategory: null,
types: [], types: [],
showList: [], showList: [],
}) })
const store = useStore() const store = useStore()
const pageOptions = { type: 1, page: 0, pageSize: 20 } const pageOptions = { type: 1, page: 0, pageSize: 20 }
onMounted(async () => { onMounted(async () => {
if (state.types.length <= 0) { if (state.types.length <= 0) {
const types = await api.material.getKinds({ type: 3 }) const types = await api.material.getKinds({ type: 3 })
state.types = types state.types = types
@ -83,23 +103,24 @@ export default defineComponent({
state.showList.push(list) state.showList.push(list)
} }
} }
}) })
const mouseup = (e: any) => { const mouseup = (e: MouseEvent) => {
e.preventDefault() e.preventDefault()
// setTimeout(() => { // setTimeout(() => {
isDrag = false isDrag = false
tempDetail = null tempDetail = null
startPoint = { x: 99999, y: 99999 } startPoint = { x: 99999, y: 99999 }
// }, 10) // }, 10)
} }
const mousemove = (e: any) => {
const mousemove = (e: MouseEvent) => {
e.preventDefault() e.preventDefault()
if (e.x - startPoint.x > 2 || e.y - startPoint.y > 2) { if (e.x - startPoint.x > 2 || e.y - startPoint.y > 2) {
isDrag = true isDrag = true
} }
} }
const load = async (init: boolean = false) => { const load = async (init: boolean = false) => {
if (init) { if (init) {
state.list = [] state.list = []
pageOptions.page = 0 pageOptions.page = 0
@ -114,7 +135,8 @@ export default defineComponent({
pageOptions.page += 1 pageOptions.page += 1
const res = await api.home.getCompList({ const res = await api.home.getCompList({
...Object.assign(pageOptions, { cate: state.currentCategory?.id }), ...pageOptions,
cate: state.currentCategory?.id,
}) })
if (init) { if (init) {
state.list = res?.list state.list = res?.list
@ -125,29 +147,36 @@ export default defineComponent({
setTimeout(() => { setTimeout(() => {
state.loading = false state.loading = false
}, 100) }, 100)
} }
function action({ name, value }: any, item: any, index: number) { type TActionParam = {
name: string
value: string
}
function action({ name, value }: TActionParam, item: TGetCompListResult, index: number) {
switch (name) { switch (name) {
case 'del': case 'del':
delComp(item, index) delComp(item, index)
break break
} }
} }
function delComp({ id }: any, index: number) {
function delComp({ id }: TGetCompListResult, index: number) {
api.home.removeComp({ id }) api.home.removeComp({ id })
state.list.splice(index, 1) state.list.splice(index, 1)
} }
const selectTypes = (item: any) => { const selectTypes = (item: TGetCompListResult) => {
state.currentCategory = item state.currentCategory = item
load(true) load(true)
} }
const back = () => {
state.currentCategory = null
}
const dragStart = async (e: any, { id, width, height, cover }: any) => { const back = () => {
state.currentCategory = null
}
const dragStart = async (e: MouseEvent, { id, width, height, cover }: TGetCompListResult) => {
startPoint = { x: e.x, y: e.y } startPoint = { x: e.x, y: e.y }
// tempDetail = await api.home.getTempDetail({ id, type: 1 }) // tempDetail = await api.home.getTempDetail({ id, type: 1 })
// let finalWidth = tempDetail.width // let finalWidth = tempDetail.width
@ -160,9 +189,9 @@ export default defineComponent({
} else { } else {
store.commit('selectItem', { data: JSON.parse(tempDetail.data), type: 'text' }) store.commit('selectItem', { data: JSON.parse(tempDetail.data), type: 'text' })
} }
} }
const selectItem = async (item: any) => { const selectItem = async (item: TGetCompListResult) => {
if (isDrag) { if (isDrag) {
return return
} }
@ -170,11 +199,11 @@ export default defineComponent({
tempDetail = tempDetail || (await getCompDetail({ id: item.id, type: 1 })) tempDetail = tempDetail || (await getCompDetail({ id: item.id, type: 1 }))
// let group = JSON.parse(tempDetail.data) // let group = JSON.parse(tempDetail.data)
const group: any = await getComponentsData(tempDetail.data) const group: any = await getComponentsData(tempDetail.data)
let parent: any = { x: 0, y: 0 } let parent: Record<string, any> = { x: 0, y: 0 }
const { width: pW, height: pH } = store.getters.dPage const { width: pW, height: pH } = store.getters.dPage
Array.isArray(group) && Array.isArray(group) &&
group.forEach((element: any) => { group.forEach((element) => {
element.type === 'w-group' && (parent = element) element.type === 'w-group' && (parent = element)
}) })
if (parent.isContainer) { if (parent.isContainer) {
@ -189,9 +218,9 @@ export default defineComponent({
group.top = pH / 2 - group.fontSize / 2 group.top = pH / 2 - group.fontSize / 2
store.dispatch('addWidget', group) store.dispatch('addWidget', group)
} }
} }
function getCompDetail(params: any) { function getCompDetail(params: TGetTempDetail): Promise<TTempDetail> {
// //
return new Promise((resolve) => { return new Promise((resolve) => {
if (compsCache[params.id]) { if (compsCache[params.id]) {
@ -203,8 +232,7 @@ export default defineComponent({
}) })
} }
return { defineExpose({
...toRefs(state),
load, load,
action, action,
back, back,
@ -213,8 +241,6 @@ export default defineComponent({
mousemove, mousemove,
dragStart, dragStart,
selectItem, selectItem,
}
},
}) })
</script> </script>