mirror of
https://github.com/palxiao/poster-design.git
synced 2025-07-15 16:02:19 +08:00
feat: convert bgImgListWrap component to composition API
This commit is contained in:
parent
4f26e1652f
commit
810a437ad9
@ -64,6 +64,7 @@ export const getFontSub = (params: Type.Object = {}, extra: any = {}) => fetch('
|
|||||||
|
|
||||||
type TGetImageListParams = {
|
type TGetImageListParams = {
|
||||||
page?: number
|
page?: number
|
||||||
|
cate?: number
|
||||||
}
|
}
|
||||||
|
|
||||||
export type TGetImageListResult = {
|
export type TGetImageListResult = {
|
||||||
@ -73,6 +74,7 @@ export type TGetImageListResult = {
|
|||||||
url: string
|
url: string
|
||||||
user_id: number
|
user_id: number
|
||||||
id: string
|
id: string
|
||||||
|
thumb: string
|
||||||
}
|
}
|
||||||
|
|
||||||
// 图库列表
|
// 图库列表
|
||||||
|
@ -8,42 +8,64 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="wrap">
|
<div class="wrap">
|
||||||
<div class="color__box" :style="modelStyle.color">
|
<div class="color__box" :style="modelStyle.color">
|
||||||
<div v-for="c in colors" :key="c" :style="{ background: c }" class="color__item" @click="setBGcolor(c)"></div>
|
<div v-for="c in state.colors" :key="c" :style="{ background: c }" class="color__item" @click="setBGcolor(c)"></div>
|
||||||
</div>
|
</div>
|
||||||
<ul v-if="showList" v-infinite-scroll="loadData" class="infinite-list" :infinite-scroll-distance="150" style="overflow: auto">
|
<ul v-if="state.showList" v-infinite-scroll="loadData" class="infinite-list" :infinite-scroll-distance="150" style="overflow: auto">
|
||||||
<div class="list" :style="modelStyle.list">
|
<div class="list" :style="modelStyle.list">
|
||||||
<imageTip v-for="(item, i) in bgList" :key="i + 'i'" :detail="item">
|
<imageTip v-for="(item, i) in state.bgList" :key="i + 'i'" :detail="item">
|
||||||
<el-image class="list__img" :src="item.thumb" fit="cover" lazy loading="lazy" @click.stop="selectItem(item)" @dragstart="dragStart($event, item)"></el-image>
|
<el-image class="list__img" :src="item.thumb" fit="cover" lazy loading="lazy" @click.stop="selectItem(item)" @dragstart="dragStart($event, item)"></el-image>
|
||||||
</imageTip>
|
</imageTip>
|
||||||
</div>
|
</div>
|
||||||
<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, computed } from 'vue'
|
import { reactive, computed, defineProps, defineExpose } from 'vue'
|
||||||
import api from '@/api'
|
import api from '@/api'
|
||||||
import { mapActions, useStore } from 'vuex'
|
import { useStore } from 'vuex'
|
||||||
|
import { ElImage } from 'element-plus'
|
||||||
|
import { TGetImageListResult } from '@/api/material';
|
||||||
|
|
||||||
export default defineComponent({
|
type TCommonPanelData = {
|
||||||
props: {
|
color: string
|
||||||
model: {
|
list: string
|
||||||
default: 'widgetPanel'
|
|
||||||
}
|
}
|
||||||
},
|
|
||||||
setup(props) {
|
type TTmpModalData = {
|
||||||
|
widgetPanel: TCommonPanelData
|
||||||
|
stylePanel: TCommonPanelData
|
||||||
|
}
|
||||||
|
|
||||||
|
type TProps = {
|
||||||
|
model: 'widgetPanel'
|
||||||
|
}
|
||||||
|
|
||||||
|
type TState = {
|
||||||
|
loading: boolean
|
||||||
|
loadDone: boolean
|
||||||
|
bgList: TGetImageListResult[]
|
||||||
|
showList: boolean
|
||||||
|
colors: string[]
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
const { model } = defineProps<TProps>()
|
||||||
|
|
||||||
|
|
||||||
const store = useStore()
|
const store = useStore()
|
||||||
const state = reactive({
|
const state = reactive<TState>({
|
||||||
loading: false,
|
loading: false,
|
||||||
loadDone: false,
|
loadDone: false,
|
||||||
bgList: [],
|
bgList: [],
|
||||||
showList: true,
|
showList: true,
|
||||||
colors: ['#000000ff', '#999999ff', '#CCCCCCff', '#FFFFFFff', '#E65353ff', '#FFD835ff', '#70BC59ff', '#607AF4ff', '#976BEEff'],
|
colors: ['#000000ff', '#999999ff', '#CCCCCCff', '#FFFFFFff', '#E65353ff', '#FFD835ff', '#70BC59ff', '#607AF4ff', '#976BEEff'],
|
||||||
})
|
})
|
||||||
|
|
||||||
// 临时用于改变样式
|
// 临时用于改变样式
|
||||||
const models: any = {
|
const models: TTmpModalData = {
|
||||||
widgetPanel: {
|
widgetPanel: {
|
||||||
color: 'padding: 1.2rem 1rem',
|
color: 'padding: 1.2rem 1rem',
|
||||||
list: 'grid-template-columns: auto auto auto;padding: 0 1rem;',
|
list: 'grid-template-columns: auto auto auto;padding: 0 1rem;',
|
||||||
@ -53,7 +75,8 @@ export default defineComponent({
|
|||||||
list: 'grid-template-columns: repeat(3, 76px);',
|
list: 'grid-template-columns: repeat(3, 76px);',
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
const modelStyle = computed(() => models[props.model])
|
|
||||||
|
const modelStyle = computed(() => models[model])
|
||||||
|
|
||||||
const pageOptions = { page: 0, pageSize: 20 }
|
const pageOptions = { page: 0, pageSize: 20 }
|
||||||
|
|
||||||
@ -76,7 +99,7 @@ export default defineComponent({
|
|||||||
pageOptions.page = 1
|
pageOptions.page = 1
|
||||||
}
|
}
|
||||||
|
|
||||||
await api.material.getImagesList({ cate: 16, page: pageOptions.page }).then(({ list }: any) => {
|
await api.material.getImagesList({ cate: 16, page: pageOptions.page }).then(({ list }) => {
|
||||||
if (list.length > 0) {
|
if (list.length > 0) {
|
||||||
state.bgList.push(...list)
|
state.bgList.push(...list)
|
||||||
} else {
|
} else {
|
||||||
@ -104,36 +127,47 @@ export default defineComponent({
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
return {
|
// ...mapActions(['selectWidget', 'updatePageData']),
|
||||||
...toRefs(state),
|
async function selectItem(item: TGetImageListResult) {
|
||||||
load,
|
|
||||||
setBGcolor,
|
|
||||||
loadData,
|
|
||||||
modelStyle
|
|
||||||
}
|
|
||||||
},
|
|
||||||
methods: {
|
|
||||||
...mapActions(['selectWidget', 'updatePageData']),
|
|
||||||
async selectItem(item: any) {
|
|
||||||
// this.$store.commit('setShowMoveable', false) // 清理掉上一次的选择
|
// this.$store.commit('setShowMoveable', false) // 清理掉上一次的选择
|
||||||
this.updatePageData({
|
store.dispatch('updatePageData', {
|
||||||
key: 'backgroundTransform',
|
key: 'backgroundTransform',
|
||||||
value: {},
|
value: {},
|
||||||
})
|
})
|
||||||
this.updatePageData({
|
store.dispatch('updatePageData', {
|
||||||
key: 'backgroundImage',
|
key: 'backgroundImage',
|
||||||
value: item.url,
|
value: item.url,
|
||||||
pushHistory: true,
|
pushHistory: true,
|
||||||
})
|
})
|
||||||
this.selectWidget({
|
store.dispatch('selectWidget', {
|
||||||
uuid: '-1',
|
uuid: '-1',
|
||||||
})
|
})
|
||||||
},
|
// this.updatePageData({
|
||||||
dragStart(e: any, item: any) {
|
// key: 'backgroundTransform',
|
||||||
this.$store.commit('selectItem', { data: {}, type: 'bg' })
|
// value: {},
|
||||||
},
|
// })
|
||||||
},
|
// this.updatePageData({
|
||||||
|
// key: 'backgroundImage',
|
||||||
|
// value: item.url,
|
||||||
|
// pushHistory: true,
|
||||||
|
// })
|
||||||
|
// this.selectWidget({
|
||||||
|
// uuid: '-1',
|
||||||
|
// })
|
||||||
|
}
|
||||||
|
|
||||||
|
function dragStart(_: MouseEvent, _item: TGetImageListResult) {
|
||||||
|
store.commit('selectItem', { data: {}, type: 'bg' })
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
defineExpose({
|
||||||
|
load,
|
||||||
|
setBGcolor,
|
||||||
|
loadData,
|
||||||
|
modelStyle
|
||||||
})
|
})
|
||||||
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="less" scoped>
|
<style lang="less" scoped>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user