Uniapp 之renderjs解決swiper+多個video卡頓問題

一、效果圖

image

二、示例代碼

test.vue

<template><view style="" :style="{height: windowHeight+'px'}"><swiper class="video-swiper" vertical @change="swiperChange" :current="current" @animationfinish="swiperFinish"><swiper-item v-for="(item,index) in list" :key="index" style="position: relative;"><MyVideo :fistId="list[0].itemid" :item="item" :isPlay="!isShow && videoId == item.itemid" @onEnded="endVideo(item.itemid)" /><view v-if="isShow"style="z-index:99;position: absolute;width:100%;height:100%;top:0;left:0;display:flex; justify-content:center; align-items:center;"><image @click.stop="plays(item.itemid,index)" src="@/static/bofang.png"style="width: 40px;height: 40px;"></image></view><view class="abs video-info-box"><view class="video-info"><view class="f-title c-base ">@樣子公司</view><view class="f-paragraph c-base mt-md">{{item.title}}</view></view></view></swiper-item></swiper></view>
</template><script>import MyVideo from '@/components/my-video/my-video.vue'export default {components: {MyVideo},data() {return {windowHeight: uni.getSystemInfoSync().windowHeight,list: [{itemid: 1,url: '/file/upload/202508/01/094826971.mp4',title: '視頻一'},{itemid: 2,url: '/file/upload/202508/01/090055511.mp4',title: '視頻二'},{itemid: 3,url: '/file/upload/202508/01/090409611.mp4',title: '視頻三'}],videoContexts: [],isShow: false,videoIndex: null,videoId: null,current: 0,first_id: 0}},onLoad() {},methods: {swiperChange(e) {console.log(e)let {current} = e.detailthis.current = currentif (current != this.videoIndex) {this.endVideo(this.videoId, 'swiper')}},swiperFinish(e) {console.log(e)let {current} = e.detaillet item = this.list[current]console.log(item)this.plays(item.itemid, current)},plays(id, index) {// #ifndef APPlet videoContext = uni.createVideoContext(`Video${id}`, this);videoContext.play()// #endifthis.videoId = idthis.videoIndex = indexthis.isShow = falsethis.autoplaySwiper = false},//當video播放結束得時候 進行初始化,恢復輪播endVideo(id, type) {// #ifndef APPlet videoContext = uni.createVideoContext(`Video${id}`, this);videoContext.pause()// #endifthis.isShow = truethis.videoIndex = nullthis.videoId = nullthis.autoplaySwiper = trueif (!type) {setTimeout(v => {this.current++}, 500)}},}}
</script><style>.video-swiper {width: 100%;height: 100%}.video_item {height: 100%;width: 100%;}.video-info-box {width: 500rpx;height: auto;display: inline-block;position: absolute;left: 32rpx;bottom: 100rpx;z-index: 99999999;}
</style>

my-video.vue

<template><view class="myVideo_view" v-html="innerHtml" :fid="fistId" :change:fid="MyVideo.setFid" :id="id" :change:id="MyVideo.updateId" :isPlay="isPlay" :change:isPlay="MyVideo.handelPlay" ></view>
</template><script>export default {props: {item: {type: Object,default: () => ({}),},// 添加控制播放和暫停的propisPlay: {type: Boolean,default: true,},fistId: {type: Number,default: 0}},computed: {id() {return this.item.itemid}},data() {return {innerHtml: '',};},created() {this.initVideoHtml();},methods: {isHttpOrHttps(url) {const regex = /^(http|https):\/\//;return regex.test(url);},initVideoHtml() {let { url } = this.itemlet bool = this.isHttpOrHttps(url)if(!bool) {url = plus.io.convertLocalFileSystemURL(url);}this.innerHtml = `<video class="swiper-video" id="Video${this.item.itemid}" src="${url}" width="100%" height="100%" style="object-fit: contain;" autoplay/>`;},// 通知父組件播放完成ended() {this.$emit('onEnded')}},};
</script>
<script module="MyVideo" lang="renderjs">export default {data() {return {id: '',fid: '',video: null,}},computed: {videoId() {return 'Video' + this.id}},mounted() {this.initVideoElement()},methods: {initVideoElement() {let video = document.getElementById(this.videoId)this.video = videovideo.addEventListener('loadedmetadata', () => {this.video.play().then(res => {//第一個視頻不用暫停if(this.fid==this.id) {return false}this.video.pause()})})video.addEventListener('ended', () => {this.video.pause()this.$ownerInstance.callMethod('ended')})},handelPlay(isPlay) {if(!this.video) returnisPlay ? this.video.play() : this.video.pause()},updateId(id) {this.id = id},setFid(fid) {this.fid = fid}}}
</script>
<style scoped>.myVideo_view {height: 100%;border-radius: 10rpx;overflow: hidden;background-color: #000;}
</style>
翻譯圖片
中文
英文

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/919412.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/919412.shtml
英文地址,請注明出處:http://en.pswp.cn/news/919412.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

設計模式之【快速通道模式】,享受VIP的待遇

文章目錄一、快速通道模式簡介1、簡介2、適用場景二、示例1、JDK源碼&#xff1a;ArrayList構造方法2、String.intern()方法3、緩存系統設計&#xff08;典型&#xff09;三、注意事項1、核心設計原則2、避坑指南參考資料一、快速通道模式簡介 1、簡介 快速通道模式是一種基于…

NineData云原生智能數據管理平臺新功能發布|2025年7月版

本月發布 23 項更新&#xff0c;其中重點發布 8 項、功能優化 15 項。重點發布數據庫 DevOps - 非表對象調試新增存儲過程、函數、包的調試功能&#xff0c;支持對象編譯、斷點設置、執行控制&#xff08;continue/step into/step over&#xff09;、變量調試等全流程操作。數據…

APM32芯得 EP.29 | 基于APM32F103的USB鍵盤與虛擬串口復合設備配置詳解

如遇開發技術問題&#xff0c;歡迎前往開發者社區&#xff0c;極海技術團隊將在線為您解答~ 極海官方開發者社區?https://community.geehy.cn/ 《APM32芯得》系列內容為用戶使用APM32系列產品的經驗總結&#xff0c;均轉載自21ic論壇極海半導體專區&#xff0c;全文未作任何修…

css過渡屬性

前言 該屬性用于元素各種 “改變” 后的過渡效果動畫&#xff0c;包括但不限于顏色、寬高、縮放等。 如下圖所示&#xff0c;使用過渡屬性便可輕松完成。 示例代碼 您可以直接復制運行&#xff0c;查看效果。 <div>demo</div>div {width:100px; height:100px;/* …

云計算核心技術之云存儲技術

一、云存儲技術1.1、云存儲是什么從狹義上來說&#xff0c;云存儲是指通過虛擬化、分布式技術、集群應用、網格技術、負載均衡等技術&#xff0c;將網絡中大量的存儲設備通過軟件集合起來高效協同工作&#xff0c;共同對外提供低成本、高擴展性的數據存儲服務。從廣義上來講&am…

在Ubuntu上安裝并使用Vue2的基本教程

我也準備要嘗試一些前端開發了&#xff01;發現網上有些教程寫得挺好&#xff0c;但是還是有點老&#xff08;并且有點錯誤&#xff09;&#xff0c;所以這里更新一下&#xff1a; 主要參考了這篇教程&#xff1a;Vue2——1. 安裝教程_vue2 cdn-CSDN博客 并且使用NPM方式進行…

任務十九 打包部署

一、本地打包部署 首先在自己的電腦上,下載一個nginx nginx: download 之后再vscode中,進行打包 輸入命令 npm run build 打包過后,會在項目的根目錄下,生成一個dist的文件夾

《飛算Java AI使用教程:從安裝入門到實踐項目》

前引&#xff1a;在當今人工智能技術飛速發展的時代&#xff0c;Java作為企業級開發的主流語言&#xff0c;正與AI技術深度融合。飛算Java AI是一款強大的工具集&#xff0c;旨在幫助開發者輕松構建和部署智能應用&#xff0c;涵蓋機器學習、自然語言處理等核心功能。本教程將帶…

NestJS 依賴注入方式全解

一、基礎注入方式 1. 構造函數注入&#xff08;Constructor Injection&#xff09; 適用場景&#xff1a;模塊間依賴傳遞&#xff0c;服務初始化時必須存在的依賴 實現方式&#xff1a;通過構造函數參數聲明依賴&#xff0c;NestJS 自動解析并注入 Injectable() class UserServ…

完整源碼+技術文檔!基于Hadoop+Spark的鮑魚生理特征大數據分析系統免費分享

&#x1f393; 作者&#xff1a;計算機畢設小月哥 | 軟件開發專家 &#x1f5a5;? 簡介&#xff1a;8年計算機軟件程序開發經驗。精通Java、Python、微信小程序、安卓、大數據、PHP、.NET|C#、Golang等技術棧。 &#x1f6e0;? 專業服務 &#x1f6e0;? 需求定制化開發源碼提…

云原生俱樂部-shell知識點歸納(1)

shell的內容也挺多的&#xff0c;雖然云原生課程主要是講grep、sed、awk三劍客&#xff0c;但是還有結合循環結構&#xff0c;判斷語句&#xff0c;以及函數等內容。還是有點復雜的&#xff0c;并且我對shell的掌握并不多&#xff0c;所以寫的可能并不全。當然&#xff0c;如果…

設計模式(四)——責任鏈模式

1. 責任鏈模式的定義 責任鏈模式&#xff08;Chain of Responsibility&#xff0c;簡稱 CoR&#xff0c;也叫職責鏈模式&#xff09;是一種行為型設計模式&#xff0c;允許一個請求在一系列處理器&#xff08;handlers&#xff09;中傳遞。每個處理器可以選擇自己處理該請求&am…

MyBatis-Plus基礎篇詳解

文章目錄前言一、簡單介紹MyBatis-Plus1.1 特性1.2 架構二、SpringBoot集成MyBatis-Plus2.1 項目搭建2.2 導入所需依賴2.3 配置application.yml2.4 創建實體類2.5 創建Mapper接口2.6 啟動類配置三、DQL操作3.1 基礎查詢3.2 QueryWrapper查詢3.3 LambdaQueryWrapper查詢3.4 分頁…

基于W55MH32Q-EVB 實現 HTTP 服務器配置 OLED 滾動顯示信息

目錄 1 前言 2 項目環境 2.1 硬件準備 2.2 軟件環境 3.硬件連接和方案 3.1 硬件連接 3.2 方案圖示 4.例程修改 1 前言 HTTP&#xff08;超文本傳輸協議&#xff0c;HyperText Transfer Protocol&#xff09;是一種用于分布式、協作式、超媒體信息系統的應用層協議&#xff0c; …

YggJS RLogin暗黑霓虹主題登錄注冊頁面 版本:v0.1.1

項目介紹 yggjs_rlogin 是一個專注于 React 登錄/注冊頁面的組件庫。本文檔介紹“暗黑霓虹”主題&#xff1a;#111 暗色背景 青藍霓虹描邊輸入框 賽博朋克光效按鈕。 安裝說明 安裝&#xff1a;pnpm add yggjs_rlogin react react-dom使用&#xff1a;從 yggjs_rlogin 引入組…

大數據畢業設計選題推薦:護膚品店鋪運營數據可視化分析系統詳解

&#x1f34a;作者&#xff1a;計算機畢設匠心工作室 &#x1f34a;簡介&#xff1a;畢業后就一直專業從事計算機軟件程序開發&#xff0c;至今也有8年工作經驗。擅長Java、Python、微信小程序、安卓、大數據、PHP、.NET|C#、Golang等。 擅長&#xff1a;按照需求定制化開發項目…

【github-action 如何為github action設置secrets/environment】

Using secrets in GitHub Actions 在 GitHub Actions 中使用密鑰 Learn how to create secrets at the repository, environment, and organization levels for GitHub Actions workflows. 學習如何在倉庫、環境和組織級別為 GitHub Actions 工作流創建密鑰。 Creating secre…

寶塔面板Docker安裝n8n漢化中文

一、Docker安裝N8N 安裝配置默認即可&#xff0c;如果端口已被使用&#xff0c;可以自行更改 當狀態為運行中時&#xff0c;就可以點擊端口&#xff1a;訪問N8N 填寫完信息后&#xff0c;點擊下一步&#xff08;郵箱要能接收郵件&#xff1a;接收密鑰&#xff09; 點開始 點擊發…

F003疫情傳染病數據可視化vue+flask+mysql

編號:F003 文章結尾有CSDN官方提供的學長的聯系方式&#xff01;&#xff01; 歡迎關注B站 ? vue flask 前后端分離架構 ? 實現中國地圖、柱狀圖、折線圖、水地圖、環圖等多種圖形的echarts可視化分析 視頻 vueflask爬蟲 新冠疫情大屏實現 python 可視化分析項目源碼1 系統…

plantsimulation知識點25.8.19 工件不在RGV中心怎么辦?

如果出現這種情況&#xff0c;工件不在RGV的中心該怎么處理。首先說一下出現這種情況的原因。因為模擬的是兩臺RGV共同托舉一個工件移動&#xff0c;實際上RGV控制的代碼還是寫在一條軌道的傳感器控制代碼中。另一臺RGV只是從動的&#xff0c;工件也是在其中任意一臺RGV上&…