React / подсказка к 1 задачке

Ну я надеюсь у тебя nodejs уже установлен. Если вдруг нет, то скачай отсюда https://nodejs.org/en/ и установи.

Теперь создадим пустую папку и откроем ее с помощью Visual Studio Code

далее открываем консольку

и проверяем сначала что nodejs нормально установился. Пишем

node --version

и видим что-то такое:

если это есть значит все ок.

Считаю, что у тебя все ок =)

Создание проекта на react

Пишем в этой же консольке

npx create-react-app .

и ждем

я назвал свой папку с большими буквами, а так делать нельзя поэтому папку придется переименовать. Например в react_css_text

и открыть ее через visual studio code по новой

в общем, снова в консольке пишу

npx create-react-app .

ждем, пока будут скачаны все пакеты необходимые для работы react приложения, как и в случае со всяким современным javascript приложением качается пол интернета…

в общем, когда все закончится то увидим, что в папке появилась тьма файлов

плюс нам предлагают ввести команду npm start для запуска приложения (это примерно, как jekyll serve)

Пишим

и в браузере открывается

собственно, приложение на react запущено =О

Глянем что тут происходит. Самый главный файл это App.js, он представляет собой смесь javascript и html. Такой формат именуется JSX (java script extended). Это, по сути, главный шаблон приложения

Сразу встает вопрос если это базовый шаблон, то где тогда всякие <html><body> и т.д.

Ну на самом деле я немного наврал. На самом деле, тут два других файла являются самыми главными.

Первый – это public/index.html

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

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8" />
    <link rel="icon" href="%PUBLIC_URL%/favicon.ico" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <meta name="theme-color" content="#000000" />
    <meta
      name="description"
      content="Web site created using create-react-app"
    />
    <link rel="apple-touch-icon" href="%PUBLIC_URL%/logo192.png" />
    <link rel="manifest" href="%PUBLIC_URL%/manifest.json" />
    <title>React App</title>
  </head>
  <body>
    <noscript>You need to enable JavaScript to run this app.</noscript>
    <div id="root"></div>
  </body>
</html>

то есть обычный такой html. Например, если ты захочешь подключить fontawesome просто добавишь ссылку в head, в общем как обычно.

Внутри body нас интересует <div id="root"></div> это тег к которому будет привязываться react приложение. То есть именно в него будут добавляться все теги которые прописаны в App.js

Где ж собственно происходит привязка? А привязка происходит во втором главном файле index.html, находится в нем примерно следующее

Подключаем bootstrap

Вообще есть несколько способов подключения bootstrap к приложению. Я не знаю какой юзает Влад, потому покажу оба.

Способ №1

Самый простой. Идем на сайт bootstrap и вставляем

и

в public/index.html

теперь попробуем загнать бутстраповскую навигацию. Идем в App.js, сначала все убираем

import logo from './logo.svg';
import './App.css';

function App() {
  return (
        // убрал тут все
  );
}

export default App;

Кстати если сохранить и попробовать глянуть что происходит в браузере, там увидим

Это потому что мы делаем return пустоты, а React требует тегов. Дадим их ему

Ищем в бутстрапе навигацию, какую-нибудь попроще: https://getbootstrap.com/docs/5.0/components/navbar/#nav

и копипастим, как-то так:

import logo from './logo.svg';
import './App.css';

function App() {
  return (
    <nav class="navbar navbar-expand-lg navbar-light bg-light">
      <div class="container-fluid">
        <a class="navbar-brand" href="#">Navbar</a>
        <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarNav" aria-controls="navbarNav" aria-expanded="false" aria-label="Toggle navigation">
          <span class="navbar-toggler-icon"></span>
        </button>
        <div class="collapse navbar-collapse" id="navbarNav">
          <ul class="navbar-nav">
            <li class="nav-item">
              <a class="nav-link active" aria-current="page" href="#">Home</a>
            </li>
            <li class="nav-item">
              <a class="nav-link" href="#">Features</a>
            </li>
            <li class="nav-item">
              <a class="nav-link" href="#">Pricing</a>
            </li>
            <li class="nav-item">
              <a class="nav-link disabled" href="#" tabindex="-1" aria-disabled="true">Disabled</a>
            </li>
          </ul>
        </div>
      </div>
  </nav>
  );
}

export default App;

Вообще, оно даже работает:

но это только на первый взгляд, если открыть консольку, там увидим красные варнинги

Первая ошибка требует переименовать все class в className, вторая жалуется на tabindex который надо переименовать в tabIndex

В общем конечно лениво, но выделяем слово class и тычем Ctrl+D, чтобы выбрать все повторения и переписываем на className, ну tabIndex внизу правим

Получится так:

return (
  <nav className="navbar navbar-expand-lg navbar-light bg-light">
      <div className="container-fluid">
        <a className="navbar-brand" href="#">Navbar</a>
        <button className="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarNav" aria-controls="navbarNav" aria-expanded="false" aria-label="Toggle navigation">
          <span className="navbar-toggler-icon"></span>
        </button>
        <div className="collapse navbar-collapse" id="navbarNav">
          <ul className="navbar-nav">
            <li className="nav-item">
              <a className="nav-link active" aria-current="page" href="#">Home</a>
            </li>
            <li className="nav-item">
              <a className="nav-link" href="#">Features</a>
            </li>
            <li className="nav-item">
              <a className="nav-link" href="#">Pricing</a>
            </li>
            <li className="nav-item">
              <a className="nav-link disabled" href="#" tabIndex="-1" aria-disabled="true">Disabled</a>
            </li>
          </ul>
        </div>
      </div>
  </nav>
);

ошибки ушли

ну точнее остались желтые ошибки, но они носят рекомендательный характер. В данном случае он ругается что у ссылок href-ы ведут в никуда… Ну и пусть.

Теперь настроим visual studio, чтобы она начала нормально поддерживать вот эти className вместо class. Ну типа, когда пишешь точка + имя класса, то вставляется div с указанным классом.

Мне это важно, так как часто пользуюсь. Идем в настройки

тыкаем там

и вводим там javascript и javascriptreact

попробуем теперь что-нибудь написать

красота =)

Способ №2

Это более прогрессивный способ. Заключается в установки пакета bootstrap.

Сначала идем в public/index.html и удаляем там подключение через теги, остается просто

теперь открываем консольку и пишем

npm install -S bootstrap

и ждем:

теперь идем в App.js и подключаем bootstrap через импорт:

import logo from './logo.svg';
import './App.css';

require('bootstrap'); // подключил скрипты
require('bootstrap/dist/css/bootstrap.css'); // подключил стили

function App() {
  return (
      // ...

смотрим:

ошибка =О

Бутстрапу надо еще один пакет установить, который называется @popperjs/core

Снова идем в консольку и там пишем:

npm install -S @popperjs/core

и снова ждем:

как закончит, надо добавить в App.js где-нибудь пробел, чтобы react понял, что файл изменился и можно проверять:

вот теперь другое дело.

Чем второй способ лучше. Ну он более каноничный при разработка js-приложения, плюс у тебя используется локальная копия bootstrap, а значит можно верстать даже без интернета.

В принципе в этом состоянии уже можно верстать одностраничники прям в один файл, правда это не канонично >__>

1

Подключаем React и пробуем чего-нибудь сверстать на нем