Функция .map в реакции вызывает ошибку

Я пишу этот код, в котором мне нужно сопоставить массив с некоторыми элементами div...

есть первый код, который имеет отображение и пользовательский интерфейс

import { useContext } from "react";
import "./index.scss";
import { PlaygroundContext } from "../../../Providers/PlaygroundProvider";
// import { logo } from "./logo.png"
// import { vlogo } from "./vlogo.png";


const Folder = ({folderTitle, cards}) =>{
      <div className = "folder-container">
                 <div className = "folder-header">
                    <div className = "folder-header-item">
                    <span class = "material-symbols-outlined" style = {{color: "yellow"}}>{{folderTitle}}</span>
                    <span>{"Folder 1"}</span>
                     </div>
                    <div className = "folder-header-item">
                    <span class = "material-symbols-outlined">delete</span>
                    <span class = "material-symbols-outlined">edit</span>
                    <button>
                    <span class = "material-symbols-outlined">add</span>
                    <span>New File</span>
                    </button>
                    </div>
                </div>
                <div className = "cards-container">
                {
                  cards?.map((file, index) => {
                    return(  <div className = "card" key = {index}>
                      {/* Logo=> <span class = "material-symbols-outlined">article</span> */}
                      <img src = {require('./vlogo.png')} />
                        <div className = "title-container">
                            <span>{file?.title}</span>
                            <span>Language: {file?.language} </span>
                         </div>
                        <div style = {{display: 'flex', gap: '10px'}}>
                        <span class = "material-symbols-outlined">delete</span>
                        <span class = "material-symbols-outlined">edit</span>
                        </div>
                      
                    </div>)
                  })
                }
            </div>
          </div>
} 

export const RightComponent = () => {
  
  const folders = useContext(PlaygroundContext);
  console.info(folders); 


    return(
        <div className = "right-container">
            <div className = "header">
                Code Projects
                <button className = "add-folder">
                <span class = "material-symbols-outlined">add</span>
                    <span>New Folder</span>
                </button>
            </div>
            {
                  folders?.map((folder, index) => {
                    return<Folder folderTitle = {folder.title} key = {index} cards = {folders.files}/>;
                  })  
            }
        

        </div>
    );
}

а вот контейнер

import { createContext, useContext, useEffect, useState } from "react";
import {v4} from 'uuid';

export const PlaygroundContext = createContext();

const initialData = [
    {
        id:v4(),
        title: 'DSA',
        files: [
            {
                title: 'codewala',
                id:v4(),
                language: 'cpp',
                code:':Ldkidm'
            },
            {
                title: 'codewala2',
                id:v4(),
                language: 'cpp',
                code:':Ldkidmccccccc'
            }
            
        ]

    }
]

export const PlaygroundProvider = ({children}) =>{
    const [folders, setFolders] = useState(initialData);


    useEffect(() => {
        localStorage.setItem('data', JSON.stringify(folders))
    },[])
    const uniqId = v4();
    // console.info(uniqId);
    const obj = {name: 'divyansh'};
    return( 
//  <>{children}</>
    <PlaygroundContext.Provider value = {{folders}}> 
    {children}
</PlaygroundContext.Provider>
    );
};

Я не знаю почему, но отображение показывает ошибку

ошибка

