Вот рабочие коды и коробка: https://codesandbox.io/s/6l3wpo3xyr
Мне кажется, что работает правильно и с понятным кодом. Это можно сделать немного лучше, но для начала все может быть хорошо.
Я могу отредактировать ответ, чтобы добавить детали, если это необходимо.
Ответ на комментарий о Object.entries
В качестве переменной экземпляра для компонента, который я объявил:
steps = {
"Select campaign settings": Step1,
"Create an ad group": Step2,
"Create an ad": Step3
};
Это просто обычный объект Javascript. В ES6 класс Object
имеет метод entry, который, принимая объект, подобный этому, возвращает массив, массив ключей и значений данного объекта. В этом случае:
Object.entries(steps)
[
[ "Select campaign settings", Step1 ],
[ "Create an ad group", Step2 ],
[ "Create an ad", Step3 ]
]
Имея такую структуру, проще отобразить пары ключ-значение с помощью map
. Первый аргумент метода map
класса Array
является текущим элементом массива. Использовав Object.entries
ранее, элемент является единственным массивом, который представляет пару ключей:
Object.entries(steps)[0] // [ "Select campaign settings", Step1 ]
Ответ на комментарий о .map(([ label, CustomStep ]) => ...
Это просто обычное использование метода Array.map
. Как правило, это позволяет преобразовать массив в другой, используя функцию отображения. Функция, которая берет элемент массива и возвращает другую вещь.
В этом случае элементом массива для цикла является пара ключ-значение, предоставляемая вызовом Object.entries
. С помощью ES6 массивы, как и объекты, могут быть деструктурированы, и вот что там происходит:
// you may see something like this around:
.map(element => {
// let's say that element is an array, you'll use it like:
// element[0] is the first element
// element[1] is the second one
})
// with ES6 that array can be destructed on-the-fly this way, which is totally equivalent
.map(([ label, CustomStep ]) => {
// label is the index 0 (element[0])
// CustomStep is the index 1 (element[1])
})