Как перезагрузить массив данных в React

#javascript #html #reactjs

#javascript #HTML #reactjs

Вопрос:

я новичок в react, исходя из Angular. я хотел бы знать, как перезагрузить список массивов в React. я хочу отфильтровать содержимое getVilles, как в скрипте, при перезагрузке из place он отображает правильное значение, которое я ожидал, но в JSX он не перезагружается. Как это сделать правильно, пожалуйста.

Вот мой массив: Concert.js

 export const Concert = [
    {
            id: 1,
            imgSource: "...",
            artistName: "Artist Name",
            tourName: "Tour Name",
            date: "Date and hour",
            place: "Aix-en-provence",
            categorie : "Rock",
            tarifs:{
                to : "de",
                at : "a"
            }  
    },
    {
        id: 2,
        imgSource: "...",
        artistName: "Artist Name 2",
        tourName: "Tour Name",
        date: "Date and hour",
        place: "Aix-en-provence",
        categorie : "Elektro",
        tarifs:{
            to : "de",
            at : "a"
        }  
    },
    {
        id: 3,
        imgSource: "...",
        artistName: "Artist Name 2",
        tourName: "Tour Name",
        date: "Date and hour",
        place: "Dunkerque",
        categorie : "Elektro",
        tarifs:{
            to : "de",
            at : "a"
        }  
    },
    {
        id: 4,
        imgSource: "...",
        artistName: "Artist Name 2",
        tourName: "Tour Name",
        date: "Date and hour",
        place: "Cannes",
        categorie : "Elektro",
        tarifs:{
            to : "de",
            at : "a"
        }  
    },
    {
        id: 5,
        imgSource: "...",
        artistName: "Artist Name 2",
        tourName: "Tour Name",
        date: "Date and hour",
        place: "Cannes",
        categorie : "Elektro",
        tarifs:{
            to : "de",
            at : "a"
        }  
    },
    {
        id: 6,
        imgSource: "...",
        artistName: "Artist Name 6",
        tourName: "Tour Name",
        date: "Date and hour",
        place: "Cannes",
        categorie : "Elektro",
        tarifs:{
            to : "de",
            at : "a"
        }  
    },
    
];
 

Вот компонент card, который отображает все данные: concert.component.ts

 import { Link} from 'react-router-dom';


function ConcertComponent(props) {
    //console.log("Ville filter = ", props.ville);
    return <div className="card" style={{ width: '18rem' }}>
                    {/* <img src="..." className="card-img-top" alt="..."/> */}
                    <div className="card-body">
                        <h5 className="card-title">{ props.concertData.artistName }</h5>
                        <p className="card-text">{ props.concertData.categorie } </p>
                        <p className="card-text">{ props.concertData.place } </p>
                    
                        <Link to="#" className="btn btn-primary">Reserver</Link>
                    </div>
                </div>
}
export default ConcertComponent;
 

И вот страница, которая содержит все данные с фильтром: ProgrammationView.js

 export const getVilles = ["Aix-en-provence","Bourges","Cannes", "Dunkerque", "Echirolles"];
export const getCat = ["Pop", "Rock", "Elektro","Rap / Hip-Hop", "Soul / Funk", "Classique", "Dub / Reggae", "World"];
export const sortBy = ["Dates Croissante", "Dates décroissante", "A-Z", "Z-A"];

let getConcert = Concert;

const reloadFromPlace = (ville) =>
{   
        getConcert = Concert.filter(concert => concert.place === ville);
        console.log("Ville change", getConcert);

}

const ProgrammationView = () => {

        return (
            <div className="App container">
                <h1> Programmation </h1>
                <div className="filter row">
                    <div className="col-md-12">
                        <div className="place row justify-content-md-left">
                            <div className="col-md-1 title">
                                <h5>Lieu</h5> 
                            </div>
                            <div className="col-md-8 btn-group" role="group">
                                <button type="button" className="btn btn-light">Tous</button>
                                {
                                    getVilles.map(ville => // !!!! Normally here it should display the filter values of getVilles, but it doesnt. Why ??
                                        <button type="button" key={ville} onClick={()=> {reloadFromPlace(ville)}} className="btn btn-light">{ville}</button>
                                    )
                                }
                            </div>
                        </div>
                    </div>
                   
                </div>
                <div className="concert">
                    <div className="row listData justify-content-md-center">
                    {
                        getConcert.map(item => 
                            <React.Fragment key={item.id}>
                                <ConcertComponent concertData={item} key={item.id}></ConcertComponent>
                            </React.Fragment>
                            )
                    }
                    </div>
                    
                </div>
            </div>
        );
}
export default ProgrammationView;
 

