• Работаю с NextJS? Когда использовать SSG, а когда SSR?

    @vovashaplin Автор вопроса
    Static - автоматическая генерация статики без данных ( просто html без данных из сервера )
    SSG - автоматическая генерация статики и JSON с данными ( html с json, в который во время билда внеслись данные)
    SSR - рендеринг на стороне сервера на момент перед показом страницы ( запрос на сервер -> приход данных -> показ страницы пользователю )

    SSG ( getStaticProps и getStaticPaths ) нужен для показа страниц или страниц товаров лишь в том случае, если данные на этх страницах меняются не так часто, потому что нужно делать build каждый раз после смены данных на БД. Но данный способ очень быстрый.
    Но если ваши данные меняются часто, вы или заказчик часто обновляете контент страниц и товаров, то на помощь придет SSR ( getServerSideProps ). Данный способ медленнее чем SSG, но быстрее чем дефолтный запрос на стороне клиента (SPA).

    - главная страница ( просто информативная) Static или SSG
    - страница с товарами, пагинацией, сортировкой и поиском SSR или SSG
    - корзина SSR
    - страница с заполнением заказа SSR
    - страница смены данных пользователя SSR
    - регистрация и вход SSR
    - админ панель для изменения и добавления товаров SSR

    Если есть поправки или думаете что я где-то не прав, пишите.
    Ответ написан
    3 комментария
  • Что делать с варнингом: "VirtualizedList: You have a large list that is slow to update"?

    RomReed
    @RomReed
    JavaScript, Flutter, ReactNative, Redux, Firebase
    это просто предупреждение что ваш список долго рендерится и предлагается поискать возможность для его оптимизации например переписать renderItem с PureComponent или прописать shouldComponentUpdate
    Ответ написан
    Комментировать
  • Как использовать useStore, useSelector, useDispatch hook?

    rockon404
    @rockon404 Куратор тега React
    Frontend Developer
    1. useDispatch - получение функции store.dispatch в компоненте. Раньше для вызова action функциональный компонент приходилось оборачивать в вызов connect:
    const Foo = ({ dispatch }) => {
      const handler = useCallback(() => {
        dispatch(action());
      }, []);
    
      return (
        <Bar onClick={handler} />
      );
    };
    
    export default connect()(Foo);


    Сейчас:
    const Foo = () => {
      const dispatch = useDispatch();
    
      const handler = useCallback(() => {
        dispatch(action());
      }, []);
    
      return (
        <Bar onClick={handler} />
      );
    };
    
    export default Foo;


    2. useSelector - маппинг значения из store.
    Раньше:
    const Foo = ({ value }) => {
      return (
        <Bar value={value} />
      );
    };
    
    const mapStateToProps = state => ({
      value: state.value,
    });
    
    export default connect(mapStateToProps)(Foo);


    const Foo = () => {
      const value = useSelector(state => state.value);
    
      return (
        <Bar value={value} />
      );
    };
    
    export default Foo;


    3. useStore - получение store целиком:
    const valueSelector = state => state.value;
    
    const Foo = () => {
      const { dispatch, getState, subscribe } = useStore();
      const value = valueSelector(getState());
      
      useEffect(() => subscribe(console.log), []);
    
      const handler = useCallback(() => {
        dispatch(action());
      }, []);
    
      return (
        <Bar onClick={handler} value={value} />
      );
    };
    
    export default Foo;

    Вряд ли useStore вам, действительно, понадобится на практике.
    Ответ написан
    Комментировать
  • Когда использовать useCallback, useMemo и useEffect?

    @LEXA_JA
    useEffect - это хук, который позволяет использовать сайд эффект. В классах его аналогом было использование componentDidMount, componentDidUpdate и componentWillUnmount. В нем можно делать подписки, отправлять запросы управлять анимацией и т. д.
    const [data, setData] = useState(null);
    
    useEffect(() => {
      const controller = new AbortController()
      fetchData(controller.signal).then(setData)
    
      return () => controller.abort()
    }, [fetchData, setData])


    useCallback и useMemo предназначены для оптимизации. useCallback получает на функцию и массив аргументов, и возвращает одну и туже функцию, до тех пор, пока аргументы не изменились. useMemo отличается тем, что он возвращает не саму функцию, а результат её выполнения. По большому счету они являются взаимозаменямыми.
    Таким образом, useMemo используется для сохранения результатов тяжёлых вычислений, например обработка массива.
    const data = useMemo(() => array.map(mapper).filter(predicate).reduce(reducer), [array])

    А useCallback используется, когда важна постоянность ссылок на функцию. Например, когда мы передаём ссылку в компонент, который использует React.PureComponent или React.memo, или, когда функция используется в качестве аргумента в других хуках
    const handler = useCallback(() => {
      // что-то сделать 
    }, [])
    
    useEffect(() => {
      handler(value)
      // если не использовать useCallback, эффект будет срабатывать постоянно 
    }, [handler, value])
    Ответ написан
    1 комментарий
  • Как правильно делать вёрстку мобильных приложений на react native?

    @Maxim16
    Аналогом процентов в той версии Flexbox, которая применяется в React Native, является свойство flex.
    Например, если у нас есть два элемента , которые вложены в родительский элемент , то можно сделать у первого вложенного в стилях свойство flex:5, а у второго - flex:3. В этом случае первый элемент будет занимать 5/8 от площади родительского элемента, а второй 3/8. Учитывая это, и поэкспериментировав со свойствами alignItems и justifyContent, я думаю, можно добиться нужного отступа без использования margin.
    Ответ написан
    2 комментария
  • Как проектировать компоненты во Vue.js?

    notiv-nt
    @notiv-nt
    Как ваше ничего? Да, моё тоже
    Берите пример с уже готовых наборов https://www.codeinwp.com/blog/vue-ui-component-lib...

    <md-button class="md-primary">Primary</md-button>
    <v-btn small color="primary">Primary</v-btn>
    <fish-button type="primary">Primary</fish-button>
    <q-btn color="primary" label="Primary" />
    <el-button type="primary">Primary</el-button>
    <b-button variant="success">Button</b-button>
    <Button type="primary">Primary</Button>
    <Button primary">Primary</Button>


    + как совет из опыта
    Почитайте про utility-first подход

    https://blog.usejournal.com/utility-first-css-ridi...
    https://frontstuff.io/in-defense-of-utility-first-css
    ... и прочее из гугла

    Как минимум отступы не входят в сам компонент, так что их нужно ставить отдельно, так как отступ это пустое пространство от 1 и до 2го компонента

    пример
    <md-button class="u-mb20 md-primary">Primary</md-button>
    Ответ написан
    2 комментария
  • Можно ли задавать шрифту min и max размер?

    @Dolosweb
    Во первых зачем? во вторых на что будет реагировать это изменение?
    стандартными методами css - нет
    с помощью javscript - да
    Ответ написан
    Комментировать
  • Как быстро осуществлять нейминг css классов для разносортных секций?

    SeaInside
    @SeaInside
    15 лет пилю все эти штуки
    Ну тут скорее не вопрос, а крик души, который можно поддержать.

    По делу: да, проблема есть, именовать на больших проектах сложно. Решений нет.
    Вернее, только те, которые вам кажутся "грязными", но других не завезли (и не завезут).
    И те, которые не относятся к разработке (вроде "дать люлей дизайнеру, который не понимает, как это всё работает, и лепит каждый элемент как попало")

    Тут просто надо несколько абстрагироваться и принять то, что абсолютно в любой объёмной системе, даже если её вдруг пишет один человек (что вряд ли), всегда есть место неочевидным вещам. Перфекционист внутри рыдает, но что делать.

    Откройте любое масштабное решение - чёрт ногу сломит, не так ли? И требуется немало времени, чтобы вникнуть. Потом вникаешь - и становится проще, но всё равно много нагромождено. А если выпасть из контекста на месяц - потом опять заново вникать. Это норма (картинка с Малышевой).

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

    Совмещение ваших пунктов 1 и 3 в одно - вполне здоровый стиль.
    Если секция, где всё очевидно: about, gallery, text-section, etc.
    Если контент неоднородный - именовать по смыслу (как в 3).

    Единственное что мог бы посоветовать - не смущаться добавлять новые компоненты, задавая им какой-то дополнительный неймспейс (contacts-header, contacts-about), а не пытаться всё упихать в один общий с помощью модификаторов - в поддержке будет проще.

    Просто размышления от прочитанного:
    1. Подходы 2 ("section-1", "section-2") и 4 (атомарщина) - в аду для таких "специалистов" стоит отдельный котёл. Ну вы и сами понимаете. Использовать нужно никогда.
    2. Инкапсуляция имён ничего не даёт в этом отношении, так как это придумано для элементов внутри блока (а с этим и концепция БЭМ хорошо справляется), глобально вам как разработчику всё равно нужно иметь понятное "корневое" название блока.

    Ещё можно поработать со своей головой, возможно, что такой крик души идёт от страха быть осуждённым. Браузеру-то всё равно, вы ему хоть .qwerty123 { ... } скормите - нормально отобразится.
    Понятные имена - для разработчиков, и надо понимать, что ни один толковый разработчик в вас камнем не бросит за то, что вы дали блоку имя .contacts-footer-call-to-action, если у вас этот самый .call-to-action в каждой секции настолько разный, что в один компонент не умещается.
    Иногда помогает, если есть прямой выход на клиента или ЛПР донести, что такой дизайн... Ну не самый лучший для поддержки, и обосновать почему.
    А чисто технически - решений нет, ну, вот такая работа, чё делать.
    Ответ написан
    2 комментария
  • Как себя направлять в обучении, почему через 4 года опыта работы я все еще плохо программирую?

    PageAuditRU
    @PageAuditRU
    Senior SEO Анализатор
    Вам на работе нужен ментор и код-ревьюер.

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

    badJaguar
    @badJaguar
    Full-Stack Software Engineer
    Всё время голову ломал как это гуглить))
    Ответ написан
    1 комментарий
  • Почему не срабатывают события change и input после изменения значения value в input?

    0xD34F
    @0xD34F Куратор тега Vue.js
    Во-первых, потому что события вообще не срабатывают - никакие и никогда. Говорить "срабатывает событие" - безграмотно. Срабатывают обработчики событий. Во-вторых, значение вы меняете посредством клика по кнопке, а не вбиваете его в input. То есть, те события, которые вы ждёте - они не происходят, нечего обрабатывать.

    Хотите следить за любыми изменениями значения - используйте v-model + watch:

    <input v-model="text">

    watch: {
      text(newVal, oldVal) {
        console.log(newVal, oldVal);
      },
    },
    Ответ написан
    2 комментария
  • Как сверстать под неизвестный размер монитора?

    alex_shevch
    @alex_shevch
    Frontend Developer
    Я как многомудрый опытный сварщик, пришёл спросить какой стороной держать паяльник.

    "через вычисление скриптом размеров рабочей области" - что?
    Просто задаёте максимальную ширину контейнера, саму ширину в 100%, центруете, задаёте небольшой padding - вот вам контейнер под любой размер монитора.

    Если совсем не понимаете, попробуйте использовать заготовку от какого-нибудь бутстрапа.

    Успехов!
    Ответ написан
    3 комментария
  • За и против встроенного в HTML base64/png?

    JAUD1LA
    @JAUD1LA
    Software Engineer at EPAM Systems, Inc.
    В вашу и base64 защиту скажу: есть определенные ситуации, когда невозможно обойтись без инлайн-вставки изображений, одна из них - страница ошибки 500. Сервер лежит, ассеты не подгрузить, все должно быть заинлайнено, включая изображения и стили. В данном случае base64 вас спасёт.
    Ответ написан
    Комментировать
  • Как объединить массивы?

    john36allTa
    @john36allTa
    alien glow of a dirty mind
    const tGraphData = graphData.map( item => {
    	item.color = (c = colorsList.find(color => color.id === item.title)) ? c.value : null
    	return item
    });
    Ответ написан
    Комментировать
  • За и против встроенного в HTML base64/png?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега CSS
    1. Увеличивается размер ресурса.
    2. Теряется атомарность изменений - поменяли какое-то свойство в CSS, весь файл инвалидировался в кеше, клиенту нужно заново качать картинку, хотя она и не изменилась.
    3. Дизайнер не сможет просто отредактировать изображение.
    4. Нельзя посмотреть изображение в редакторах.
    Ответ написан
    6 комментариев
  • Не срабатывает свойство CSS при динамической вставке в JS?

    fallus
    @fallus
    Ну, у вас в оригинальной разметке есть перенос строки.
    Браузер понимает, что эти «слова» разделены между собой.
    Либо поставьте перенос строки, либо после каждого <span> поставьте пробел.
    <div class="block"><span>1</span> <span>2</span> <span>3</span></div>


    *если нет переноса строки или пробела, то это типо как одно слово получается. А text-align: justify не разрывает слова.
    Ответ написан
    Комментировать
  • Как подключить как диск sftp доступ который есть у пользователя?

    @Spheniscus
    www.sftpnetdrive.com - бесплатно для некоммерческого использвания.
    Ответ написан
    Комментировать
  • Как узнать margin-right элемента через js?

    v3shin
    @v3shin
    Веб-шаман
    getComputedStyle(myElement); // получить все стили
    getComputedStyle(myElement).marginRight; // получить margin-right
    Ответ написан
    Комментировать
  • Как узнать margin-right элемента через js?

    sergski
    @sergski
    web-developer
    const el = document.querySelector(".div");
    const getprop = window.getComputedStyle(el, null).getPropertyValue("margin-right");
    Ответ написан
    2 комментария