在前端开发中,实现音乐播放功能是一个常见需求。今天,我们将深入探讨如何在原生 HTML 和 React 中实现音乐播放,并结合代码进行详细解析。😎
1. 项目概述 📋
我们的项目主要围绕音乐播放功能展开,包含了原生 HTML 实现和 React 实现两种方式。项目的核心目标是让用户能够自主控制音乐的播放,避免自动播放带来的尴尬。📵
2. 原生 HTML 实现 📄
这是一个html,用于实现基本的音乐播放功能。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Audio 音乐</title>
</head>
<body>
<audio src="./sounds/snare.wav"></audio>
<button id="play">播放</button>
<button onclick="alert('你还好吗?')">更原始的事件,如初恋般</button>
<script>
const oAudio = document.querySelector('audio');
document.getElementById("play").addEventListener('click',() => {
oAudio.play();
})
</script>
</body>
</html>
代码解析:
<audio>标签:用于嵌入音频文件,src属性指定了音频文件的路径。这里使用了相对路径./sounds/snare.wav,表示音频文件位于当前目录下的sounds文件夹中。🎵<button>标签:创建了两个按钮,一个用于播放音乐,另一个用于触发alert弹窗。- JavaScript 代码:使用
document.querySelector方法获取audio元素,使用document.getElementById方法获取播放按钮元素。然后,使用addEventListener方法为播放按钮添加点击事件监听器,当点击按钮时,调用oAudio.play()方法播放音乐。🎶
注意事项:
- 在原生 HTML 中,使用
document.querySelector和addEventListener等 DOM API 来操作元素和绑定事件,这种方式在处理复杂的交互时可能会变得繁琐。🧐
3. React 实现⚛️
这是一个 React 组件,用于实现音乐播放功能。
import { useState,useRef } from 'react'
import './App.css'
function App() {
// 火山引擎tts 配置文件
const { VITE_TOKEN, VITE_APP_ID, VITE_CLUSTER_ID } = import.meta.env
// 代码的可读性高于一切
const [prompt,setPrompt] = useState('大家好,我是蔡徐坤');
// react use 开头 ref hook 可以获取 DOM 元素
const audioPlayer = useRef(null)
console.log(audioPlayer,'/////');
const playMusic = () => {
// console.log(audioPlayer,'+++');
console.log('play Music');
audioPlayer.current.play()
}
const generateAudio = () => {
// 女性
// const voiceName = "zh_female_shuangkuaisisi_moon_bigtts";
const voiceName = "zh_male_sunwukong_mars_bigtts"
const endpoint = "/tts/api/v1/tts" // tts api llm 服务接口地址
const headers = {
'Content-Type':'application/json',
Authorization:`Bearer;${VITE_TOKEN}`
}
}
return (
<div className='container'>
<div>
<label>Prompt</label>
<button onClick={generateAudio}>生成并播放</button>
<textarea
className='input'
value={prompt}
onChange={(e) => setPrompt(e.target.value)}
>
</textarea>
</div>
<audio ref={audioPlayer} src="/sounds/snare.wav"></audio>
{/* <button onClick={playMusic}>播放</button> */}
</div>
)
}
export default App
代码解析:
- 状态管理:使用
useState钩子来管理prompt状态,prompt初始值为 “大家好,我是蔡徐坤”。这样可以方便地更新和使用这个状态。🧠 - 获取 DOM 元素:使用
useRef钩子来获取audio元素的引用。useRef返回一个可变的ref对象,其.current属性初始化为传入的参数(这里是null)。通过ref={audioPlayer}将ref对象绑定到audio元素上,就可以在playMusic函数中通过audioPlayer.current来访问该元素并调用play()方法播放音乐。🤙 - 事件处理:使用
onClick事件处理程序来处理按钮点击事件。在generateAudio函数中,定义了语音合成的相关配置,如语音名称、API 接口地址和请求头。虽然该函数目前没有完整实现语音合成和播放的逻辑,但为后续扩展提供了基础。💪
4. 总结 📝
通过对比原生 HTML 和 React 实现音乐播放的方式,我们可以看到 React 在处理复杂交互和状态管理方面具有明显的优势。使用 useRef 钩子可以方便地获取 DOM 元素,避免了使用原生 DOM API 的繁琐。同时,React 的事件机制也提高了代码的可读性和可维护性。🎉
希望这篇文章能帮助你更好地理解前端音乐播放的实现方式,让我们一起在前端开发的道路上越走越远!🚀