Русский
Русский
English
Статистика
Реклама

Блог компании quarkly

Юзкейс нечаянно нагрянет, когда его совсем не ждешь

20.02.2021 14:06:35 | Автор: admin


Наш проект Quarkly по-прежнему в открытой бете, мы готовимся к релизу и в хорошем темпе добавляем функционал, который заложен в Roadmap. При этом апдейты апдейтами, а более активно щупать свою аудиторию, да что там щупать сформировать комьюнити, которое не против таких виртуальных тактильных манипуляций это большая и важная задача. С ней пока не всё гладко.


Вот наш проект, он вот для этого и потенциально решает вот такую задачу.
А есть юзкейсы? Дайте посмотреть.
Ок, зайдем позже.

Полагаю, знакомая история для многих, кто запускал свои проекты. Тем ценнее, когда use case появляется сам из ниоткуда. Вот вы в бете и объективно понимаете, что нужно сделать, чтобы с помощью вашего продукта люди начали системно решать свои задачи, а они берут и уже сейчас что-то делают не по фану, а даже для прохода в финал крупного хакатона.



Эта история началась с того, что Саша написал нам в чатик в телеграме и задал несколько вопросов по работе с Quarkly.



В личной переписке Саша рассказал, что они в паре со знакомой дизайнером участвуют в хакатоне Цифровой прорыв 2020 и делают проект для прохода через сито регионального этапа в финал. Да, дело было аж в ноябре 2020, а полноценно пообщаться и наконец написать об этом пост дошли руки лишь сейчас. Но лучше поздно, чем никогда, как говорится.


Ниже с разрешения Саши публикую наше интервью.


Расскажи про первое знакомство с Quarkly. Насколько я понимаю, это случилось в сентябре в Ростове на конференции, где у нас был свой стенд?



Мы в фокусе и расфокусе



Притаились снизу


Верно, про Quarkly узнал на RndTechConf. Проект заинтересовал, но посмотреть руки дошли не сразу, скажу честно. Уже позже, когда знакомая позвала участвовать в хакатоне, я прикинул, что главное там пройти региональный этап и попасть в финал. Решает тут скорость.


Для этого нужно было либо быстро придумать, что можно сделать в одно лицо, либо в команде сотворить магию. Вместе со своей знакомой она, кстати, дизайнер мы никогда прежде не работали. Предложил ей рискнуть и посмотреть в сторону Quarkly. Это показалось удачным для экономии времени она делает дизайн, я всё остальное, заодно сразу в бою можно познакомиться с инструментом.


Про совместную работу как раз интересно. Насколько реально удобно было, не мешали друг другу? И удалось ли сэкономить время, как думаешь, если объективно?


Сначала у меня было дикое непонимание, как здесь реализовывать какую-то простую логику (как настоящий аладушек, прочел гайд лишь после хакатона, на хакатоне же делал по наитию). Поэтому поначалу задачей-минимум было использовать Quarkly для показа нашей рабочей концепции хотя бы из-за простоты развертывания. В этом плане точно удалось сэкономить, ибо схема дизайн > реализация дизайна > залив изменилась на дизайн > накидываю сверху код, если требуется > залив изменений.



Ещё отмечу, что концепция наша менялась миллион раз уже во время хакатона, без Quarkly мы бы вряд ли могли себе такое позволить.


Как я знаю, в финал вы прошли?


Да, мы залетели по итогу в последний вагон: проходило всего 5 команд, и мы оказались пятыми. В финале уже не использовали Quarkly.


Не потому, что что-то не понравилось, а скорее из-за того, что на финал у нас была одна понятная концепция, да и основной упор был на бота в телеграме. Буст в скорости выхода какого-то веба нам уже не требовался.


Раз уж мы собираем кейсы, такой вопрос: каким ты видишь идеальное применение Quarkly сейчас? И что нужно в первую очередь добавить, чтобы он реально занял нишу на рынке?


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


Примечание: добавление подсветки совместных действий на одной странице уже есть в планах.


В работе условной дизайн-студии на несколько человек Quarkly может стать основным инструментом, как думаешь? В чем могут быть трудности?


Трудности для дизайнера, который делает что-то из серии margin-left: 2000px. Со стороны разработчика, пожалуй, непонятность со стором и с созданием каких-то общих утилит.


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


А ведь наверняка было что-то помимо невозможности увидеть совместные действия, что доставило сложности? Про непрочитанную доку упустим, я скорее о том, что вроде понятно, но для удобства хотелось бы иначе?
Сейчас особенно полезно об этом написать, бета-версия и всё такое.


Хотелось бы убрать костыль перехода между страницами через кнопки, которые на самом деле были ссылками.


Ради интереса или для каких-то проектов планируешь использовать Quarkly в ближайшее время?


Ради интереса точно да. Информация про апдейты и фиксы периодически мелькает в телеге, поэтому не потеряемся.


Спасибо за ответы!


Комьюнити Quarkly в телеграме
Саша в телеграме
Проект для регионального хакатона

Подробнее..

Сердце, не познавшее боли разочарования, не знало и радости полёта

18.02.2021 14:23:54 | Автор: admin

The Host (Stephenie Meyer)


На этот пост меня вдохновила недавняя заметка Александра Pogman25 про боль фронтендеров и непростую историю любви и ненависти между фронтами и дизайнерами интерфейсов. История стара как мир, и основная причина боли действительно в отсутствии диалога и нежелании или неумении оказаться по другую сторону макета. Нежелание может быть следствием профэгоизма, неумение недостаточным скиллом. И с тем и с другим можно работать.



Думаю, в недалеком будущем No-Code/Low-Code продукты сделают свое дело, и UI/UX и фронтендеры уже не будут знать, что это такое, когда глаз дергается синхронно с кнопкой в веб-версии макета. А что сейчас? Чтобы дизайнеру и фронту было проще ужиться друг с другом, а их совместная работа упростилась, мы придумали Quarkly.



Сооснователи проекта Саша и Артем не понаслышке знакомы со всеми болячками, которые возникают во время коммуникации дизайнера и фронта. Александр фулстек-разработчик, Артем UI/UX. В данном случае, что называется, карты сошлись.


В Quarkly мы стремимся к пресловутому Low-Code и даже No-Code при сборке сайтов и веб-приложений, и когда мы запустим в релиз каталог-маркетплейс готовых компонентов, это станет в целом очень даже возможным.


По состоянию на февраль 2021 года маркетплейса у нас пока нет, но есть весь базовый набор инструментов как для дизайнера, привыкшего делать макеты/прототипы в популярных дизайн-инструментах (Figma, Framer), так и для разработчика.


Уже сейчас готовый макет из Figma не без труда, но довольно быстро можно перетащить в Quarkly, ниже оставляю туториал с русскими и английскими субтитрами:




За счет чего Quarkly поможет снять боль


Дизайнеры часто не могут понять боль фронтов, потому что создают макеты в инструментах, не позволяющих ощутить макет в динамике. Кроме того, с Quarkly процесс совместной работы занимает меньше времени.


Чтобы не считать длину рабочего цикла в слонах, мартышках и попугаях, давайте наглядно сравним две ситуации:


  1. Дизайнер и фронт работают, как они привыкли каждый это делать дизайнер создает макет в Figma, далее фронт переносит всё в код;
  2. Дизайнер и фронт совместно создают проект в Quarkly.

