Не работает функция в reactJS

154
18 января 2020, 21:40
import React from 'react';
import classes from './navbar.module.css';
import {NavLink} from 'react-router-dom';
const Navbar = (props) => {
    let friendElem = props.state.friends;
    let i = 0;
    console.log(friendElem[i].name);
    let friendList = friendElem.map((friendElem,i) => {<li><div></div><span>{friendElem[i].name}</span></li>});
    return (
    <nav className={classes.nav}>
        <ul>
            <li>
                <div className={classes.home}></div>
                <NavLink to="/profile" className={classes.item} activeClassName={classes.activeLink} >Profile</NavLink>
            </li>
            <li>
                <div className={classes.dialogs}></div>
                <NavLink to="/dialogs" className={classes.item} activeClassName={classes.activeLink} >Dialogs</NavLink>
            </li>
            <li>
                <div className={classes.news}></div>
                <NavLink to="/news" className={classes.item} activeClassName={classes.activeLink} >News</NavLink>
            </li>
            <li>
                <div className={classes.music}></div>
                <NavLink to="/music" className={classes.item} activeClassName={classes.activeLink} >Music</NavLink>
            </li>
            <li>
                <div className={classes.settings}></div>
                <NavLink to="/settings" className={classes.item} activeClassName={classes.activeLink} >Settings</NavLink>
            </li>
        </ul>
        <div className={classes.friends}>
            <h1>Friends</h1>
            <ul className={classes.friendList}>
                {friendList}
            </ul>
        </div>
    </nav>);
};
    export default Navbar;

Выводит это:

Failed to compile

./src/components/navbar/navbar.js Line 9: Expected an assignment or function call and instead saw an expression no-unused-expressions

Search for the keywords to learn more about each error. This error occurred during the build time and cannot be dismissed.

Answer 1

Попробуйте заменить

let friendList = friendElem.map((friendElem,i) => {<li><div></div><span>{friendElem[i].name}</span></li>});

на

let friendList = friendElem.map((friendElem,i) => (<li><div></div><span>{friendElem[i].name}</span></li>));

Т.е. заменить фигурные скобки на круглые. Или вообще убрать фигурные скобки. Как больше нравится.

В таком случае колбэк из map начнёт возвращать значение и это исправит ошибку.

Answer 2

Ответ уже имеется, но можно предложить еще один вариант с небольшим пояснением. Как уже сказали, ошибка в следующем коде:

let friendList = friendElem.map(
  (friendElem, i) => {<li><div></div><span>{friendElem[i].name}</span></li>}
);

Дабы внести небольшую ясность, решил пролить свет на выражение стрелочной функции. А именно, когда вы пишете фигурные скобки {} после стрелки => то Вы говорите JS коду, что внутри фигурных скобок будет находиться тело функции, из которого вы должны вернуть значение в случае необходимости.

Тело стрелочной функции может иметь краткую (concise body) или блочную (block body) форму. Блочная форма не возвращает значение, необходимо явно вернуть значение.

То есть, можно просто дописать return:

let friendList = friendElem.map(
  (friendElem, i) => { return <li><div></div><span>{friendElem[i].name}</span></li>}
);

Либо заменить фигурные скобки {} на круглые скобки () и получится более короткая форма записи.

let friendList = friendElem.map(
  (friendElem, i) => (<li><div></div><span>{friendElem[i].name}</span></li>)
);

Дополнительная полезная информация по стрелочным функциям

Если единственным оператором в выражении стрелочной функции является return, можно удалить return и окружающие фигурные скобки:

elements.map(element => element.example);

Круглые скобки не обязательны для единственного параметра:

(singleParam) => { statements }
singleParam => { statements }

Функция без параметров нуждается в круглых скобках:

() => { return expression; } // () => expression 

Заключите тело объекта в круглые скобки, чтобы вернуть литеральное выражение объекта:

params => ({ foo: bar })

Не забывайте о том, что возвращаемые объектные строки используют сокращённый синтаксис {} - будут работать не так, как ожидается. Потому что код в скобках {} распознаётся как цепочка выражений, для примера:

() => { foo: 1 };  

Здесь foo трактуется как наименование, а не как ключ в объектной строке. Не забывайте оборачивать круглыми скобками объектные строки. В противном случае могут возникать ошибки и сайд эффекты.

Полезная ссылка для изучения: Стрелочные функции

READ ALSO
Помогите с ширеной меню на сайте

Помогите с ширеной меню на сайте

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

124
Получить идентификаторы объекта

Получить идентификаторы объекта

Есть объект audio-postКак получить все идентификаторы <li> этого объекта? Как на JS отфильтровать полученные идентификаторы до чисел?

113
Не добавлять не уникальный обьект в массив

Не добавлять не уникальный обьект в массив

Есть массив обьектов fruits, из которого, обьекты могут добавляются в массив selected

148
Почему mariadb Galera cluster работает медленно?

Почему mariadb Galera cluster работает медленно?

Имеется на данный момент 2 сервера с установленными mariadb В данный момент базы объединены в Galera cluster

168