mirror of
https://github.com/palxiao/poster-design.git
synced 2025-07-15 16:02:19 +08:00
feat: convert CompListWrap component to composition API
This commit is contained in:
parent
e977df58e8
commit
6ee1ab78ed
@ -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')
|
||||||
|
|
||||||
// 保存作品
|
// 保存作品
|
||||||
|
@ -15,50 +15,64 @@
|
|||||||
</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'
|
||||||
|
|
||||||
|
type TState = {
|
||||||
|
loading: boolean
|
||||||
|
loadDone: boolean
|
||||||
|
list: TGetCompListResult[]
|
||||||
|
searchValue: string
|
||||||
|
currentCategory: TGetCompListResult | null
|
||||||
|
types: []
|
||||||
|
showList: TGetCompListResult[][]
|
||||||
|
}
|
||||||
|
|
||||||
export default defineComponent({
|
|
||||||
components: {},
|
|
||||||
setup(props) {
|
|
||||||
// 拖拽效果相关
|
// 拖拽效果相关
|
||||||
const dragHelper = new DragHelper()
|
const dragHelper = new DragHelper()
|
||||||
let isDrag = false
|
let isDrag = false
|
||||||
let startPoint = { x: 99999, y: 99999 }
|
let startPoint = { x: 99999, y: 99999 }
|
||||||
let tempDetail: any = null
|
let tempDetail: TTempDetail | null = null
|
||||||
// 缓存组件用以减少接口请求的次数
|
// 缓存组件用以减少接口请求的次数
|
||||||
const compsCache: any = {}
|
const compsCache: any = {}
|
||||||
const state = reactive({
|
const state = reactive<TState>({
|
||||||
loading: false,
|
loading: false,
|
||||||
loadDone: false,
|
loadDone: false,
|
||||||
list: [],
|
list: [],
|
||||||
@ -92,7 +106,8 @@ export default defineComponent({
|
|||||||
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
|
||||||
@ -114,7 +129,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
|
||||||
@ -127,27 +143,34 @@ export default defineComponent({
|
|||||||
}, 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 = () => {
|
const back = () => {
|
||||||
state.currentCategory = null
|
state.currentCategory = null
|
||||||
}
|
}
|
||||||
|
|
||||||
const dragStart = async (e: any, { id, width, height, cover }: any) => {
|
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
|
||||||
@ -191,7 +214,7 @@ export default defineComponent({
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
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 +226,7 @@ export default defineComponent({
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
return {
|
defineExpose({
|
||||||
...toRefs(state),
|
|
||||||
load,
|
load,
|
||||||
action,
|
action,
|
||||||
back,
|
back,
|
||||||
@ -213,8 +235,6 @@ export default defineComponent({
|
|||||||
mousemove,
|
mousemove,
|
||||||
dragStart,
|
dragStart,
|
||||||
selectItem,
|
selectItem,
|
||||||
}
|
|
||||||
},
|
|
||||||
})
|
})
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user