И не будем забывать, что помимо скорости нас также интересует, какие болевые точки можно при этом обойти. Опасные моменты я буду обозначать по шкале от 1 до 5 ударов мизинцем ноги о комод.



Хорошая спецификация в условиях работы на потоке (неважно при этом, большая это компания или маленькая студия) это очень важно. Хорошая спецификация не гарантия, но весомая заявка, что боли в процессе работы получится избежать.


Неполная спецификация бомба замедленного действия. Может быть, всё обойдется, если лунные циклы сойдутся, Марс в созвездии Овна не будет против, а дизайнер и разработчик поймут друг друга, как нужно.


Другой опасный момент когда макеты нарисованы дизайнером, не понимающим, что с ними будет дальше на следующем этапе. Вряд ли нужно пояснять, откуда и какая боль здесь может приключиться.


Наконец, самое печальное это когда такие макеты попадают к разработчику. Больно будет ему, больно будет дизайнеру, к которому он будет постоянно приходить с вопросами.



Макет дизайнера уже является кодом. Разработчику нужно лишь проверить сложные логики, с которыми не может справиться дизайнер.



Наш канал на YouTube, где можно найти полезные мануалы: смотреть


Наш чат в телеграме: https://t.me/quarklyapp

Подробнее..

Перевод 5 типичных ошибок при создании React компонентов (с хуками) в 2020 году

01.07.2020 18:14:54 | Автор: admin
image

Всем привет! Из этой статьи вы узнаете о самых распространенных ошибках при создании React компонентов, а также о том, почему они считаются ошибками, как их избежать или исправить.


Оригинальный материал был написан немецким разработчиком Лоренцом Вайсом для личного блога, а позже собрал много позитивных отзывов на dev.to. Переведено командой Quarkly специально для комьюнити на Хабре.



React


React достаточно давно существует в мире веб-разработки, и его позиции как инструмента для гибкой разработки стремительно укрепились за последние годы. А после анонса и релиза нового хука api/concept создание React-компонентов стало ещё проще.


Несмотря на то, что команда, разработавшая React, и огромное сообщество, которое кодит на этом языке, попытались дать внушительное объяснение концепции React'а, я всё же нашел кое-какие недостатки и типичные ошибки во время работы с ним.


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


Дисклеймер


Прежде чем перейти к списку, должен сказать, что на первый взгляд большинство ошибок из списка на самом деле не являются фундаментальными или даже выглядят вполне корректно. Большинство из них вряд ли вообще повлияют на работу или внешний вид приложения. Скорее всего, кроме разработчиков, работающих над продуктом, никто не заметит, что здесь что-то не так. Но я всё равно считаю, что хороший качественный код может помочь улучшить опыт разработки и, следовательно, разработать лучший продукт.


Что касается React-кода, как и по любому другому программному фреймворку или библиотеке, по нему существует миллион различных мнений. Всё, что вы видите здесь, мое личное мнение, а не истина в последней инстанции. Если у вас другое мнение, я с удовольствием выслушаю его.


1. Использование useState, когда нет необходимости в повторном рендере


Одна из основных концепций Reactа это работа с состоянием. Вы можете контролировать весь поток данных и рендеринг через состояние. Каждый раз, когда дерево рендерится снова, оно, скорее всего, привязывается к изменению состояния.


С помощью хука useState вы можете также определять состояние в функциональных компонентах, потому что это действительно чистый и простой способ обработки состояний в Reactе. На примере ниже можно увидеть, как этот хук используется не по назначению.


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


Так делать нехорошо:


function ClickButton(props) {  const [count, setCount] = useState(0);  const onClickCount = () => {    setCount((c) => c + 1);  };  const onClickRequest = () => {    apiCall(count);  };  return (    <div>      <button onClick={onClickCount}>Counter</button>      <button onClick={onClickRequest}>Submit</button>    </div>  );}

Проблема:


На первый взгляд, вы можете спросить: А в чем, собственно, проблема? Разве не для этого было создано это состояние? И будете правы: всё отлично сработает, и проблемы вряд ли возникнут. Однако в Reactе каждое изменение состояния влияет на компонент и, скорее всего, на его дочерние компоненты, то есть заставляет их выполнить повторный рендеринг.


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


Решение:


Если внутри вашего компонента вы хотите использовать переменную, которая должна сохранять свое значение между рендерингом, но при этом не вызывать повторный рендеринг, вы можете использовать хук useRef. Он сохранит значение, но не приведет к повторному рендерингу.


function ClickButton(props) {  const count = useRef(0);  const onClickCount = () => {    count.current++;  };  const onClickRequest = () => {    apiCall(count.current);  };  return (    <div>      <button onClick={onClickCount}>Counter</button>      <button onClick={onClickRequest}>Submit</button>    </div>  );}

2. Использование router.push вместо ссылки


Наверное, это очевидно и не имеет никакого отношения к самому Reactу, но я до сих пор довольно часто наблюдаю эту оплошность у людей, создающих React-компоненты.


Допустим, вы создаете кнопку, и пользователь при нажатии на неё должен быть перенаправлен на другую страницу. Так как это SPA, то это действие будет клиентским механизмом маршрутизации. Так что вам понадобится какая-нибудь библиотека. Самая популярная из них в React это react-router, и в следующем примере будет использована именно эта библиотека.


Значит ли это, что добавление слушателя события по клику правильно перенаправит пользователя на нужную страницу?


Так делать нехорошо:


function ClickButton(props) {  const history = useHistory();  const onClick = () => {    history.push('/next-page');  };  return <button onClick={onClick}>Go to next page</button>;}

Проблема:


Хотя для большинства пользователей это вполне рабочее решение, есть одна большая проблема: она появляется, когда дело касается реализации веб-доступности. Кнопка вообще не будет помечена как ссылка на другую страницу, а это значит, что скринридер не сможет ее идентифицировать. Сможете ли вы открыть ее в новой вкладке или окне? Скорее всего, тоже нет.


Решение:


Ссылки на другие страницы при любом взаимодействии с пользователем должны, насколько это возможно, обрабатываться компонентом <Link> или обычным тегом <a>.


function ClickButton(props) {  return (    <Link to="/next-page">      <span>Go to next page</span>    </Link>  );}

Бонусы: это также делает код более читабельным и лаконичным!


3. Обработка действий с помощью useEffect


Один из лучших и продуманных хуков, представленных в Reactе, это useEffect. Он позволяет обрабатывать действия, связанные с изменением prop или state. Несмотря на свою функциональность, этот хук также часто используется там, где не очень-то и нужен.


Представьте себе компонент, который извлекает список элементов и выводит их в DOM. Помимо этого, в случае успешного выполнения запроса мы хотим вызвать функцию onSuccess, которая передается компоненту в качестве свойства.


Так делать нехорошо:


function DataList({ onSuccess }) {  const [loading, setLoading] = useState(false);  const [error, setError] = useState(null);  const [data, setData] = useState(null);  const fetchData = useCallback(() => {    setLoading(true);    callApi()      .then((res) => setData(res))      .catch((err) => setError(err))      .finally(() => setLoading(false));  }, []);  useEffect(() => {    fetchData();  }, [fetchData]);  useEffect(() => {    if (!loading && !error && data) {      onSuccess();    }  }, [loading, error, data, onSuccess]);  return <div>Data: {data}</div>;}

