В настоящее время я изучаю js с помощью udemy и видеоуроков, и у меня было много успехов и много проблем. Я работаю над тем, чтобы использовать кнопку для воспроизведения аудиофайла в формате mp3. Прямо сейчас он работает и играет, но я хотел бы поместить его в какую-нибудь переменную/объект, чтобы я мог добавить метод паузы. Однако всякий раз, когда я пытаюсь сохранить его, я получаю эту ошибку не при сборке, а когда нажимаю кнопку:
Невозможно прочитать свойства null (чтение «играть») Ошибка типа: невозможно прочитать свойства null (чтение «играть»)
Это мой код, который работает:
импортировать звук из «./Pics/Senorita.mp3»
function main({ }) {
const AudioClick = () => {
new Audio(sound).play();
};
return (
<div style = {{ display: "flex", justifyContent: "center", 'fontSize': '40px'}}>
<BsFillPlayCircleFill onClick = {AudioClick}></BsFillPlayCircleFill>
</div>
);
}
export default main;
Как вы можете видеть здесь, хотя это и работает, он просто запускает новый аудиофайл, поэтому я не могу снова получить к нему доступ. Если я нажму кнопку несколько раз, они просто перекроются.
Это одно из многих решений, которые я пробовал: пусть x = document.getElementById(звук); х.играть();
но большинство вещей, которые я пытаюсь сделать, дают одну и ту же ошибку. Это заставляет меня думать, что это проблема с источником, но я не уверен, потому что первый метод, как показано, работает хорошо. Любые советы или предложения будут с благодарностью приняты. Я новичок в публикации сообщений о переполнении стека, поэтому надеюсь, что этот вопрос написан правильно, не стесняйтесь оставлять конструктивные отзывы.
Спасибо всем за вашу помощь!
Предоставьте достаточно кода, чтобы другие могли лучше понять или воспроизвести проблему.
Он импортирован, над кодом показано, что я использовал.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Если вы хотите присвоить свой аудиоэлемент переменной в React, вам, вероятно, потребуется добавить хуки в ваше приложение: в данном случае хуки useState и useEffect.
Вы можете найти много информации о крючках в Интернете, поэтому я сосредоточусь на решении вашей проблемы. (В любом случае, если вы хотите узнать больше о хуках, начните здесь: https://legacy.reactjs.org/docs/hooks-state.html).
Давайте начнем с объявления крючка setState, который мы будем использовать для установки вашей переменной.
const [audioElement, setAudioElement] = useState();
Чтобы убедиться, что этот код запускается только один раз и у вас есть только один экземпляр вашего аудио-элемента, мы устанавливаем его значение внутри хука useEffect с пустым массивом в качестве зависимости.
useEffect(() => {
setAudioElement(new Audio('https://file-examples.com/storage/fe91f66a2a65f065f9ba741/2017/11/file_example_MP3_700KB.mp3'));
}, []);
(Я нашел источник аудио на этом сайте, просто чтобы убедиться, что у нас есть работающий файл https://file-examples.com/index.php/sample-audio-files/sample-mp3-download/).
На этом этапе мы можем добавить два метода, которые будут запускать и останавливать звук.
// start
const AudioStartClick = () => {
audioElement.play();
};
// stop
const AudioStopClick = () => {
audioElement.pause();
};
Как объясняется здесь https://developer.mozilla.org/en-US/docs/Web/API/HTMLAudioElement/Audio, мы не на 100 % уверены, что аудиоэлемент может воспроизводиться сразу, поэтому мы можем добавьте прослушиватель событий, чтобы убедиться, что мы можем использовать этот элемент.
Для этого нам нужно добавить новый крючок useState для управления логическим значением и новый крючок useEffect для прослушивания события.
const [canPlay, setCanPlay] = useState(false);
useEffect(() => {
audioElement?.addEventListener("canplaythrough", (event) => {
setCanPlay(true);
});
}, [audioElement]);
Теперь, когда у нас есть эта информация, нам просто нужно добавить пару строк, чтобы убедиться, что мы не вызываем play и не останавливаемся на элементе, который не способен воспроизводиться.
// start
const AudioStartClick = () => {
if (!canPlay) return;
audioElement.play();
};
// stop
const AudioStopClick = () => {
if (!canPlay) return;
audioElement.pause();
};
Наконец, вот полный пример кода:
import React, { useState, useEffect } from 'react';
export function App(props) {
const [audioElement, setAudioElement] = useState();
const [canPlay, setCanPlay] = useState(false);
useEffect(() => {
setAudioElement(new Audio('https://file-examples.com/storage/fe91f66a2a65f065f9ba741/2017/11/file_example_MP3_700KB.mp3'));
}, []);
// https://developer.mozilla.org/en-US/docs/Web/API/HTMLAudioElement/Audio
useEffect(() => {
audioElement?.addEventListener("canplaythrough", (event) => {
setCanPlay(true);
});
}, [audioElement]);
const AudioStartClick = () => {
if (!canPlay) return;
audioElement.play();
};
const AudioStopClick = () => {
if (!canPlay) return;
audioElement.pause();
};
return (
<div className='App'>
<button onClick = {AudioStartClick}> Start </button>
<button onClick = {AudioStopClick}> Stop </button>
</div>
);
}
Большое спасибо! Это было очень полезно и именно то, что я искал. я очень ценю это
@MayaTomarchio Рад, что это помогло, пожалуйста, примите ответ и проголосуйте, если можете.
к сожалению, я слишком новичок, чтобы голосовать, но принял!
на что ссылается
soundв вашей основной функции? Я не вижу, чтобы это было объявлено где-либо или в качестве опоры.