Супергибкий контейнер


SitoContainer

Супер гибкий контейнер, очень похожий на контейнер @mui’s Box

Сначала!

1 — Создайте новое приложение react

Если вы используете yarn (я рекомендую его)

или если вам нравится использовать npm

если все идет хорошо, у вас будет страница, подобная этой, на localhost:3000 (если порт 3000 не занят):

Далее!

2 — Установите @emotion

Emotion — это библиотека, предназначенная для написания стилей css с помощью JavaScript. Она обеспечивает мощную и предсказуемую композицию стилей в дополнение к отличной работе разработчика с такими функциями, как карты исходников, ярлыки и утилиты тестирования. Поддерживаются как строковые, так и объектные стили.

зависимости:

или с помощью npm:

Time to CODE!

3 — Создайте свой компонент контейнера

Вы можете удалить другие файлы в папке /src, все, кроме index.js и App.js

Перейдите к вашему файлу App.js в каталоге /src, в нем вы найдете этот файл:

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

function App() {
  return (
    <div className="App">
      <header className="App-header">
        <img src={logo} className="App-logo" alt="logo" />
        <p>
          Edit <code>src/App.js</code> and save to reload.
        </p>
        <a
          className="App-link"
          href="https://reactjs.org"
          target="_blank"
          rel="noopener noreferrer"
        >
          Learn React
        </a>
      </header>
    </div>
  );
}

export default App;
Войти в полноэкранный режим Выйти из полноэкранного режима

Мы удалим все это и создадим ваш новый компонент, в данном случае компонент-контейнер, в этом руководстве это будет SitoContainer:

function SitoContainer() {
  return <div></div>;
}

export default SitoContainer;
Войти в полноэкранный режим Выход из полноэкранного режима

Теперь наш контейнер должен отображать свои дочерние элементы, поэтому давайте импортируем PropTypes из prop-types

import PropTypes from "prop-types";

function SitoContainer(props) {

  const { children } = props;

  return <div>{children}</div>;
}

SitoContainer.defaultProps = {
  children: <></>,
};

SitoContainer.propTypes = {
  children: PropTypes.node,
};

export default SitoContainer;
Войти в полноэкранный режим Выйти из полноэкранного режима

Хорошо, теперь мы должны позволить нашим будущим пользователям настраивать наш компонент с помощью своих CSS правил, поэтому давайте добавим другие реквизиты, такие как:

  • sx (styled-components like MUI)
  • style (inline-style)
  • className (имя класса css)
import PropTypes from "prop-types";

import { css } from "@emotion/css";

function SitoContainer(props) {
  const { children, className, sx, style } = props;

  // IMPORTANT!!!
  // this is for turn your styled-components rules as dynamic 
  // @emotion/css class
  const newSx = css({sx});

  return (
    <div className={`${className} ${newSx}`} style={style}>
      {children}
    </div>
  );
}

SitoContainer.defaultProps = {
  className: "",
  sx: {},
  style: {},
  children: <></>,
};

SitoContainer.propTypes = {
  children: PropTypes.node,
  className: PropTypes.string,
  sx: PropTypes.oneOfType([
    PropTypes.arrayOf(
      PropTypes.oneOfType([PropTypes.func, PropTypes.object, PropTypes.bool])
    ),
    PropTypes.func,
    PropTypes.object,
  ]),
  style: PropTypes.oneOfType([
    PropTypes.arrayOf(
      PropTypes.oneOfType([PropTypes.func, PropTypes.object, PropTypes.bool])
    ),
    PropTypes.func,
    PropTypes.object,
  ]),
};

export default SitoContainer;
Вход в полноэкранный режим Выход из полноэкранного режима

Обратите внимание, что PropTypes реквизитов style и sx действительно утомительны, потому что эти реквизиты могут быть практически любыми.

Наш контейнер почти готов, мы можем добавить другие реквизиты, такие как:

  • id (идентификатор html)
  • display (flex, block, etc.) В моем случае я добавил:
  • background (строка)
  • fullWidth (булево)
  • flexDirection (строка, столбец и т.д.).

Вы можете проверить в моем github repo

И наконец!

4 — Соберите контейнер в пучок и опубликуйте его

Создайте файл с именем .babelrc, содержащий:

{
  "presets": [
    [
      "@babel/preset-react",
      {
        "runtime": "automatic"
      }
    ]
  ]
}
Войти в полноэкранный режим Выйти из полноэкранного режима

Это для поддержки экспериментального синтаксиса jsx, если вы хотите посмотреть дальше, читайте здесь

Установите две dev-зависимости:

или с помощью npm:

Добавьте этот скрипт в ваш package.json:

и эту строку также в ваш package.json:

Эта последняя часть предназначена для указания npm, или yarn, где искать ваши модули, когда пользователь устанавливает их.
Используйте для локального тестирования npm install my-package, где my-package — корневая папка вашего пакета, в данном случае нашего контейнера.

Если все идет хорошо, в командной строке перейдите в корневую директорию вашего пакета и запустите для публикации вашего пакета:

дополнительные инструкции читайте здесь

Если вы хотите попробовать мой контейнер, вы можете посмотреть здесь sito-container

Оцените статью
Procodings.ru
Добавить комментарий