Проблема:


Есть два хука useEffect: первый обрабатывает запрос данных к API во время первоначального рендеринга, а второй вызывает функцию onSuccess. То есть, если в состоянии нет загрузки или ошибки, но есть данные, то этот вызов будет успешным. Логично звучит, да?


Конечно, это почти всегда будет срабатывать с первым вызовом. Но вы также потеряете прямую связь между действием и вызываемой функцией. И нет 100% гарантии, что это произойдет только в том случае, если действие fetch будет успешным. А это именно то, что мы, разработчики, так сильно не любим.


Решение:


Самое простое решение установить функцию onSuccess туда, где вызов будет успешным.


function DataList({ onSuccess }) {  const [loading, setLoading] = useState(false);  const [error, setError] = useState(null);  const [data, setData] = useState(null);  const fetchData = useCallback(() => {    setLoading(true);    callApi()      .then((fetchedData) => {        setData(fetchedData);        onSuccess();      })      .catch((err) => setError(err))      .finally(() => setLoading(false));  }, [onSuccess]);  useEffect(() => {    fetchData();  }, [fetchData]);  return <div>{data}</div>;}

Теперь с первого взгляда понятно, что onSuccess вызывается только в случае успешного вызова API.


4. Компоненты с единой ответственностью


Составлять компоненты может быть довольно трудной задачей. Когда делить один компонент на несколько более мелких компонентов? Как структурировать дерево компонентов? Этими вопросами задаются все, кто каждый день работает с компонентным фреймворком. И самой распространенной ошибкой при создании компонентов является объединение двух случаев использования в один компонент.


Возьмем в качестве примера заголовок, который показывает либо кнопку бургерного меню на мобильном устройстве, либо вкладки на десктопе (условие будет обработано волшебной функцией isMobile, которая не является частью этого примера).


Так делать нехорошо:


function Header(props) {  return (    <header>      <HeaderInner menuItems={menuItems} />    </header>  );}function HeaderInner({ menuItems }) {  return isMobile() ? <BurgerButton menuItems={menuItems} /> : <Tabs tabData={menuItems} />;}

Проблема:


При таком подходе компонент HeaderInner пытается вести двойную жизнь. А мы знаем, что тяжело быть Кларком Кентом и Суперменом одновременно. Это также затрудняет процесс тестирования или повторного использования компонента в других местах.


Решение:


Если перенесем условие на один уровень выше, будет проще увидеть, для чего сделаны компоненты, и что они отвечают только за одно: заголовок, вкладку или кнопку бургер-меню, и не стоит пытаться отвечать за несколько вещей одновременно.


function Header(props) {  return (    <header>{isMobile() ? <BurgerButton menuItems={menuItems} /> : <Tabs tabData={menuItems} />}</header>  );}

5. useEffect с единой ответственностью


Помните времена, когда у нас были только методы componentWillReceiveProps или componentDidUpdate для подключения к процессу рендеринга React-компонента? В голову сразу приходят мрачные воспоминания, а ещё осознаешь всю прелесть использования хука useEffect и особенно то, что его можно использовать без ограничений.


Но иногда, когда используешь useEffect для некоторых вещей, мрачные воспоминания приходят вновь. Представьте, например, что у вас есть компонент, который извлекает некоторые данные из бэкэнда и отображает путь (breadcrumbs) в зависимости от текущего местоположения (снова используется react-router для получения текущего местоположения).


Так делать нехорошо:


function Example(props) {  const location = useLocation();  const fetchData = useCallback(() => {    /*  Calling the api */  }, []);  const updateBreadcrumbs = useCallback(() => {    /* Updating the breadcrumbs*/  }, []);  useEffect(() => {    fetchData();    updateBreadcrumbs();  }, [location.pathname, fetchData, updateBreadcrumbs]);  return (    <div>      <BreadCrumbs />    </div>  );}

Проблема:


Существует два варианта использования хука: сбор данных (data-fetching) и отображение пути (displaying breadcrumbs). Оба обновляются с помощью хука useEffect. Этот самый хук useEffect сработает, когда fetchData и updateBreadcrumbs функционируют или меняется location. Основная проблема в том, что теперь мы также вызываем функцию fetchData при изменении location. Это может стать побочным эффектом, о котором мы и не подумали.


Решение:


Если разделить эффект, станет понятно, что функции используются только для одного эффекта, при этом неожиданные побочные эффекты исчезают.


function Example(props) {  const location = useLocation();  const updateBreadcrumbs = useCallback(() => {    /* Updating the breadcrumbs*/  }, []);  useEffect(() => {    updateBreadcrumbs();  }, [location.pathname, updateBreadcrumbs]);  const fetchData = useCallback(() => {    /*  Calling the api */  }, []);  useEffect(() => {    fetchData();  }, [fetchData]);  return (    <div>      <BreadCrumbs />    </div>  );}

Бонусы: случаи использования теперь также логически распределены внутри компонента.


Заключение


При создании React-компонентов натыкаешься на множество подводных камней. Никогда не удается досконально понять весь механизм, и вы обязательно столкнетесь хотя бы с маленьким, а, скорее всего, даже с большим косяком. Однако совершать ошибки тоже нужно, когда изучаешь какой-нибудь фреймворк или язык программирования. Никто не застрахован от них на 100%.


Я думаю, что делиться своим опытом в этой сфере очень полезно для других, это должно помочь другим ребятам не наступать на те же грабли.

Подробнее..

Перевод О роли фронтенд-разработчика

30.07.2020 18:15:54 | Автор: admin

Привет, Хабр! Представляем вашему вниманию перевод статьи фронтенд-разработчика из MediaMonks Рональда Мендеса. Будучи родом из Венесуэлы, Рональд перебрался в Аргентину и построил успешную карьеру, а благодаря своему большому интересу к дизайну и анимации стал одним из членов жюри престижной премии FWA (вручается с 2000 года).


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


Рональд Мендес. О роли фронтенд-разработчика


Когда я начал работать разработчиком в 2009 году, я проводил большую часть своего времени, верстая сайты. Мои задачи относились к заключительному этапу линейного процесса, в котором дизайнеры, клиенты и другие заинтересованные стороны принимали практически все решения.


image

Где бы я ни работал (в агентстве или как фрилансер), разработчиков нигде не привлекали к взаимодействию с клиентами, кроме тех случаев, когда нужно было ответить на какие-то технические вопросы. Чаще всего меня спрашивали о реализации простого функционала, например, как сделать слайдер или адаптировать изображение, загруженное с CMS.


В последующие годы, по мере того, как фронтенд-разработка становилась всё сложнее, и у разработчиков появлялось всё больше новых навыков, такое отношение к фронтенд-разработчикам всё больше разочаровывало.


Многие организации, включая те, где я работал, придерживались водопадной модели разработки: мы понятия не имели о том, что происходит, до тех пор, пока проект не был готов непосредственно к программированию. Всё сваливалось на нас в последнюю минуту, и мы не успевали даже вставить свои пять копеек.