Комментарии:

1. Вам нужны побочные эффекты для повторного рендеринга компонентов.

Ответ №1:

Чтобы повторно отобразить компонент при изменениях, вам нужно локальное состояние. Вы также можете использовать useEffect перехват, если концерты поступают из props . https://reactjs.org/docs/hooks-effect.html

Вот пример локального состояния (useState) Хук: рассмотрим ваш обработчик нажатия кнопки onClick:

 button type="button" key={ville} onClick={()=> {reloadFromPlace(ville)}} className="btn btn-light">{ville}</button>

// And your read Method should do following:
const reloadFromPlace = (ville) =>
{   
        getConcert = Concert.filter(concert => concert.place === ville);
        setConcert(getConcert); // This changes the local state, which will trigger re-render
        console.log("Ville change", concert);

}
 

Он правильно вызывает reloadFromPlace функцию. Но чтобы сообщить вашему компоненту, что что-то изменилось, компонент имеет локальное состояние, которое не изменяется автоматически.

Используйте useState метод для сохранения локального параметра состояния:

 const [concert, setConcert] = React.useState(Concert.slice(0, Concert.length); //add the Concert Array as a local state parameter

 

Затем измените свой JSX, чтобы использовать параметр локального состояния concert :

 <div className="concert">
  <div className="row listData justify-content-md-center">
    { concert.map(item =>
    <React.Fragment key={item.id}>
      <ConcertComponent concertData={item} key={item.id}></ConcertComponent>
    </React.Fragment>
    ) }
  </div>
</div>
 

Окончательное определение функции может выглядеть следующим образом:

 export const getVilles = ["Aix-en-provence", "Bourges", "Cannes", "Dunkerque", "Echirolles"];
export const getCat = ["Pop", "Rock", "Elektro", "Rap / Hip-Hop", "Soul / Funk", "Classique", "Dub / Reggae", "World"];
export const sortBy = ["Dates Croissante", "Dates décroissante", "A-Z", "Z-A"];

let getConcert = Concert;

const ProgrammationView = () => {
    const [concert, setConcert] = React.useState(Concert.slice(0, Concert.length); //add the Concert Array as a local state parameter

    const reloadFromPlace = (ville) => {
        getConcert = Concert.filter(concert => concert.place === ville);
        setConcert(getConcert); // This changes the local state, which will trigger re-render
        console.log("Ville change", getConcert);
    }

    return (
        <div className="App container">
            <h1> Programmation </h1>
            <div className="filter row">
                <div className="col-md-12">
                    <div className="place row justify-content-md-left">
                        <div className="col-md-1 title">
                            <h5>Lieu</h5>
                        </div>
                        <div className="col-md-8 btn-group" role="group">
                            <button type="button" className="btn btn-light">Tous</button>
                            {
                                getVilles.map(ville => // !!!! Normally here it should display the filter values of getVilles, but it doesnt. Why ??
                                    <button type="button" key={ville} onClick={() => { reloadFromPlace(ville) }} className="btn btn-light">{ville}</button>
                                )
                            }
                        </div>
                    </div>
                </div>

            </div>
            <div className="concert">
                <div className="row listData justify-content-md-center">
                    {
                        concert.map(item =>
                            <React.Fragment key={item.id}>
                                <ConcertComponent concertData={item} key={item.id}></ConcertComponent>
                            </React.Fragment>
                        )
                    }
                </div>

            </div>
        </div>
    );
}
export default ProgrammationView;
 

Комментарии:

1. Вот ссылка на документ с перехватом состояния: reactjs.org/docs/hooks-state.html