#reactjs
#reactjs
Вопрос:
Я пытаюсь выяснить наилучшие способы создания функциональных компонентов, которые генерируют простой html — возьмите это nav-links.js например, файл:
export const navLinks = [
{
name: "home",
href: "/"
},
{
name: "subs",
href: "/subs"
}
];
HTML мой компонент пытается генерировать только циклы по каждой ссылке, чтобы сгенерировать неупорядоченный список с тегами списка и тегами внутри.
Проблема возникает в этом nav-menu.js файл, в котором выходные данные представляют собой всего лишь два <ul></ul>
тега, внутри которых ничего нет:
import React from "react";
import {
BrowserRouter as Router,
Switch,
Route,
Link
} from "react-router-dom";
import {navLinks} from "../util/nav-links";
export const NavMenu = () => {
const lis = () => (
{navLinks}.map(link => {
return (
<li>
<Link to={link.href} key={link.href}>{link.name}</Link>
</li>
)
})
)
return (
<div id="navbar">
<ul>
{lis}
</ul>
</div>
)
}
Почему в вышеупомянутом компоненте ничего не отображается? Я написал ниже еще несколько кодов, которые решают эту проблему, хотя мне интересно, можно ли ее переработать лучше:
export const NavMenu = () => {
return (
<div id="navbar">
<ul>
{navLinks.map(link => {
return (
<li>
<Link to={link.href} key={link.href}>{link.name}</Link>
</li>
)
})}
</ul>
</div>
)
}
Почему первая попытка не сработала, и как ее можно было бы лучше переработать? Спасибо за любую помощь здесь
Комментарии:
1. Что произойдет, если вместо того, чтобы
{lis}
использовать{lis()}
или переименовать его вLis
(заглавная буква) и попробовать<Lis />
?2. Это не сработало с первого раза, потому что вы пытались использовать
Array.prototype.map()
onObject
(поскольку вы разрушили свойnavLInks
массив вnavLinks
переменную, когда вы это сделалиimport {navLinks} from "../util/nav-links"
, а затем создали объект,{navLinks: [{name: 'home', href: '/'},{name: 'subs', href: '/subs'}]}
когда вы заключилиnavLinks
в фигурные скобки). Итак, ваша первая попытка, скорее всего, выдала ошибку. Он будет работать так, как ожидалось, если вы пропустите фигурные скобки:navLInks.map(..
. Хотя я бы предпочел второй подход.
Ответ №1:
В вашем первом примере не сработало, потому что вы передали const list = () => {..}
как анонимную функцию, не вызывая ее, внутри фигурных скобок в части JSX вашего кода.
Если вы назвали его как {list()}
:
return (
<div id="navbar">
<ul>
{lis()}
</ul>
</div>
)
Таким образом, это, вероятно, сработало бы.
Или вы могли бы сохранить список внутри переменной, подобной этой:
const lis = navLinks.map(link => {
return (
<li>
<Link to={link.href} key={link.href}>{link.name}</Link>
</li>
)
}
)
или также подобный этому:
const lis = navLinks.map(link => (
<li>
<Link to={link.href} key={link.href}>{link.name}</Link>
</li>
)
)
)