Несмотря на то, что зачастую члены нашей команды нас высоко ценили, у нас всё равно не было возможности внести свой вклад в проекты в самом начале процесса. Каждый раз, когда мы делились идеей или замечали проблему, было уже слишком поздно.


Мы, фронтендеры, прошли долгий путь за последние десять лет. После стольких лет напряженной работы, необходимой для того, чтобы стать топовыми профессионалами и оказывать большее влияние на проекты, теперь многие программисты стали получать больше морального удовлетворения от вносимого вклада в продукт.


Но нам всё ещё есть куда стремиться: к сожалению, работа некоторых фронтендеров, обладающих удивительными навыками, до сих пор сводится к верстке из PSD-макетов в HTML. Других устаивает свое положение в команде, но им бы хотелось играть более активную роль и продвигать свои идеи при разработке проекта.


Хотя я и горжусь тем, что отношусь к программистам, которые имеют влияние на проект, я продолжаю бороться за наше место под солнцем. Надеюсь, прочитав о моем опыте, вы захотите присоединиться к моему движению.


Мой путь


Моя роль в команде начала меняться, когда я увидел вдохновляющее выступление Сета Година, которое помогло мне кое-что осознать: у меня есть силы на перемены, которые позволят мне получать большее моральное удовлетворение от работы. Годин предлагает требовать быть более активным независимо от того, работаете ли вы на босса или на клиента именно этот совет дал мне необходимый толчок.


Я не рассчитывал на большой скачок мне достаточно было почувствовать, что я иду в правильном направлении.


Маленькие шаги в маленькой команде


Однажды у меня появился идеальный шанс прощупать почву. Я как раз сотрудничал с небольшой дизайн-студией, и в команде было пять человек. Так как я никогда не скрывал, что мне нравится дизайн, было нетрудно их убедить, что, если меня будут больше вовлекать в дизайн-процессы, я смогу давать обратную связь по технической части до того, как макеты будут представлены клиентам.


Результаты были поразительными и положительно повлияли на работу всей команды. Мне стали передавать материалы по дизайну, чтобы получить мое одобрение по технической части. Со своей стороны, дизайнеры с радостью отметили, что сайты, которые мы запустили после общего согласования, точнее соответствовали макетам.


Следующим моим шагом было участие в каждом проекте с первого дня. Я начал ходить на первые встречи с клиентами, ещё до того, как были подписаны какие-либо контракты. Я обращал внимание команды на вещи, которые могли превратить фазу разработки в настоящий кошмар. В то же время я предлагал попробовать новые технологии, которые изучал на тот момент.


Через несколько месяцев я почувствовал, что мои старания наконец-то повлияли на проекты команды. Я был доволен своей ролью в команде, но я знал, что это не будет длиться вечно. В итоге пришло время отправиться в путешествие, которое вернуло бы меня к классической роли фронтенд-разработчика, то есть к подножию водопада.


Выход на большую сцену


Когда моя карьера начала стремительно развиваться, я оказался вдали от того маленького офиса на пять человек, где всё начиналось. Теперь я работал с гораздо более многочисленной командой, и проблемы были совершенно другими. Сначала меня очень удивило то, как они подходят к рабочему процессу: у всех членов команды была сильная техническая подготовка, в отличие от других команд, с которыми я когда-либо работал. Это делало сотрудничество очень эффективным. У меня не было никаких претензий к качеству дизайна, с которым я работал. На самом деле, в течение первых нескольких месяцев меня постоянно выталкивали из зоны комфорта и постоянно проверяли мои навыки.


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


Как команда разработчиков мы перешли на современные JavaScript-библиотеки. Это привело к тому, что при работе с нашими приложениями мы использовали исключительно компонентный подход. И несмотря на то, что мы медленно меняли наш образ мышления, мы не изменили способ сотрудничества с творческой половиной нашей команды. Создать эту связь между командами и стало моей новой целью.


Я был в восторге от концепции Брэда Фроста Cмерть водопаду: идея в том, что команды UX, визуального дизайна и разработчиков должны работать параллельно: это приведет к более высокому уровню итерации в ходе проекта.


Все члены моей команды стали брать на себя больше обязанностей и делиться мыслями относительно каждого проекта, когда их стали поощрять вести совместный рабочий процесс. Разработчики начали участвовать в проектах на стадии дизайна, отмечая любые технические проблемы, которые могли предвидеть. Дизайнеры вносили свой вклад и давали рекомендации на стадии разработки. Когда процесс запустился, мы сразу увидели положительные результаты и превосходно проделанную работу.


Хотя может показаться, что этот переход был плавным, но на самом деле он потребовал большой напряженной работы и преданности делу со стороны всех членов команды. Все мы хотели не только улучшить качество работы, но и сделать большой скачок за пределы наших зон комфорта и старых рабочих процессов.


Как завоевать место под солнцем


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


Ниже вы увидите более подробную информацию о том, что сработало для меня и могло бы также сработать для вас.


Перемены в жизни разработчика


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


  • Не молчи. В многопрофильных командах разработчики известны своей высокоаналитичностью, критичностью и логичностью, но не коммуникабельностью. Я видел многих разработчиков, которые тихо жаловались и утверждали, что у них есть идеи получше о том, что и как делать, но они скрывали свои мысли и переходили к другой работе. После того, как я начал высказывать свои мысли и предлагать новые идеи, я увидел небольшие изменения в моей команде, и у меня неожиданно сильно повысилась мотивация. Более того я заметил, что другие начинают смотреть на мою роль в команде по-другому.
  • Всегда будь в курсе того, какие идеи есть у остальных членов команды. Одна из наиболее распространенных ошибок, которые мы часто совершаем, это сосредоточиться только на своей работе. Чтобы быть на одной волне со своей командой и улучшить свою роль, мы должны понимать цели компании, навыки членов нашей команды, наших клиентов, и любой другой аспект сферы, где мы работаем, и на который, как мы привыкли думать, разработчик не должен тратить время. Как только я начал лучше понимать процесс дизайна, общение с моей командой начало улучшаться. То же самое относится и к дизайнерам, которые начали больше узнавать о процессах фронтенд-разработки.
  • Прокачивай ключевые навыки. Сегодня наши обязанности расширяются, и перед нами постоянно ставят задачу вести свою команду вперед к ещё неизведанным технологиям. Как фронтенд-разработчикам, нам нередко ставят задачу исследовать такие технологии, как WebGL или VR, и ознакомить с ними остальных членов команды. Мы должны быть в курсе последних достижений в наших технических областях. Наша репутация ставится на карту каждый раз, когда требуется наш вклад, поэтому мы всегда должны стремиться быть лучшими разработчиками в своей отрасли.

Перемены в рабочем процессе в компании


Чтобы максимально использовать свой потенциал как разработчик, вам нужно будет убедить вашу компанию внести ключевые изменения. Этого может быть трудно добиться, поскольку, как правило, требуется вывести всех членов команды из зон комфорта.


