hookehuyr

✨ feat: 用户反馈操作新增防抖

1 <template> 1 <template>
2 <div class="video-wrapper"> 2 <div class="video-wrapper">
3 - <div class="video-div" :id="'mui-player-' + item.id"></div> 3 + <div :id="'mui-player-' + item.id" class="video-div" />
4 <div class="normal-module"> 4 <div class="normal-module">
5 <div class="video-bar"> 5 <div class="video-bar">
6 <van-row> 6 <van-row>
...@@ -25,11 +25,9 @@ ...@@ -25,11 +25,9 @@
25 </van-col> 25 </van-col>
26 </van-row> 26 </van-row>
27 </div> 27 </div>
28 - <slot name="bookDetailSub"></slot> 28 + <slot name="bookDetailSub" />
29 - </div>
30 - <div class="audit-module">
31 -
32 </div> 29 </div>
30 + <div class="audit-module" />
33 </div> 31 </div>
34 </template> 32 </template>
35 33
...@@ -38,22 +36,26 @@ ...@@ -38,22 +36,26 @@
38 * 视频组件通用模块 36 * 视频组件通用模块
39 */ 37 */
40 import { icon_dianzan1, icon_dianzan2, icon_liuyan, icon_avatar } from '@/utils/generateIcons.js' 38 import { icon_dianzan1, icon_dianzan2, icon_liuyan, icon_avatar } from '@/utils/generateIcons.js'
41 -import { ref, reactive, onMounted } from 'vue' 39 +import { ref, onMounted } from 'vue'
42 import { _, Toast } from '@/utils/generatePackage.js' 40 import { _, Toast } from '@/utils/generatePackage.js'
43 -import { useRoute, useRouter } from 'vue-router' 41 +import { useRouter } from 'vue-router'
44 import 'mui-player/dist/mui-player.min.css' 42 import 'mui-player/dist/mui-player.min.css'
45 import MuiPlayer from 'mui-player' 43 import MuiPlayer from 'mui-player'
46 import { prodActionAPI, prodInfoAPI } from '@/api/C/prod.js' 44 import { prodActionAPI, prodInfoAPI } from '@/api/C/prod.js'
47 45
48 -const $route = useRoute();
49 const $router = useRouter(); 46 const $router = useRouter();
50 -
51 const props = defineProps({ 47 const props = defineProps({
52 - item: Object 48 + item: {
49 + type: Object,
50 + }
53 }) 51 })
54 52
55 // 作品用户操作 53 // 作品用户操作
56 -async function handleAction(action_type, prod_id) { 54 +/**
55 + * 两个请求顺序执行,处理直接写在请求函数里面似乎有点问题,get请求数据似乎无法顺利渲染显示
56 + */
57 +// FIXME:防抖处理
58 +const handleAction = _.debounce(async (action_type, prod_id) => {
57 const { msg } = await prodActionAPI({ action_type, prod_id }); 59 const { msg } = await prodActionAPI({ action_type, prod_id });
58 if (msg === `${action_type}-add-OK`) { // 动作操作成功 60 if (msg === `${action_type}-add-OK`) { // 动作操作成功
59 if (action_type === 'favor') { 61 if (action_type === 'favor') {
...@@ -62,15 +64,16 @@ async function handleAction(action_type, prod_id) { ...@@ -62,15 +64,16 @@ async function handleAction(action_type, prod_id) {
62 if (action_type === 'like') { 64 if (action_type === 'like') {
63 Toast('点赞成功'); 65 Toast('点赞成功');
64 } 66 }
65 - } else { // 取消操作 67 + } else { // 取消操作,播放动作不提示
66 if (action_type !== 'play') { 68 if (action_type !== 'play') {
67 Toast('取消成功'); 69 Toast('取消成功');
68 } 70 }
69 } 71 }
70 getProductDetail(action_type, prod_id); // 更新信息 72 getProductDetail(action_type, prod_id); // 更新信息
71 -} 73 +}, 500, { leading: true, trailing: false });
74 +
72 // 查询作品详情 75 // 查询作品详情
73 -async function getProductDetail(action_type, prod_id) { 76 +const getProductDetail = async (action_type, prod_id) => {
74 const { data } = await prodInfoAPI({ prod_id }); 77 const { data } = await prodInfoAPI({ prod_id });
75 // 更新详情显示 78 // 更新详情显示
76 detail.value[`is_${action_type}`] = data[`is_${action_type}`]; 79 detail.value[`is_${action_type}`] = data[`is_${action_type}`];
...@@ -95,7 +98,7 @@ onMounted(() => { ...@@ -95,7 +98,7 @@ onMounted(() => {
95 detail.value = _.cloneDeep(props.item); 98 detail.value = _.cloneDeep(props.item);
96 const video = mp.video(); 99 const video = mp.video();
97 // 监听原生video事件 100 // 监听原生video事件
98 - video && video.addEventListener('play', function (event) { 101 + video && video.addEventListener('play', function () {
99 handleAction('play', props.item.id) 102 handleAction('play', props.item.id)
100 }); 103 });
101 }); 104 });
......