@Speakermen

Почему ended отрабатывает несколько раз?

Доброго времени суток уважаемые разработчики в компоненте Control.js addEventListener отрабатывает с событием ended несколько раз и перескакивает через несколько треков( Только почему по клику всё нормально отрабатывает

player.addEventListener('ended', () => dispatch(nextAudio()));


Использовал redux toolkit
redux-1024x608-1.jpg

Компоненты не зависимы друг от друга берут из stora, а не из параметров функции

stackblitz react player

Ну и в Reducerе баг из того что логика в playAudio зашла в тупик initialState id = 1 и срабатывает Reducer pauseAudio state.track.id == action.payload при первом запуске если не нажат не один элемент
//slices/playlistSlice.js

import { createSlice } from '@reduxjs/toolkit';
import TrackService from './../services/TrackService.js';

const initialState = {
  id: 1,
  trackService: new TrackService(),
  tracks: new TrackService().findAll(),
  track: new TrackService().findOne(0),
  flag: false,
  audio: new Audio(),
};

const playlistSlice = createSlice({
  name: 'playlist',
  initialState,
  reducers: {
    playAudio: (state, action) => {
      console.log(state.id, state.track.id, action.payload);
      if (state.track.id !== action.payload) {
        state.flag = true;
        state.id = action.payload;
        state.track = state.trackService.findOne(state.id - 1);
        state.audio.src = state.track.audioPath;
        state.audio.play();
        console.log('playAudio');
      } else {
        playlistSlice.caseReducers.pauseAudio(state);
      }
    },
    pauseAudio: (state) => {
      if (state.flag) {
        state.flag = false;
        state.audio.pause();
        console.log('pauseAudio');
      } else {
        state.flag = true;
        state.audio.play();
        console.log('playAudio pause');
      }
    },
    nextAudio: (state) => {
      state.id++;

      if (state.id > state.tracks.length) {
        state.id = 1;
      }

      playlistSlice.caseReducers.playAudio(state, { payload: state.id });
      console.log('nextAudio');
    },
    prevAudio: (state) => {
      state.id--;

      if (state.id < 1) {
        state.id = state.tracks.length;
      }

      playlistSlice.caseReducers.playAudio(state, { payload: state.id });
      console.log('prevAudio');
    },
  },
});

export const { playAudio, pauseAudio, nextAudio, prevAudio } =
  playlistSlice.actions;
export default playlistSlice.reducer;
  • Вопрос задан
  • 83 просмотра
Решения вопроса 1
Kentavr16
@Kentavr16
long cold winter
Проблема в том что ты добавляешь прослушиватель просто в коде и нигде его не очищаешь. Если учесть что компонент может рендериться несколько раз, особенно в режиме разработки, то и прослушивателей может навеситься несколько. Используй для этого хук эффекта , в котором укажи что при размонтировании компонента нужно удалить слушатель события.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы