vue3.2图片上传Demo搭建 3 请求数据

安装axios  npm i axios

<template>
    <div class="container py-3">
        <ActionsBar />
        <div class="d-flex justify-content-between  align-items-center  py-2">
            <h6 class="text-muted mb-0">文件</h6>
            <button class="rounded-button">
                <icon-arrow-up />
            </button>
        </div>
        <FilesList :files="files"/>

    </div>

</template>
<script setup>
import ActionsBar from '../components/ActionsBar.vue';
import FilesList from '../components/files/FilesList.vue';
import axios from 'axios'

import { ref,onMounted } from 'vue';
const files=ref([])

onMounted(
   async ()=>{
   const {data}=await axios.get("http://localhost:3031/files")
    console.log(data)
   console.log(typeof(data))
   files.value=data;
}
)

</script>

<style>
</style>

拆分组件 div>row

新建 components/files/FilesList.vue

<template>
    <div class="row">
   <FileItem v-for="(file,index) in files" :key="index" :file="file"/>

    </div>

</template>
 <script setup>
 import FileItem from './FileItem.vue'
//属性传值
defineProps({
    files: {
        type: Array,
        required: true,
    }
})


</script>
<style>
</style>

FileItem.vue

<template>
        <div class="col-md-3">
            <div class="card mb-4">
                <img 
                    v-if="file.url" class="file-thumb"  src="https://picsum.photos/id/1015/400/160" />
                <div v-else class="card-body text-center py-5">
                    <icon-type-common height="4em" width="4em" />
                </div>
                <div class="card-footer">
                    <div class="d-flex align-items-center">
                        <icon-type-commion />
                        <span class="file-name">{{ file.name }}</span>
                    </div>
                </div>
            </div>
        </div>
</template>
<script setup>
defineProps({
    file:{
        type:Object,
        required:true,
    }
});


</script>

动态显示渲染 图标 FileItem.vue 效验

<template>
        <div class="col-md-3">
            <div class="card mb-4">
                <img 
                    v-if="isValidImage" class="file-thumb"  src="https://picsum.photos/id/1015/400/160" />
                <div v-else class="card-body text-center py-5">
                   <component :is="iconFileType" height="4em" width="4em" />
                </div>
                <div class="card-footer">
                    <div class="d-flex align-items-center">
                       <component :is="iconFileType" />
                        <span class="file-name">{{ file.name }}</span>
                    </div>
                </div>
            </div>
        </div>
</template>
<script setup>
import {computed } from 'vue'
//动态显示图标
const iconFileType=computed(
    ()=>{
        const iconTypes={
            "image/jpeg":"icon-type-image",
            "image/png":"icon-type-image",
            "image/jpg":"icon-type-image",
            "application/zip":"icon-type-zip",
            "application/msword":"icon-type-doc",
            "application/vnd.ms-excel":"icon-type-excel",
            "application/pdf":"icon-type-pdf",
              "video/mp4":"icon-type-video",
        };
        return iconTypes[props.file.mimeType]?iconTypes[props.file.mimeType]:"icon-type-common"

    }
)
//图片URL 计算 
const isValidImage=computed(
    ()=>{
    const imageMimeTypes=["image/jpeg","image/png","image/jpg"]
    return imageMimeTypes.includes(props.file.mimeType) && !!props.file.url
    }
)

const props=defineProps({
    file:{
        type:Object,
        required:true,
    }
});


</script>

排序箭头切换

新增  SortToggler.vue

<template>
    <div class="container py-3">
        <ActionsBar />
        <div class="d-flex justify-content-between  align-items-center  py-2">
            <h6 class="text-muted mb-0">文件</h6>
           <SortToggler @sort-change="hanleSortChange($event)"/>
        </div>
        <FilesList :files="files"/>

    </div>

</template>
<script setup>
//http://localhost:3031/files?_sort=name&_order=desc 倒序
//http://localhost:3031/files?_sort=name&_order=asc 正序
import ActionsBar from '../components/ActionsBar.vue';
import FilesList from '../components/files/FilesList.vue';
import SortToggler from '../components/SortToggler.vue';
import axios from 'axios'

import { ref,onMounted,reactive,watchEffect,watch} from 'vue';
const files=ref([]);
//修改query值 实现倒序正序
const query =reactive({
    _sort:"name",
    _order:"asc",

})
//平常我们通过查询字符串的方式传参需要通过对字符串进行处理后才能使用。
//URLSearchParams()中有帮我们做处理的方法直接返回处理后的数据

// watchEffect(
//    async ()=>{
//        console.log(new URLSearchParams(query))
//    const {data}=await axios.get(`http://localhost:3031/files?${new URLSearchParams(query)} `);

//    files.value=data;
// }
// );

watch(()=>query._order,
   async ()=>{
       console.log(new URLSearchParams(query))
   const {data}=await axios.get(`http://localhost:3031/files?${new URLSearchParams(query)} `);

   files.value=data;
},{immediate:true}
);



const hanleSortChange =(payload)=>{
    console.log(payload);
    query._sort=payload.column;
    query._order=payload.order;
}


</script>

<style>
</style>

重写MyFiles.vue

<template>
    <div class="container py-3">
        <ActionsBar />
        <div class="d-flex justify-content-between  align-items-center  py-2">
            <h6 class="text-muted mb-0">文件</h6>
           <SortToggler @sort-change="hanleSortChange($event)"/>
        </div>
        <FilesList :files="files"/>

    </div>

</template>
<script setup>
//http://localhost:3031/files?_sort=name&_order=desc 倒序
//http://localhost:3031/files?_sort=name&_order=asc 正序
import ActionsBar from '../components/ActionsBar.vue';
import FilesList from '../components/files/FilesList.vue';
import SortToggler from '../components/SortToggler.vue';
import axios from 'axios'

import { ref,onMounted,reactive,watchEffect,watch} from 'vue';
const files=ref([]);
//修改query值 实现倒序正序
const query =reactive({
    _sort:"name",
    _order:"asc",

})
//平常我们通过查询字符串的方式传参需要通过对字符串进行处理后才能使用。
//URLSearchParams()中有帮我们做处理的方法直接返回处理后的数据

// watchEffect(
//    async ()=>{
//        console.log(new URLSearchParams(query))
//    const {data}=await axios.get(`http://localhost:3031/files?${new URLSearchParams(query)} `);

//    files.value=data;
// }
// );

watch(()=>query._order,
   async ()=>{
       console.log(new URLSearchParams(query))
   const {data}=await axios.get(`http://localhost:3031/files?${new URLSearchParams(query)} `);

   files.value=data;
},{immediate:true}
);



const hanleSortChange =(payload)=>{
    console.log(payload);
    query._sort=payload.column;
    query._order=payload.order;
}


</script>

<style>
</style>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值