В моем случае сработали именно долгие переговоры с моими коллегами, в том числе с дизайнерами, руководством и разработчиками. Менеджеру трудно отказать вам, когда вы предлагаете идею по улучшению качества вашей работы и просите лишь о небольших изменениях. Как только остальная команда поддержит эти изменения, вам придется усердно поработать и начать внедрять эти изменения, чтобы процесс не остановился:


  • Привлекай разработчиков к проектам с самого начала. Многие компании придерживаются высоких стандартов, когда речь заходит о найме разработчиков, но не в полной мере используют их талант. У большинства из нас логический тип мышления, поэтому так полезно привлекать разработчиков ко многим аспектам проектов, над которыми мы работаем. Мне часто приходилось делать первый шаг, чтобы меня ввели в курс дела в самом начале проекта. Но как только я начал прилагать усилия, чтобы внести ценный вклад в процесс, команда начала автоматически привлекать меня и других разработчиков к работе на стадии дизайна новых проектов.
  • Запланируй обсуждение проекта. Проблемы часто возникают, когда во время первых обсуждений проекта с клиентом присутствует не вся команда, которая будет работать над проектом. Как только клиент что-то подпишет, внедрять новые идеи может быть рискованным, какими бы ценными и полезными они ни были. Разработчики, дизайнеры и другие ключевые фигуры должны собраться вместе, чтобы вместе обсудить проект и затем перейти к следующему этапу. Как разработчику, возможно, вам иногда придется тратить часть своего времени, чтобы помочь товарищам по команде просмотреть их работу перед тем, как они её представят.
  • Собери людей работать вместе. Если это возможно, собери людей в одной комнате. Мы предпочитаем полагаться на технологии и настаиваем на общении только через чат и электронную почту, но в личном общении есть свои плюсы. Всегда полезно, чтобы разные члены команды сидели вместе, или, по крайней мере, достаточно близко друг к другу, чтобы регулярно общаться друг с другом лично: так легче делиться идеями в ходе проекта. Если ваша команда работает удаленно, вам придется искать альтернативы для достижения того же эффекта. Периодические созвоны могут помочь командам делиться мыслями, комментариями и взаимодействовать друг с другом в режиме реального времени.
  • Найдите время для образования. Из всех команд, с которыми я работал, как правило, эффективнее работают те, в которых поощряют культуру обмена знаниями. Простые и непринужденные презентации коллег из разных сфер могут внести огромный вклад в формирование разнообразных навыков в команде. Поэтому важно поощрять членов команды к тому, чтобы они преподавали и учились друг у друга.

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

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


В качестве постскриптума


Спасибо за прочтение материала. В конце нам бы хотелось добавить несколько слов от себя.


Мы хорошо знаем, что нередко даже талантливый разработчик испытывает проблему в связи с отсутствием яркого портфолио. Не у всех из нас есть усидчивость для создания заметных пет-проектов, а выполненные заказы на фрилансе это не тот опыт, который обычно впечатляет потенциального работодателя. Один из выходов тематические конкурсы.


На правах небольшой нагловатой рекламы (да простит нас Рональд): один из таких конкурсов стартовал сейчас у нас. Если вы знакомы с React или видите силы попробовать себя в написании компонентов для React, приглашаем принять участие по ссылке.


Прием работ продлится до 28 августа.

Подробнее..

Представляем Quarkly инструмент для react-разработчиков и дизайнеров, который поможет оптимизировать вашу разработку

07.11.2020 16:21:16 | Автор: admin

Всем привет! Идеологически Quarkly это проект, который призван упростить жизнь веб-разработчикам и веб-дизайнерам. В этом посте я коротко расскажу, за счет чего это возможно.


Прежде всего, давайте посмотрим, как выглядит типичный цикл разработки веб-приложения в 2020 году? Есть команда. В этой команде есть дизайнер и разработчик. Первый создает дизайн-спецификацию в Figma. Второй, на основе дизайн-спецификации, создает компоненты, переносит тему. Результат своей работы программист показывает дизайнеру в Storybook. Дизайнер его проверяет и утверждает проект, если всё хорошо. Далее он начинает создавать макеты, а разработчик верстает их при помощи компонентов из спецификации.




Для наглядности построим всё в виде списка:


  • Создание спецификации в Figma;
  • Настройка окружения для разработки;
  • Создание ui-kit;
  • Аппрув;
  • Создание макета в Figma;
  • Верстка;
  • Настраиваем сборщик;
  • Получаем веб-приложение.

А теперь представьте, что вы оптимизировали процессы, и получилось так:


  • Дизайнер создает спецификацию и макеты, а разработчик помогает дописать логику (последнее нужно не всегда, т.к. есть скелетные компоненты);
  • Получаем приложение в один клик.

Всё это доступно уже сейчас с помощью Quarkly!


Работая над нашим продуктом, мы очень хотели, чтобы процесс создания сайта или приложения стал действительно простым, при этом на выходе получался конкурентоспособный проект с чистым и читаемым кодом.


Quarkly позволяет создать сайты и веб-приложения как при помощи мыши, так и при помощи кода вам доступны все плюсы интерактивного редактирования, но в любой момент вы можете открыть редактор кода и отредактировать код вашего приложения вручную, и всё полностью синхронизируется.


Создание простого блока в Quarkly


Design tool + IDE + Module builder + Publisher



Дизайнеры работают с Quarkly так же, как привыкли делать это в Figma, интерфейс им будет довольно знаком. Для программистов же доступен механизм сборки модулей со всеми прелестями: hmr, npm-модули.



Результат вашей совместной работы синхронизируется с гитхабом (куда же без версионирования) и публикуется на Netlify нажатием одной кнопки.



Помимо всего прочего, проект в любой момент можно экспортировать как create-react-app или в Gatsby.


Из коробки вы получаете все необходимые оптимизации, важные для современного веба. Без единой строчки в bash.


Что под капотом Quarkly


Если коротко, наш проект базируется на всем известных инструментах, например React. Это выглядит вполне логично мы в Quarkly пропагандируем удобство, скорость и функциональность React.


На роль стейт-менеджера мы выбрали MobX. Горячо советую присмотреться к нему тем, кто по какой-то причине этого пока не сделал. С его помощью мы смогли очень заметно увеличить скорость нашей разработки. Также мы разработали для него свой аналог Logux, но только чуть мощнее (Undo, Redo и версионирование). В будущем мы планируем выложить исходники этого модуля на GitHub и рассказать про него подробнее.


Стили пишем при помощи css-modules если говорить про статические, а вот динамику при помощи нашей библиотеки Atomize.


Сборщик тут всё просто Webpack (CRA), но с оговоркой: за сборку пользовательских модулей отвечает сборщик, который мы разработали сами. Опять же, если есть интерес, можем рассказать про него отдельно.


Одна из наших фишек кодогенерация. Тут, по традиции, собственная разработка, которая базируется на Babel, но сильно пропатчена часть принтинга кода.


Немного о будущем


Наша глобальная цель создать удобный инструмент, который оптимизирует полный цикл разработки сайтов и приложений. Мы работаем над понижением порога входа и повышением уровня абстракции, чтобы каждый мог создать свой сайт и сделать это современно.


P.S.


Одной из важных задач, которые мы ставим перед собой на ближайшее время, является формирование комьюнити. Если нам удалось вас заинтересовать приглашаем в наше сообщество в телеграме @quarklyapp.


Также сегодня мы запускаем открытую бету и выходим на голосование на Product Hunt. Будем рады, если поддержите нас. Отдать голос за Quarkly можно по ссылке.

Подробнее..