folders.map is not a function
TypeError: folders.map is not a function
    at RightComponent (http://localhost:3000/static/js/bundle.js:428:78)
    at renderWithHooks (http://localhost:3000/static/js/bundle.js:24807:22)
    at mountIndeterminateComponent (http://localhost:3000/static/js/bundle.js:28778:17)
    at beginWork (http://localhost:3000/static/js/bundle.js:30081:20)
    at HTMLUnknownElement.callCallback (http://localhost:3000/static/js/bundle.js:15063:18)
    at Object.invokeGuardedCallbackDev (http://localhost:3000/static/js/bundle.js:15107:20)
    at invokeGuardedCallback (http://localhost:3000/static/js/bundle.js:15164:35)
    at beginWork$1 (http://localhost:3000/static/js/bundle.js:35062:11)
    at performUnitOfWork (http://localhost:3000/static/js/bundle.js:34310:16)
    at workLoopSync (http://localhost:3000/static/js/bundle.js:34233:9)

Я пытался преобразовать данные JSON в строку, но это не помогает. Я также видел другие вопросы о stackoverflow, но они не помогают.

value = {{folders}} выглядит подозрительно... О чем это console.info(folders); вам говорит?
Andy 01.07.2024 16:33

Если folders.map не является функцией, то folders не является массивом. .map() — функция для массивов. Что такое folders, когда возникает ошибка? Чего вы ожидали? Почему?

David 01.07.2024 16:34

@Энди, спасибо за ответ, и да, это устранило ошибку, но теперь она не показывает карту вообще... что можно изменить... Также console.info дает мне массив, который я создал во втором коде

Divyansh Pathak 01.07.2024 16:47

Вместо: constfolders = useContext(PlaygroundContext); Вы должны написать: const {folders} = useContext(PlaygroundContext);

JovanKecojevic 01.07.2024 16:54

@JovanKecojevic нет, никаких изменений не происходит, проблема решилась, когда я изменил значение = {{folders}}, но теперь на странице должно быть несколько карточек, которые были в js-файле контейнера, который не приходит, я думаю, что данные не отображается на карте или что-то в этом роде, пожалуйста, помогите мне!

Divyansh Pathak 01.07.2024 16:59

Кроме того, когда вы представили компонент <Folder />, вы передали карты: {folders.files} вместо {folder.files} (получите значение файлов из элемента, а не из массива).

JovanKecojevic 01.07.2024 17:09

@JovanKecojevic Я новичок в программировании, я не совсем понимаю, что вы имеете в виду, можете сказать мне, что я могу изменить, чтобы код работал?

Divyansh Pathak 01.07.2024 17:14
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
3
7
51
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Здесь есть несколько проблем, которые я рассмотрю, а в конце приведу «рабочий» пример данных.

  1. {{folderTitle}} должно быть просто {folderTitle}.
  2. class всегда должно быть className.
  3. В вызове компонента вы используете cards = {folders.files}, когда должно быть cards = {folder.files} («папка» в единственном числе, поскольку вы выбираете переменную folder из обратного вызова)
  4. Значение вашего провайдера должно быть value = {folders}.
  5. Я заменил индекс map на использование идентификаторов ваших объектов (см. раздел о подводных камнях здесь, чтобы узнать, почему).
  6. Несколько дочерних элементов должны быть обернуты в родительский элемент — именно поэтому в компоненте section есть дополнительный элемент Folder.

const { useState, useContext, createContext } = React;

const initialData = [
  {
    id:1,
    title: 'DSA',
    files: [
      {
        title: 'codewala',
        id:2,
        language: 'cpp',
        code:':Ldkidm'
      },
      {
        title: 'codewala2',
        id:3,
        language: 'cpp',
        code:':Ldkidmccccccc'
      }
    ]
  }
];

const PlaygroundContext = createContext();

function PlaygroundProvider({ children }) {
  const [folders, setFolders] = useState(initialData);

  return ( 
    <PlaygroundContext.Provider value = {folders}>
      {children}
    </PlaygroundContext.Provider>
  );
}


function Folder({ folderTitle, cards }) {
  return (
    <section>
      <div className = "folder-container">
        <div className = "folder-header">
          <div className = "folder-header-item">
            <span className = "material-symbols-outlined" style = {{color: "yellow"}}>{folderTitle}</span>
            <span>Folder 1</span>
          </div>
          <div className = "folder-header-item">
            <span className = "material-symbols-outlined">delete</span>
            <span className = "material-symbols-outlined">edit</span>
            <button>
              <span className = "material-symbols-outlined">add</span>
              <span>New File</span>
            </button>
          </div>
        </div>
      </div>
      <div className = "cards-container">
        {cards.map((file) => {
          return (
            <div className = "card" key = {file.id}>
              <div className = "title-container">
                <span>{file.title}</span>
                <span>Language: {file.language}</span>
              </div>
              <div style = {{display: 'flex', gap: '10px'}}>
                <span className = "material-symbols-outlined">delete</span>
                <span className = "material-symbols-outlined">edit</span>
              </div>
            </div>
          );
        })}
      </div>
    </section>
  );
}

function App() {

  const folders = useContext(PlaygroundContext);

  return (
    <main>
      {folders.map((folder) => {
        return (
          <Folder
            key = {folder.id}
            folderTitle = {folder.title}
            cards = {folder.files}
          />
        );
      })}
    </main>
  );

}

const node = document.getElementById('root');
const root = ReactDOM.createRoot(node);
const Root = () => (
  <PlaygroundProvider>
    <App />
  </PlaygroundProvider>
);
root.render(<Root />);
<script src = "https://cdnjs.cloudflare.com/ajax/libs/react/18.2.0/umd/react.development.min.js"></script>
<script src = "https://cdnjs.cloudflare.com/ajax/libs/react-dom/18.2.0/umd/react-dom.development.min.js"></script>
<div id = "root"></div>

Другие вопросы по теме