#reactjs
#reactjs
Вопрос:
Как я могу добавить функцию поиска данных ниже (в идеале в другом компоненте, компоненте Nav)? Я пытался передавать данные через реквизиты и контекст и просто не могу заставить их работать. Мне нужно иметь возможность фильтровать данные по названию альбома, исполнителю или, возможно, другому атрибуту.
import React, { Component, useEffect, useState} from 'react'
import axios from 'axios';
import '../components/data.css';
function Data() {
const [Music, setMusic] = useState([], {});
useEffect(() => {
axios.get('https://itunes.apple.com/us/rss/topalbums/limit=100/json')
.then((data) => {
setMusic(data.data.feed.entry);
})
.catch((err) => console.log(err));
},[]);
return (
<div>
<article className="albums">
<ul className="album-items">
{Music.map(Music => {
const { id, name, label, title, artist, entry } = Music;
return (
<div className="album" >
<li className='album-list' key={id.attributes['im:id']}>
<h3 className='title'>Album Name: {Music['im:name'].label}</h3>
<img src={Music['im:image'][2].label} alt={Music['im:name'].label}/>
<h4 className='title'>Artist: {Music['im:artist'].label}</h4>
</li>
</div>
);
})}
</ul>
</article>
</div>
)
}
export default Data
Ответ №1:
Вот как вы можете искать данные альбома на основе album name
и artist name
.
Рабочее приложение: Stackblitz
import React, { Component, useEffect, useState } from "react";
import axios from "axios";
function Data() {
const [Music, setMusic] = useState([], {});
const [search, setSearch] = useState("");
useEffect(() => {
axios
.get("https://itunes.apple.com/us/rss/topalbums/limit=100/json")
.then(data => {
setMusic(data.data.feed.entry);
})
.catch(err => console.log(err));
}, []);
//======================================
const handleSearch = event => {
console.log(event.target.value);
setSearch(event.target.value.toLowerCase());
};
const filtered = Music.length
? Music.filter(
music =>
music["im:name"]["label"].toLowerCase().includes(search) ||
music["im:artist"]["label"].toLowerCase().includes(search)
)
: [];
//======================================
return (
<div>
<input onChange={handleSearch} placeHolder={"search title, artist"} />
<article className="albums">
<ul className="album-items">
{filtered.map(Music => {
const { id, name, label, title, artist, entry } = Music;
return (
<div className="album">
<li className="album-list" key={id.attributes["im:id"]}>
<h3 className="title">
Album Name: {Music["im:name"].label}
</h3>
<img
src={Music["im:image"][2].label}
alt={Music["im:name"].label}
/>
<h4 className="title">Artist: {Music["im:artist"].label}</h4>
</li>
</div>
);
})}
</ul>
</article>
</div>
);
}
export default Data;
Комментарии:
1. Спасибо! Есть идеи о том, как я могу передать это другому компоненту?
2. Это просто, просто передайте данные и функции через props. зависит от того, как вы фрагментируете свое дерево компонентов.
3. Поверьте мне, это непросто, я потратил дни, пытаясь понять, как это сделать. функция App() { return ( <> <GlobalStyles /> <Nav /> <Data /> </> ); }
4. Это просто, дело в том, что вы этого еще не знаете: D Напишите, что вы пробовали, я помогу вам это исправить.
5. должен ли я опубликовать это в другом вопросе?