reactjs - 选择的反应元素总是相同的
问题描述
import React from 'react'
import { useState, useEffect } from 'react'
import axios from 'axios'
const Home = () => {
let [songs, setSongs] = useState([])
let x = document.getElementById('audioFile')
useEffect(() => {
// sample songs
setSongs([
{
id: 1,
title: 'Song 1',
genre: 'Instrumental'
},
{
id: 2,
title: 'Song 2',
genre: 'Western'
}
])
}, [])
const playSong = (e) => {
if(x){
x.play()
console.log(x) // in order to see which element is being clicked
} else {
x = document.getElementById('audioFile')
}
}
return (
<>
{
songs.map(song =>
(
<div className='music-controller' key={song.id}>
<h2>{song.title}</h2>
<p><small>{song.genre}</small></p>
<div className="controls">
<button onClick={playSong}>Play</button>
<audio id='audioFile'>
<source src={`http://localhost:8000/api/songs/audio/${song.id}`} /> // this remains the same when clicked
</audio>
</div>
))}
</>
)
}
export default Home
所以,我映射歌曲并通过他们的 id 给他们唯一的 url,但由于某种原因,当我点击第二首歌曲时,它是 src/currentSrc/innerHTML = http://localhost:8000/api/songs/audio/ 1 这是第一首歌曲的 src ,所以无论你点击哪首歌曲都会播放第一首歌曲,我该如何解决这个问题?
解决方案
所以我们可以id
给audio
tag 设置 unique ,然后通过 this 找到它id
。不完全是 React 风格,但可以这样做:
import React from "react";
import { useState, useEffect } from "react";
const Home = () => {
let [songs, setSongs] = useState([]);
useEffect(() => {
setSongs([
{
id: 1,
title: "Song 1",
genre: "Instrumental",
},
{
id: 2,
title: "Song 2",
genre: "Western",
},
]);
}, []);
const playSong = (id) => {
console.log(id);
const x = document.getElementById(id);
console.log(`x`, x);
x.play();
};
return (
<>
{songs.map(({ id, title, genre }) => (
<div className="music-controller" key={id}>
<h2>{title}</h2>
<p>
<small>{genre}</small>
</p>
<div className="controls">
<button onClick={() => playSong(id)}>Play</button>
<audio id={id}>
<source src={`http://localhost:8000/api/songs/audio/${id}`} />
</audio>
</div>
</div>
))}
</>
);
};
export default Home;
推荐阅读
- makefile - 如何实现依赖于 GNU Make 中类似命名文件的隐式规则?
- r - 在 Oracle 服务器上使用具有 IP 地址且没有 DSN 的新 odbc 包
- php - 从数据透视表 Laravel 访问表的所有信息
- sass - 如何使用父选择器作为 Sass 的后缀
- windows - 从服务执行 msg
- tensorflow - 在 TensorFlow 对象检测 API 中检测纪元结束
- javascript - 检查值是否包含在 firebase
- php - 具有多个选项的laravel下拉ajax
- swift - 故事板未链接到 ViewController.swift Xcode 中的@IBAction/Outlet
- python-3.x - Python:无法从父文件夹中的包导入(“尝试相对导入超出顶级包”)