Почему компонент не отображается в реакции js?

Итак, я научился реагировать, но мне нужна помощь, чтобы попрактиковаться. это может быть долго, но ваша помощь будет оценена по достоинству. ни один из следующих кодов не работал, поэтому я просто хочу выяснить, что я делаю неправильно. Я устанавливаю следующий контекст, который представляет собой массив объектов

import React, {createContext, useState} from 'react';

export const Songlist = createContext()

const TheSongs = (props) => {
    const [songs, setSongs] = useState([
        {title: "deliverance", artist: "opeth", id: 0},
        {title: "civil war", artist: "guns n roses", id: 1},
        {title: "heaven and hell", artist: "black sabbath", id: 2},
        {title: "anesthetize", artist: "porcupine tree", id: 3}
    ])
    const songList = () =>{
        setSongs(songs.forEach(song =>{
            return(
                <div className="container" key={song.id}>
                    <h4>{song.title}</h4>
                    <h3>{song.artist}</h3>
                </div>
            )
        }))
    }
    return ( 
        <Songlist.Provider value={songs, songList}>
            {props.children}
        </Songlist.Provider>
     );
}

export default TheSongs;

Затем я попытался вызвать его в таком компоненте

import React, {useContext} from 'react';
import {Songlist} from '../contexts/TheWorld'

const SongListUI = () => {

    const {songList} = useContext(Songlist)


    return ( 
        <div className="hi">
            {songList}
        </div>
     );
}

export default SongListUI;

Ошибок не возникало, однако вообще ничего не отображалось, и div с именем «привет» ничего не содержал.

Затем я просто сохранил массив в контексте и снова вызвал его в компоненте с помощью контекста, но на этот раз я попробовал что-то другое, и это

import React, {useContext} from 'react';
import {Songlist} from '../contexts/TheWorld'

const SongListUI = () => {

    const {songs} = useContext(Songlist)

    const songList = () =>{
      songs.forEach(song =>{
        return(
            <div className="container" key={song.id}>
                <h4>{song.title}</h4>
                <h3>{song.artist}</h3>
            </div>
        )
    })
}

    return ( 
        <div className="hi">
            {songList}
        </div>
     );
}

export default SongListUI;

Я получил сообщение об ошибке, в котором говорится, что функции не разрешены как реагирующие дочерние элементы, и в div по-прежнему ничего не отображалось, поэтому я снова попробовал что-то другое, я применил цикл forEach внутри jsx вместо имени функции, и все же это не работа, и внутри div "привет" ничего не отображалось. поэтому я удалил весь контекст и использовал хук useState внутри самого компонента

import React, {useState} from 'react';

const SongListUI = () => {

    const [songs, setSongs] = useState([
        {title: "deliverance", artist: "opeth", id: 0},
        {title: "civil war", artist: "guns n roses", id: 1},
        {title: "heaven and hell", artist: "black sabbath", id: 2},
        {title: "anesthetize", artist: "porcupine tree", id: 3}
    ])

    const songlist = () =>{
        setSongs(songs.forEach(song =>{
            return(
                <div className="container" key={song.id}>
                    <h4>{song.title}</h4>
                    <h3>{song.artist}</h3>
                </div>
            )
        }))
    }


    return ( 
        <div className="hi">
            {songlist}
        </div>
     );
}

export default SongListUI;

не сработало из-за дочерней ошибки реакции, поэтому

import React, {useState} from 'react';

const SongListUI = () => {

    const [songs, setSongs] = useState([
        {title: "deliverance", artist: "opeth", id: 0},
        {title: "civil war", artist: "guns n roses", id: 1},
        {title: "heaven and hell", artist: "black sabbath", id: 2},
        {title: "anesthetize", artist: "porcupine tree", id: 3}
    ])


    return ( 
        <div className="hi">
            {
                songs.forEach(song =>{
                    return(
                        <div key={song.id}>
                            <h4>{song.title}</h4>
                            <h3>{song.artist}</h3>
                        </div>
                    )
                })
            }
        </div>
     );
}

export default SongListUI;

и до сих пор ничего не работает, поэтому я просто хочу знать, что я делаю неправильно...


person Ali Abdallah    schedule 06.02.2020    source источник
comment
Вы везде использовали forEach для возврата результата, forEach не возвращайте ничего, кроме undefined, вы должны использовать map, который вернет ваш результат.   -  person ravibagul91    schedule 06.02.2020


Ответы (1)


Возвращаемое значение forEach равно undefined. Можешь вместо этого попробовать свой последний пример с .map в своих песнях?

i.e.

songs.map((song) => <div key={song.id}><h4>{song.title}</h4><h3>{song.artist}</h3></div>)

person Villanelle    schedule 06.02.2020
comment
Потрясающе, спасибо. а как же контекст? что-то не так, или я должен также заменить forEach на карту? - person Ali Abdallah; 06.02.2020