Делаем страницу на React с базой сотрудников при помощи Airtable и Quarkly

31.01.2021 16:07:40 | Автор: admin

Слышали про такой инструмент, как Airtable, но не знали, с чего начать? Тогда приглашаем в мир визуального программирования построения БД!


Этим постом мы начинаем цикл обучающих статей, в которых будем давать практические примеры работы с нашим инструментом Quarkly. В этом уроке мы сделаем простое веб-приложение, которое будет показывать сотрудников компании. При создании приложения ни один сотрудник РЖД не пострадал.


Фронт будем делать при помощи Quarkly, а данные подтягивать из базы в Airtable. На выходе получим react-приложение, синхронизированное с базой данных.



Преамбула. Почему Airtable


Airtable популярный no-code инструмент, в котором вы можете делать свои базы данных большого объема. Выглядят они как таблицы, но имеют гораздо более мощный функционал. В частности, для нашего урока выбор Airtable обусловлен легким способом передачи данных по API.


Если вы впервые слышите про Airtable, перед началом работы не будет лишним почитать официальное руководство на сайте компании. Также советуем не стесняться и задавать вопросы в чатике Airtable Chat & Community в телеграм.


Фронтендная часть работ будет сделана в Quarkly, и для этого мы будем использовать всего два компонента:


  • Карточка сотрудника. В ней будут фото, текстовые данные и две кнопки: отправить email и позвонить. Эти данные карточка будет получать от родительского компонента обертки.
  • Обертка. Она будет принимать данные из Airtable, генерировать карточки и передавать в них данные.

Для тех, у кого нет времени вникать в пост в печатном формате, мы подготовили видео с субтитрами и таймкодами:




Часть 1. Делаем визуал в Quarkly


Создание карточки:


  1. Создадим новый проект в Quarkly, назовем его Airtable Example;
  2. Перейдем внутрь проекта;
  3. Добавим готовый блок с карточками сотрудников. Для этого кликаем на черную кнопку + посередине и выбираем блок из категории Team;



  4. Выбираем на панели слоев первую карточку (StackItem) и преобразуем её в компонент;



    Для этого нажмите на троеточие и выберите пункт Convert to Component. Назовем этот компонент EmployeeCard.

  5. Теперь мы можем свободно редактировать код этого react-компонента, но пока этого делать не будем и перейдем к созданию компонента-обертки.

Создание обертки:


  1. Подготовим обертку к преобразованию в компонент. Для этого сначала удалим оставшиеся три карточки, они нам не нужны;

  2. Теперь вытащим EmployeeCard из Stack. Затем преобразуем Stack в компонент, как мы уже делали ранее с EmployeeCard: правая панель, кнопка троеточие и Convert to Component. Компонент назовем EmployeeTable.



    На этом пока всё, подготовительный этап завершен. Оставим компоненты и займемся базой в Airtable.


Часть 2. Создаем базу данных в Airtable


Переходим на сайт Airtable и регистрируемся/авторизуемся.


  1. Кликаем на кнопку Add a base, чтобы создать новую базу. Из выпадающего меню выберите пункт Start with a template;

  2. Выбираем категорию HR & Recruiting и шаблон Employee directory. Далее кликаем на кнопку Use template;

  3. Переходим в созданный проект;


На данном этапе здесь мы ничего менять не будем, в текущем виде база уже нас устраивает.



Часть 3. Получаем доступ к API


Изначально Airtable интересен для нас именно за счет удобного API. При этом, что немаловажно, возможность забирать данные и отправлять их в нашу базу Airtable предоставляет бесплатно.


  1. Переходим на страницу выбора API проектов: https://airtable.com/api

  2. Выбираем наш проект Employee directory. В появившейся документации переходим на раздел AUTHENTICATION.

  3. Скопируйте две строчки, расположенные ниже заголовка EXAMPLE USING BEARER TOKEN (RECOMMENDED).

    У меня они выглядят так:

    $ curl https://api.airtable.com/v0/app2MdLITmRTBsrkg/Employee%20directory \
    -H "Authorization: Bearer YOUR_API_KEY"
  4. Теперь нам нужен YOUR_API_KEY. Это уникальный ключ доступа, который генерируется для каждого аккаунта. Найти его можно в настройках.

  5. На открывшейся странице перейдите в раздел API и нажмите на кнопку Generate API key;

  6. Скопируйте ключ. Сохраните его рядом со строчками из пункта 3. Они пригодятся нам далее.


Часть 4. Интегрируем базу Airtable в Quarkly


На этом этапе мы добавим в компонент EmployeeTable код, который будет забирать данные из API.


  1. Переходим в редактирование кода компонента. Для этого откроем вкладку Components и нажмем на кнопку <> у EmployeeTable (она появится при наведении курсора на компонент);

  2. Сейчас код компонента выглядит так:

  3. Заменим:

    import React from "react";
    

    на:

    import React, { useEffect, useState } from "react";
    

    Таким образом мы импортируем хуки useEffect и useState, которые помогут нам в дальнейшем;
  4. Ниже добавляем строчку, чтобы импортировать наш компонент EmployeeCard:

    import EmployeeCard from "./EmployeeCard";
    
  5. Заменим children (они нам пока не нужны) на override (пригодятся, чтобы выбирать элементы и стилизовать их на странице):

    const EmployeeTable = props => {const {children,rest} = useOverrides(props, overrides, defaultProps);
    

    на:

    const EmployeeTable = props => {const {override,rest} = useOverrides(props, overrides, defaultProps);
    
  6. Ниже добавим вызов хука useState, который будет следить за состоянием:

    const [employees, setEmployees] = useState([]);
    
  7. Далее добавим хук useEffect, который будет делать запросы к API Airtable и помещать полученные данные в наше состояние через функцию setEmployees.

    Добавляем сюда строчки, которые скопировали ранее. В fetch мы добавляем URL адрес нашей базы, добавляя параметр ?view=All%20employees. В headers мы добавляем параметры авторизации и непосредственно сам API ключ, который мы сгенерировали в 3 части этой статьи, подпункт 4.

    useEffect(() => {fetch("https://api.airtable.com/v0/appWw7KBKSc9bPjZE/Employee%20directory?view=All%20employees", {headers: {'Authorization': 'Bearer YOUR_API_KEY'}}).then(response => response.json()).then(data => setEmployees(data.records.map(({ fields }) => fields)));}, []);
    
  8. Теперь будем генерировать карточки из полученных данных, передавая им props с данными и override. Он нужен, чтобы выбирать и стилизовать элементы на странице.

    Меняем:

    return <Stack {...rest}>{children}</Stack>;};
    

    на:

    return <Stack {...rest}>{employees.map(employee => <EmployeeCard  {...override("employeeCard")}  employee={employee} />)}</Stack>;};
    
  9. Нажмите Ctrl + S (или Cmd + S на Mac). Окончательный код выглядит так:

    import React, { useEffect, useState } from "react";import { useOverrides, Stack } from "@quarkly/components";import EmployeeCard from "./EmployeeCard";const defaultProps = {"margin-top": "40px"};const overrides = {};const EmployeeTable = props => {const {override,rest} = useOverrides(props, overrides, defaultProps);const [employees, setEmployees] = useState([]);useEffect(() => {fetch("https://api.airtable.com/v0/appWw7KBKSc9bPjZE/Employee%20directory?view=All%20employees", {headers: {'Authorization': 'Bearer YOUR_API_KEY'}}).then(response => response.json()).then(data => setEmployees(data.records.map(({ fields }) => fields)));}, []);return <Stack {...rest}>{employees.map(employee => <EmployeeCard  {...override("employeeCard")} employee={employee} />)}</Stack>;};Object.assign(EmployeeTable, {...Stack,defaultProps,overrides});export default EmployeeTable;
    

    Важно: не забудьте вставить свой уникальный API ключ вместо текста YOUR_API_KEY.

