Как я могу добавить функцию поиска данных ниже (в идеале в другом компоненте)

#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. должен ли я опубликовать это в другом вопросе?