Я пишу этот код, в котором мне нужно сопоставить массив с некоторыми элементами 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, но они не помогают.
Если folders.map
не является функцией, то folders
не является массивом. .map()
— функция для массивов. Что такое folders
, когда возникает ошибка? Чего вы ожидали? Почему?
@Энди, спасибо за ответ, и да, это устранило ошибку, но теперь она не показывает карту вообще... что можно изменить... Также console.info дает мне массив, который я создал во втором коде
Вместо: constfolders = useContext(PlaygroundContext); Вы должны написать: const {folders} = useContext(PlaygroundContext);
@JovanKecojevic нет, никаких изменений не происходит, проблема решилась, когда я изменил значение = {{folders}}, но теперь на странице должно быть несколько карточек, которые были в js-файле контейнера, который не приходит, я думаю, что данные не отображается на карте или что-то в этом роде, пожалуйста, помогите мне!
Кроме того, когда вы представили компонент <Folder />, вы передали карты: {folders.files} вместо {folder.files} (получите значение файлов из элемента, а не из массива).
@JovanKecojevic Я новичок в программировании, я не совсем понимаю, что вы имеете в виду, можете сказать мне, что я могу изменить, чтобы код работал?
Здесь есть несколько проблем, которые я рассмотрю, а в конце приведу «рабочий» пример данных.
{{folderTitle}}
должно быть просто {folderTitle}
.class
всегда должно быть className
.cards = {folders.files}
, когда должно быть cards = {folder.files}
(«папка» в единственном числе, поскольку вы выбираете переменную folder
из обратного вызова)value = {folders}
.map
на использование идентификаторов ваших объектов (см. раздел о подводных камнях здесь, чтобы узнать, почему).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>
value = {{folders}}
выглядит подозрительно... О чем этоconsole.info(folders);
вам говорит?