Готово! Теперь мы получаем данные от Airtable, помещаем их в employees и проходимся по нему методом map. На каждую запись в employees мы создаем <EmployeeCard/>, в который передаем как пропс конкретные данные.


Осталось научить EmpolyeeCard принимать эти данные и показывать их в нужном месте.



Часть 5. Учим EmpolyeeCard работать с БД


Здесь мы научим карточку сотрудника принимать данные и показывать их.


  1. Откроем код компонента. Для этого заходим во вкладку Components, ищем там EmployeeCard, наводим курсор и жмем на кнопку <>.
  2. Сейчас код компонента выглядит так:

    import React from "react";import { useOverrides, Override, StackItem } from "@quarkly/components";import { Box, Text } from "@quarkly/widgets";const defaultProps = {"width": "25%","lg-width": "50%","sm-width": "100%"};const overrides = {"box": {"kind": "Box","props": {"height": "0","margin": "0 0 20px 0","padding-bottom": "100%","background": "url(http://personeltest.ru/aways/images.unsplash.com/photo-1503443207922-dff7d543fd0e?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=582&q=80) 50% 0/cover no-repeat"}},"text": {"kind": "Text","props": {"color": "--grey","margin": "0","children": "CEO"}},"text1": {"kind": "Text","props": {"as": "h3","font": "--headline3","margin": "5px 0 20px 0","children": "Nathan K. Joe"}},"text2": {"kind": "Text","props": {"as": "p","margin": "20px 0 5px 0","children": "This space is 100% editable. Use it to introduce a team member, describe their work experience and role within the company. This is also a great place to highlight a team member's strong sides."}}};const EmployeeCard = props => {const {override,children,rest} = useOverrides(props, overrides, defaultProps);return <StackItem {...rest}><Override slot="StackItemContent" flex-direction="column" /><Box {...override("box")} /><Text {...override("text")} /><Text {...override("text1")} /><Text {...override("text2")} />{children}</StackItem>;};Object.assign(EmployeeCard, { ...StackItem,defaultProps,overrides});export default EmployeeCard;
    
  3. Ищем строчку:

    } = useOverrides(props, overrides, defaultProps);
    

    и добавляем ниже:

    const { employee = {} } = rest;
    

    В объект employee помещаем наши данные.
  4. На примере фотографии сотрудника проверим, что всё работает, как нужно. Ищем строку и меняем:

    <Box {...override("box")} />
    

    на:

    <Box {...override("box")} background-image={`url(${employee.Photo && employee.Photo[0] && employee.Photo[0].url})`}/>
    

    Также ищем:

    "background": "url(http://personeltest.ru/aways/images.unsplash.com/photo-1503443207922-dff7d543fd0e?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=582&q=80) 50% 0/cover no-repeat"
    

    и меняем на:

    "background-size": "cover","background-position": "center","background-image": "url(http://personeltest.ru/aways/images.unsplash.com/photo-1503443207922-dff7d543fd0e?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=582&q=80) 50% 0/cover no-repeat"
    

    Должно получится так:

  5. Смотрим, какие поля у нас есть. Документация для API в Airtable сделана очень хорошо. Название полей можно посмотреть в https://airtable.com/api, выбрав свою базу.

    Далее ищем раздел EMPLOYEE DIRECTORY TABLE.

    Итак, у нас есть:

    Name
    Department
    Home address
    Email address
    DOB
    Start date
    Phone
    Reports to
    Title
    Status
    Photo
    Location
  6. Добавим Title. Для этого заменим:

    <Text {...override("text")} />
    

    на:

    <Text {...override("title")} children={employee.Title} />
    

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

    Меняем:

    "text": {"kind": "Text","props": {"color": "--grey","margin": "0","children": "CEO"}},
    

    на:

    "title": {"kind": "Text","props": {"color": "--grey","margin": "0","children": "Title"}},
    

    Сохраняем и проверяем:



    Результат: в карточки добавилась строка с профессией.
  7. Повторим такие же действия для Name и Home address.

    Заменим:

    <Text {...override("text1")} /><Text {...override("text2")} />
    

    на:

    <Text {...override("name")} children={employee.Name} /><Text {...override("address")} children={employee['Home address']} />
    

    И поправим их overrides. Для этого заменим:

    "text1": {"kind": "Text","props": {"as": "h3","font": "--headline3","margin": "5px 0 20px 0","children": "Nathan K. Joe"}},"text2": {"kind": "Text","props": {"as": "p","margin": "20px 0 5px 0","children": "This space is 100% editable. Use it to introduce a team member, describe their work experience and role within the company. This is also a great place to highlight a team member's strong sides."}}
    

    на:

    "name": {"kind": "Text","props": {"as": "h3","font": "--headline3","margin": "5px 0 5px 0","children": "Name"}},"address": {"kind": "Text","props": {"as": "p","margin": "10px 0 5px 0","children": "Home address"}},
    

    Сохраняем и снова проверяем:

  8. Добавим ещё несколько Text по аналогии. Для простоты мы не будем брать Department и Reports to, потому что эти данные находятся в другой базе DEPARTMENTS TABLE.

    Добавляем:

    <Text {...override("address")} children={employee['Home address']} /><Text {...override("Start date")} children={`Start date: ${employee['Start date']}`} /><Text {...override("Status")} children={employee['Status']} /><Text {...override("DOB")} children={`Birth date: ${employee['DOB']}`} />
    

    и

    "address": {"kind": "Text","props": {"as": "p","margin": "10px 0 5px 0","children": "Home address"}},"Start date": {"kind": "Text","props": {"as": "p","margin": "10px 0 5px 0","children": "Start date"}},"Status": {"kind": "Text","props": {"as": "p","margin": "10px 0 5px 0","children": "Status"}},"DOB": {"kind": "Text","props": {"as": "p","margin": "10px 0 5px 0","children": "Birth date"}},
    

    Проверяем результат:

  9. Теперь добавим два компонента Link, в которых у нас будут Phone и Email:

    import { Box, Text } from "@quarkly/widgets";
    

    меняем на:

    import { Box, Text, Link } from "@quarkly/widgets";
    

    И добавляем следующие строки:

    <Link {...override("Email address")} children={employee['Email address']} href={`mailto:${employee['Email address']}`} /><Link {...override("Phone")} children={employee['Phone']} href={`tel:${employee['Phone']}`}/>
    

    Не забыв про их overrides:

    "Email address": {"kind": "Link","props": {"margin": "10px 0 5px 0","color": "--primary","text-decoration": "none","children": "Email"}},"Phone": {"kind": "Link","props": {"margin": "10px 0 5px 0","color": "--primary","text-decoration": "none","children": "Phone"}},
    

    Проверяем результат:


