首先创建一个 components 文件在里面进行组件的创建
下面是 vvideo组件的封装 也就是图片上传组件 只是我的命名是随便起的
<template>
<!-- 上传视频 -->
<view class="up-page">
<!--视频-->
<view class="show-box" v-for="(item1, index1) in videoList" :key="index1">
<video class="full" :src="item1"></video>
<view class="delect-icon" @tap="delectVideo(index1)">
<image class="full" :src="clearIcon" mode=""></image>
</view>
</view>
<view v-if="VideoOfImagesShow" @tap="chooseVideoImage" class="box-mode">
<image class="full" :src="selectfile" mode=""></image>
</view>
</view>
</template>
<script setup>
import { ref } from 'vue';
// 假设sourceType是一个外部定义或在其他地方已经处理的数组,这里我们直接使用
// 如果它是动态的,你可能需要将其也转换为ref
const sourceType = ref([['camera'], ['album'], ['camera', 'album']]);
// 创建响应式数据
const clearIcon = ref('../../static/xxx.png');
const selectfile = ref('../../static/jiahao.png');
const VideoOfImagesShow = ref(true);
const imageList = ref([]);
const videoList = ref([]);
const sourceTypeOptions = ref(['拍摄', '相册', '拍摄或相册']);
const sourceTypeIndex = ref(2);
const cameraList = ref([{
value: 'back',
name: '后置摄像头',
checked: 'true'
}, {
value: 'front',
name: '前置摄像头'
}]);
const cameraIndex = ref(0);
const maxCount = ref(9);
// 方法
function chooseVideoImage() {
uni.showActionSheet({
title: '选择上传类型',
itemList: ['视频'], // 注意:这里我添加了'图片'选项,你可能需要调整你的逻辑来处理它
success: res => {
if (res.tapIndex === 0) {
chooseVideo();
} else if (res.tapIndex === 1) {
// 假设你有一个chooseImages方法来处理图片选择
// chooseImages();
console.log('选择图片');
}
}
});
}
function chooseVideo() {
uni.chooseVideo({
maxDuration: 60,
count: maxCount.value,
camera: cameraList.value[cameraIndex.value].value,
sourceType: sourceType.value[sourceTypeIndex.value],
success: res => {
videoList.value = [...videoList.value, res.tempFilePath];
if (imageList.value.length + videoList.value.length === maxCount.value) {
VideoOfImagesShow.value = false;
}
console.log(videoList.value);
}
});
}
function delectVideo(index) {
uni.showModal({
title: '提示',
content: '是否要删除此视频',
success: res => {
if (res.confirm) {
videoList.value.splice(index, 1);
VideoOfImagesShow.value = !(imageList.value.length + videoList.value.length >= maxCount.value);
}
}
});
}
</script>
<style lang="scss">
/* 统一上传后显示的盒子宽高比 */
.box-mode {
width: 50vw;
height: 60vw;
border-radius: 8rpx;
overflow: hidden;
}
.full {
width: 100%;
height: 100%;
}
.up-page {
display: flex;
flex-wrap: wrap;
display: flex;
width: 100%;
.show-box:nth-child(3n){
margin-right: 0;
}
.show-box {
position: relative;
margin-bottom:4vw;
margin-right: 4vw;
@extend .box-mode;
.delect-icon {
height: 40rpx;
width: 40rpx;
position: absolute;
right: 0rpx;
top: 0rpx;
z-index: 1000;
}
}
}
</style>
直接在页面引用
<view class="videobox">
<view class="example-body">
<!-- <uni-file-picker limit="9" file-mediatype="video" title="最多选择9个视频"></uni-file-picker> -->
<div>选择视频-最多只能选择九个</div>
<vvideo></vvideo>
</view>
</view>
最终样子