Удаление класса из события последнего нажатия в React

#css #reactjs

#css #reactjs

Вопрос:

У меня есть панель навигации с вкладками, и я хочу сделать функцию с именем onClick, которая получает событие и добавляет класс на эту вкладку «активным». Но, когда я нажимаю другую вкладку, он должен удалить класс с предыдущей вкладки и добавить его к этой.

Пример моего кода:

 const [clickedTab, setClickedTab] = useState(true);

function Click() {

  if (clickedTab === true) {
    console.log(clickedTab);
    tab.classList.add("active");
  }
  else {
    console.log("Error!");
  }
  
}
  

Ответ №1:

В React используйте модель ( useState() в данном случае via ) для внесения изменений в представление.

Установите activeId значение вкладки в состояние, и если значение вкладки id равно activeId pass, установите его active true равным . Сама вкладка может добавлять / удалять className .

 const { useState } = React;

const Tab = ({ id, active, setActive }) => (
  <li 
    className={`tab ${active ? 'active' : ''}`}
    onClick={() => setActive(id)}
    >
    {id}
  </li>
);

const Example = ({ tabs }) =>  {
  const [activeId, setActive] = useState(); 
  
  return (
    <ul className="tabs">
    {tabs.map(id => (
      <Tab
        key={id}
        id={id}
        setActive={setActive} 
        active={id === activeId}
      />
    ))}
    </ul>
  );
}

const tabs = [1, 2, 3, 4];

ReactDOM.render(
  <Example tabs={tabs} />,
  root
);  
 .tabs {
  display: flex;
  list-style: none;
}

.tab {
  height: 1em;
  width: 2em;
  border: 1px solid red;
  text-align: center;
  cursor: pointer;
}

.active {
  background: red;
}  
 <script crossorigin src="https://unpkg.com/react@16/umd/react.development.js"></script>
<script crossorigin src="https://unpkg.com/react-dom@16/umd/react-dom.development.js"></script>

<div id="root"></div>  

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

1. Это полезно, но я не знаю, как я могу объединить это с моим кодом, потому что помимо добавления className и его удаления, он также должен маршрутизировать страницы. У меня есть 4 ссылки, и вот пример одной из них: <Link style={style} to =»/»> <li>Главная</li> </Link>

2. Если вы используете react router, посмотрите на NavLink

Ответ №2:

Вот простой пример, чтобы вы могли понять идею; мы сохраняем текущий идентификатор активного элемента в a state , затем на основе этого мы решаем, какое имя класса он должен иметь; нет необходимости использовать classList ‘s add или remove

 function Header () {
  const [active, setActive] = React.useState();
  return (
    <header>
      <ul>
       <li 
         className={active === 1? "red":"blue"}
         onClick={()=>setActive(1)}
       >a</li>       
       <li 
         className={active === 2? "red":"blue"}
         onClick={()=>setActive(2)}
       >b</li>
       <li 
         className={active === 3? "red":"blue"}
         onClick={()=>setActive(3)}
       >c</li>
      </ul>
     </header>
  );
}

ReactDOM.render( <Header />, app );  
 .red{background:red}.blue{background:blue}li{color:#fff;width:30px}  
 <script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.10.0/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.10.0/umd/react-dom.production.min.js"></script>
<div id="app"></div>  

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

1. Могу ли я как-то сократить это и удалить повторение, но объединить его с этим примером: <Link style={style} to =»/»> <li className={active === 1? «активный»: «неактивный»} onClick={() => SetActive(1)}>Главная страница</li> </Link> ?