Финально наш код выглядит так:

import React from "react";import { useOverrides, Override, StackItem } from "@quarkly/components";import { Box, Text, Link } from "@quarkly/widgets";const defaultProps = {"width": "25%","lg-width": "50%","sm-width": "100%"};const overrides = {"box": {"kind": "Box","props": {"height": "0","margin": "0 0 20px 0","padding-bottom": "100%","background-size": "cover","background-position": "center","background-image": "url(http://personeltest.ru/aways/images.unsplash.com/photo-1503443207922-dff7d543fd0e?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=582&q=80) 50% 0/cover no-repeat"}},"title": {"kind": "Text","props": {"color": "--grey","margin": "0","children": "title"}},"name": {"kind": "Text","props": {"as": "h3","font": "--headline3","margin": "5px 0 5px 0","children": "Name"}},"address": {"kind": "Text","props": {"as": "p","margin": "10px 0 5px 0","children": "Home address"}},"Start date": {"kind": "Text","props": {"as": "p","margin": "10px 0 5px 0","children": "Start date"}},"Status": {"kind": "Text","props": {"as": "p","margin": "10px 0 5px 0","children": "Status"}},"DOB": {"kind": "Text","props": {"as": "p","margin": "10px 0 5px 0","children": "Birth date"}},"Email address": {"kind": "Link","props": {"margin": "10px 0 5px 0","color": "--primary","text-decoration": "none","children": "Email"}},"Phone": {"kind": "Link","props": {"margin": "10px 0 5px 0","color": "--primary","text-decoration": "none","children": "Phone"}},};const EmployeeCard = props => {const {override,children,rest} = useOverrides(props, overrides, defaultProps);const { employee = {} } = rest;return <StackItem {...rest}><Override slot="StackItemContent" flex-direction="column" /><Box {...override("box")} background-image={`url(${employee.Photo[0].url})`}/><Text {...override("title")} children={employee.Title} /><Text {...override("name")} children={employee.Name} /><Text {...override("address")} children={employee['Home address']} /><Text {...override("Start date")} children={`Start date: ${employee['Start date']}`} /><Text {...override("Status")} children={employee['Status']} /><Text {...override("DOB")} children={`Birth date: ${employee['DOB']}`} /><Link {...override("Email address")} children={employee['Email address']} href={`mailto:${employee['Email address']}`} /><Link {...override("Phone")} children={employee['Phone']} href={`tel:${employee['Phone']}`}/>{children}</StackItem>;};Object.assign(EmployeeCard, { ...StackItem,defaultProps,overrides});export default EmployeeCard;

Делаем коммит в GitHub и публикуем на Netlify:





Ждем несколько минут и проверяем: https://keen-varahamihira-c54ae1.netlify.app/



Для проверки синхронизации меняем данные в базе:


Теперь они появятся в приложении:


В дальнейшем мы можем как угодно стилизовать наши элементы с карточками, не нарушая настроенный импорт из Airtable. Пример можно посмотреть здесь.


Репозиторий на GitHub: https://github.com/quarkly-dev/Getting-data-from-Airtable-tutorial


Спасибо за внимание!


Если у вас остались вопросы не стесняйтесь задавать их в комментариях. В следующем уроке рассмотрим ещё один пример работы с данными, покажем как интерактивно их визуализировать, дав возможность пользователю менять фильтры прямо в приложении.

Подробнее..

Делаем интерактивный Big Mac Index на React и Quarkly

20.03.2021 14:15:19 | Автор: admin

Привет! Для начала процитирую страницу из Википедии, да будет здоров Джимми Уэйлс и все редакторы, поддерживающие свободную энциклопедию. Согласно ней, индекс бигмака это неофициальный способ определения паритета покупательной способности. Если проще, этот индекс довольно наглядно показывает уровень цен в стране, ведь в основе стоимости бигмака: две мясных котлеты гриль, специальный соус, сыр, огурцы, салат и лук, всё на булочке с кунжутом Кроме этого, конечно же, в ценник заложены аренда помещений и оборудования, рабочая сила и многие другие факторы.


Важно и другое: милые сердцу многих рестораны с желтой буквой M имеют обширнейшую сеть, что дает возможность сравнить цены почти по всему миру. Исследования ведутся с 1986 года и постоянно актуализируются журналом The Economist.


Мы визуализировали имеющиеся в свободном доступе данные и собрали простое приложение, используя React и наш проект Quarkly.




Пост получился бы менее интересным без технической части, хотя поиграться с числами и посмотреть, сколько бигмаков вы могли себе позволить несколько лет назад на свою зарплату в Израиле или, например, во Вьетнаме, путешествуя как настоящий кочевник, тоже интересно.


Не агитируем брать валютные ипотеки, ориентируясь на индекс бигмака (к слову, в странах Африки есть ещё и индекс KFC), наш пост чуть об ином. Основной нашей задачей было посмотреть на практике, насколько просто и быстро получится реализовать подобную задумку, работая лишь в одном инструменте. Коротко про человекочасы в самом конце поста.


Часть 1. Пишем код компонента с нуля


Записали видео всего процесса с русскими и английскими субтитрами. В описании есть таймкоды, чтобы сэкономить время и посмотреть только то, что вам интересно.



Всю кодовую часть пишем внутри Quarkly.io, используя хуки. Данные подтягиваем из базы, которая есть в свободном доступе на гитхабе.


Часть 2. Настраиваем визуал приложения


Прелесть в том, что для этого нам не нужно переключаться на другой инструмент и продумывать логики того, как связать наш код и дизайн.


В Quarkly всё уже находится под рукой.



Начинать стилизацию не нужно с чистого листа, поскольку структура и логики уже были созданы на предыдущем этапе. Это сильно экономит время.


Смотрим на результат


Приложение доступно по ссылке bigmaconomics.com.


На всю работу с учетом написания кода компонента и последующей донастройки визуала ушло около 15 часов с перерывами, поделившими процесс на два дня. Вероятно, можно было управиться быстрее, но такой задачи изначально не стояло. Было интересно понять, насколько проект подходит для практического решения подобной задачи в целом.


Приглашаем в наше комьюнити Quarkly в телеграме, где мы делимся новостями про апдейты и отвечаем на вопросы.

Подробнее..

Категории

Последние комментарии

  • Имя: Макс
    24.08.2022 | 11:28
    Я разраб в IT компании, работаю на арбитражную команду. Мы работаем с приламы и сайтами, при работе замечаются постоянные баны и лаги. Пацаны посоветовали сервис по анализу исходного кода,https://app Подробнее..
  • Имя: 9055410337
    20.08.2022 | 17:41
    поможем пишите в телеграм Подробнее..
  • Имя: sabbat
    17.08.2022 | 20:42
    Охренеть.. это просто шикарная статья, феноменально круто. Большое спасибо за разбор! Надеюсь как-нибудь с тобой связаться для обсуждений чего-либо) Подробнее..
  • Имя: Мария
    09.08.2022 | 14:44
    Добрый день. Если обладаете такой информацией, то подскажите, пожалуйста, где можно найти много-много материала по Yggdrasil и его уязвимостях для написания диплома? Благодарю. Подробнее..
© 2006-2024, personeltest.ru