Babel ожидает "," там, где должно быть "."?

Итак, следующая реализация отлично работает для чтения данных 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 23.12.2020 00:50

@Sysix, ты имеешь в виду саму ошибку? ...Scrips/CatalogRendere.js? Вот только чтобы сократить путь, если так. Если нет, то я не уверен, что понимаю, что вы имеете в виду. Config — это объект массива json, переданный для сопоставления, он имеет ключ «дочерние элементы», который является массивом. config.title, например, отлично работает и передает заголовок компоненту.

BrianMagus 23.12.2020 00:55

да, в вашем примере компилятор не знает, что такое ключ, это config, children или map?

Sysix 23.12.2020 01:19
Поведение ключевого слова "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) для оценки ваших знаний,...
0
3
96
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

См. этот ответ в качестве примера: как рендерить несколько дочерних элементов без 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. Я добавил вопрос с текущим тестовым объектом.

BrianMagus 23.12.2020 01:17

ваши children - это array, поэтому синтаксис должен работать. Мы не знаем, как ваш дочерний компонент принимает параметры. можете ли вы показать нам компоненты content и world в качестве примера

Sysix 23.12.2020 01:26

Таким образом, компонент содержимого представляет собой просто элемент div с прикрепленным стилем: ``` export default contentList => { return( <div className = "contentList"> </div> ) } ``` Мое понимание createElement() заключается в том, что третий аргумент определяет любых дочерних элементов, и я ожидаю, что он будет отображаться на ключ «дети» в JSON и выполнять итерацию по ним. Компонент мира не имеет непосредственных дочерних элементов. Это кнопка, которая принимает родственного элемента, в данном случае дочернего элемента содержимого.

BrianMagus 23.12.2020 01:31

Отредактировал вопрос, чтобы предоставить более отформатированные примеры пера и контента. Только контент будет когда-либо иметь дочерние элементы, эти дочерние элементы будут дополнительными вложенными кнопками/компонентами контента.

BrianMagus 23.12.2020 01:38
Ответ принят как подходящий

Ну, это было просто и немного глупо. Я обновил компонент контента до:

import React from 'react'

export default contentList => {
  return(
    <div className = "contentList">
      {contentList.children} <---- added
    </div>
  )
}

В контенте не было места для детей. Очевидно.

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