Итак, следующая реализация отлично работает для чтения данных JSON и превращения их в визуализированные компоненты, пока я не попытаюсь добавить дочерние элементы. Потом выдает ошибку.
функция:
const catalogRenderer = (config) => {
if (typeof KeysToComponentMap[config.component] !== "undefined") {
return React.createElement(
KeysToComponentMap[config.component],
{
key: config.key,
title: config.title
},
{
config.children && config.children.map(c => catalogRenderer(c))
}
);
}
}
ошибка:
app.js:134 Uncaught Error: Module build failed (from ./node_modules/babel-loader/lib/index.js)
"...Scripts/CatalogRenderer.js: Unexpected token, expected "," (25:14)"
консоль:
},
24 | {
> 25 | config.children && config.children.map(c => catalogRenderer(c))
| ^
26 | }
27 | );
28 | }
Я использую React как часть электронного приложения, это длинная история обо всех движущихся частях, но все остальное до сих пор работало просто отлично. В редакторе, если я перейду к предыдущему { от загадочно нелюбимого . в строке 25 точка выделяется, как будто это должно каким-то образом закрыть скобку.
Я что-то не понимаю в синтаксисе здесь? То же самое произойдет, если я попытаюсь просто отобразить и отобразить дочерние элементы следующим образом:
{
config.children.map(c => catalogRenderer(c))
}
Я пытался заключить все утверждение в скобки, фигурные скобки, круглые скобки — независимо от того, что я делаю, кажется, что Babel ожидает запятую, но запятая, очевидно, не помогает. Любая идея, что я делаю неправильно?
eta: это объект JSON, из которого я пытаюсь выполнить рендеринг:
const catConfig = {
catalog: [
{
component: 'pen',
title: `B.C. Palmer`,
key: `B.C.PalmerPen`,
children: `A child string`
},
{
component: 'content',
key: `B.C.PalmerWorldList`,
children: [
{
component: 'world',
title: `Rismere`,
key: `RismereWorld`
},
{
component: 'content',
key: `RismereSeries`,
children: [
{
component: 'series',
title: `The Eidolon War`,
key: `TheEidolonWarSeries`
},
{
component: 'content',
key: `TheEidolonWarBooks`,
children: [
{
component: 'book',
title: `Magic's Heart`,
key: `MagicsHeartBook`
},
{
component: 'book',
title: `Magic's Fury`,
key: `MagicsFuryBook`
},
{
component: 'book',
title: `Magic's Grace`,
key: `MagicsGraceBook`
}
]
}
]
}
]
},
{
component: 'pen',
title: `Simon Strange`,
key: `SimonStrangePen`
}
]
}
Этот JSON будет генерироваться посредством вызова базы данных и записываться каждый раз при обновлении базы данных и обновлении состояния компонента «каталог».
Так, например, второй объект в массиве каталогов выше — это контейнер, который при щелчке по первому компоненту «ручка» становится видимым и показывает список компонентов «мира» (в данном случае только один). , функция успешно отображает только любые «родительские» компоненты — если я уберу фигурные скобки в строках 24 и 26, она просто пропустит их, но не выдаст ошибку.
Компоненты состоят из кнопок и div (контента). Кнопки, вероятно, станут элементом Link, когда я заработаю, но исходная версия была написана на ванильном javascript, я еще не реализовал маршрутизацию с каталогом. Итак, компонент пера, например:
import React from 'react'
export default penButton => {
return(
<button className = "catalogItem pen">
<img src = "src/icons/catPenName.png" className = "catalogIcon"/>
<p className = "contentLabel">{penButton.title}</p>
</button>
)
}
Является компонентом верхнего уровня и прекрасно отображается. Его следующий элемент (и следующий элемент любой кнопки, кроме книги) содержит:
import React from 'react'
export default contentList => {
return(
<div className = "contentList">
</div>
)
}
contentList — это просто div с классом contentList, который отвечает за видимость и анимацию. Должен ли я иметь место для ключа «дети» в JSON для заполнения дочерних элементов контента?
@Sysix, ты имеешь в виду саму ошибку? ...Scrips/CatalogRendere.js
? Вот только чтобы сократить путь, если так. Если нет, то я не уверен, что понимаю, что вы имеете в виду. Config — это объект массива json, переданный для сопоставления, он имеет ключ «дочерние элементы», который является массивом. config.title, например, отлично работает и передает заголовок компоненту.
да, в вашем примере компилятор не знает, что такое ключ, это config
, children
или map
?
Если вы хотите отобразить несколько дочерних элементов в свой реагирующий компонент, вам нужно передать каждый дочерний элемент как отдельный параметр.
См. этот ответ в качестве примера: как рендерить несколько дочерних элементов без JSX
поэтому ваше решение должно заключаться в использовании синтаксиса распространения.
вот пример:
const catalogRenderer = (config) => {
if (typeof KeysToComponentMap[config.component] !== "undefined") {
let childs = [];
if (config.children) {
childs = config.children.map(c => catalogRenderer(c));
}
return React.createElement(
KeysToComponentMap[config.component],
{
key: config.key,
title: config.title
},
...childs
);
}
}
Дочерние элементы для рендеринга определяются в файле JSON. Я не уверен, как использовать синтаксис распространения без определения списка дочерних элементов в каком-либо другом файле. Что я делаю, так это извлекаю каталог псевдонимов, сюжетных миров, сериалов и книг из базы данных в объект JSON. Я добавил вопрос с текущим тестовым объектом.
ваши children
- это array
, поэтому синтаксис должен работать. Мы не знаем, как ваш дочерний компонент принимает параметры. можете ли вы показать нам компоненты content
и world
в качестве примера
Таким образом, компонент содержимого представляет собой просто элемент div с прикрепленным стилем: ``` export default contentList => { return( <div className = "contentList"> </div> ) } ``` Мое понимание createElement() заключается в том, что третий аргумент определяет любых дочерних элементов, и я ожидаю, что он будет отображаться на ключ «дети» в JSON и выполнять итерацию по ним. Компонент мира не имеет непосредственных дочерних элементов. Это кнопка, которая принимает родственного элемента, в данном случае дочернего элемента содержимого.
Отредактировал вопрос, чтобы предоставить более отформатированные примеры пера и контента. Только контент будет когда-либо иметь дочерние элементы, эти дочерние элементы будут дополнительными вложенными кнопками/компонентами контента.
Ну, это было просто и немного глупо. Я обновил компонент контента до:
import React from 'react'
export default contentList => {
return(
<div className = "contentList">
{contentList.children} <---- added
</div>
)
}
В контенте не было места для детей. Очевидно.
вы определяете объект с помощью
{ ... }
, но не назначаете ключ своему значению