Что может быть причиной этой ошибки: Невозможно прочитать свойства null (чтение «play») TypeError: Невозможно прочитать свойства null (чтение «play»)?

В настоящее время я изучаю 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(звук); х.играть();

но большинство вещей, которые я пытаюсь сделать, дают одну и ту же ошибку. Это заставляет меня думать, что это проблема с источником, но я не уверен, потому что первый метод, как показано, работает хорошо. Любые советы или предложения будут с благодарностью приняты. Я новичок в публикации сообщений о переполнении стека, поэтому надеюсь, что этот вопрос написан правильно, не стесняйтесь оставлять конструктивные отзывы.

Спасибо всем за вашу помощь!

на что ссылается sound в вашей основной функции? Я не вижу, чтобы это было объявлено где-либо или в качестве опоры.

Ravi Yadav 14.03.2024 08:43

Предоставьте достаточно кода, чтобы другие могли лучше понять или воспроизвести проблему.

Community 14.03.2024 10:50

Он импортирован, над кодом показано, что я использовал.

Maya 14.03.2024 18:39
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
3
172
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Если вы хотите присвоить свой аудиоэлемент переменной в 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>
  );
}

Большое спасибо! Это было очень полезно и именно то, что я искал. я очень ценю это

Maya 16.03.2024 01:53

@MayaTomarchio Рад, что это помогло, пожалуйста, примите ответ и проголосуйте, если можете.

Giorgio Tempesta 17.03.2024 21:46

к сожалению, я слишком новичок, чтобы голосовать, но принял!

Maya 18.03.2024 06:37

Другие вопросы по теме