Реакция: добавление / запуск активного класса к сопоставленным элементам

#javascript #reactjs #onclick

#javascript #reactjs #onclick

Вопрос:

У меня есть этот компонент, и я сопоставляю свой массив, чтобы создать 10 элементов навигации. Как мне добавить метод onClick, чтобы добавить активный класс к выбранному элементу. Есть ли здесь лучшая практика с помощью хуков / более нового способа реагирования? На самом деле я не ищу здесь решение для маршрутизатора React.

Я пропустил, создав их <a> и <span> против <ul> amp; <li> ? Имеет ли это значение?

 import React from "react";

var sections = [
  "arts",
  "business",
  "health",
  "home",
  "movies",
  "opinion",
  "politics",
  "science",
  "sports",
  "technology",
];

export default function Masthead() {
  return (
    <div className="masthead">
      {sections.map((section, idx) => {
        return (
          <a href={section} key={idx}>
            <span>{section}</span>
          </a>
        );
      })}
    </div>
  );
}
 

Ответ №1:

Я бы сделал что-то вроде этого:

 import React from "react";

var sections = [
  "arts",
  "business",
  "health",
  "home",
  "movies",
  "opinion",
  "politics",
  "science",
  "sports",
  "technology",
];

export default function Masthead() {
 const [cur_section, setCurSection] = React.useState('')

  return (
    <div className="masthead">
      {sections.map((section, idx) => {
        return (
          <a href={"#" section} key={idx} 
             onClick={() => setCurSection(section)}
             className={section === cur_section ? "active": ""}
           >
            <span>{section}</span>
          </a>
        );
      })}
    </div>
  );
}
 

Вот как вы могли бы добавить active класс к элементу onClick. a Конечно, проблема с тегами заключается в том, что, я полагаю, они приведут вас на другую страницу. Так что это нужно каким-то образом решить.

Обратите внимание, как я добавил {"#" section} в href. Это для того, чтобы мы могли оставаться на текущей странице.

Вот общая идея: https://codesandbox.io/s/blissful-bush-7n9vf?file=/src/App.js

Комментарии:

1. какой компромисс заключается в том, чтобы просто переписать его как <ul>/<li> . Я не против это сделать. Что-нибудь, что я теряю? Я специально не выбирал <a> .

2. @Christian Я предположил, что в этом нет никаких недостатков, если это соответствует потребностям вашего приложения. Я помню, что ваш сайт React Times переводил пользователя на новую страницу, поэтому вам придется как-то это выяснить, если вы a удалите теги, потому что li не будет ссылаться на другую страницу без дополнительного JS-кода.

3. да, еще раз спасибо, я хочу, чтобы URL добавлял новое название раздела «/ мнение» или «/ спорт», но мне не нравится, что он перезагружает страницу. Я не смог реализовать проблему с маршрутизатором React. Мне пришлось бы вернуться к началу и медленно добавить его обратно, чтобы убедиться, что он ничего не сломает. но да, похоже, что ul / li не позволит мне добавить новую страницу, даже с частью «# section». Я могу придерживаться <a>/ <span>просто чтобы иметь возможность заставить его работать так, как я хочу. это забавный проект, а не ра бота. Поэтому я бы предпочел, чтобы это работало так, как я х отел. Спасибо!

4. и благодаря вашему методу «# section» я теперь не получаю обновление страницы, но оно не повторяется с помощью api. этот бит сломал «const getCurrentPage = () => { const url = новый URL(окно. location.href); const page = url.pathname.split(«/»).pop(); вернуть страницу? страница: «главная»; };»

5. Вы должны разбить проблему с маршрутизатором react, с которой вы столкнулись, на жевательные кусочки и начать публиковать их здесь. Сообщество проведет вас через это. React router сделает вашу жизнь проще.