Задать вопрос
  • Можно ли у swiper js убрать навигацию если слайдов меньше 5?

    DanArst
    @DanArst Куратор тега JavaScript
    Гриффиндор в моде при любой погоде!
    Если у вас отображается по 5 слайдов и общее количество равно 5, то у стрелок навигации будет класс .swiper-button-disabled. Просто добавьте следующий стиль:
    .swiper-button-disabled{
        display:none;   
    }
    Ответ написан
    Комментировать
  • Как перебить цвет input'а при автозаполнении в Chrome?

    PetrNet
    @PetrNet
    Очень даже просто!
    Решил так:
    box-shadow: inset 20px 20px 0px 20px #f3f2eb
    Ответ написан
    1 комментарий
  • Как запретить масштабирование на веб-сайте?

    iiil
    @iiil
    Инженер и вэб-дизайнер, рисую.
    В связи с уточнением: никак. Масштаб страницы - фундаментальная вещь, масштаб нужен, например, для слабовидящих людей. В том же firefox есть возможность изменять не только весь масштаб, а только текст.
    Желание запретить масштабирование, даже если бы это было возможно, противоречит концепции доступности информации.
    Поэтому верстать надо так, чтобы сайт смотрелся читаемо (пусть и не так красиво) при любом масштабе, а также при масштабировании только текста.
    И это единственно правильный ответ.
    Ответ написан
    2 комментария
  • Когда использовать 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 комментарий
  • Как подключать шрифты и CSS Reset к приложению на Styled Components?

    freislot
    @freislot
    Frontend-разработчик
    я использовал global в вашей ситуации вот пример
    функция fontFace подключает шрифты, require их загружает из указанной папки, в итоге подключение выглядит так

    ${fontFace('HelveticaNeue', 'HelveticaNeueCyr-Bold', 600, 'normal')}


    import { createGlobalStyle } from 'styled-components';
    
    export function fontFace(name, src, fontWeight = 'normal', fontStyle = 'normal'){
        /* eslint-disable */
        return `
          @font-face{
              font-family: "${name}";
              src: url(${require('../../../../fonts/' + src + '.eot')});
              src: url(${require('../../../../fonts/' + src + '.eot')}?#iefix) format("embedded-opentype"),
                   url(${require('../../../../fonts/' + src + '.woff')}) format("woff"),
                   url(${require('../../../../fonts/' + src + '.ttf')}) format("truetype"),
                   url(${require('../../../../fonts/' + src + '.svg')}#${name}) format("svg");
    
              font-style: ${fontStyle};
              font-weight: ${fontWeight};
          }
      `;
    }
    
    export const GlobalStyle = createGlobalStyle`
      ${fontFace('HelveticaNeue', 'HelveticaNeueCyr-Thin', 100, 'normal')}
      ${fontFace('HelveticaNeue', 'HelveticaNeueCyr-Light', 300, 'normal')}
      ${fontFace('HelveticaNeue', 'HelveticaNeueCyr-Roman', 'normal', 'normal')}
      ${fontFace('HelveticaNeue', 'HelveticaNeueCyr-Medium', 500, 'normal')}
      ${fontFace('HelveticaNeue', 'HelveticaNeueCyr-Bold', 600, 'normal')}
    
      *{
        box-sizing: border-box;
      }
    
      a{
        color: #17b0e7;
        text-decoration: none;
      }
    
      body{
        font-family: 'HelveticaNeue';
      }
    `;
    Ответ написан
    1 комментарий
  • Зачем Redux Saga если есть Redux Thunk?

    Serhiy_Koziuk
    @Serhiy_Koziuk
    Redux-saga — это альтернативный подход к организации сайд-эффектов. Вместо того, чтобы диспатчить функции, которые обрабатываются redux-thunk-ом, вы создаёте сагу, которая собирает всю логику обработки внутрь себя. В отличие от thunk-ов, которые выполняются, когда вы их диспатчите, саги запускаются при старте приложения и как бы «работают в фоне». Саги слушают все экшены, которые диспатчит стор, и решают, что делать с ними.

    И у саг в редаксе два преимущества по сравнению с thunk-ами:
    — Они позволяют организовывать сложные последовательности сайд-эффектов
    — И они очень легко тестируются
    Ответ написан
    1 комментарий
  • В чём разница между reselect и хуками useCallback и useMemo?

    alex4answ
    @alex4answ
    Это очень разные вещи:

    1. useCallback - мемоизирует саму функцию, а не ее результат
    2. useMemo - мемоизирует результат функции
    3. Reselect - это вообще редаксовская штука, мемоизирует результаты селектора, и выстраивает зависимости одного от другого, если результат зависимого селектора не обновился - реселект не будет пересчитывать селектор. кароче говоря оптимизация.
    Ответ написан
    Комментировать
  • Ссылочный тип данных JavaScript?

    mr_T
    @mr_T
    Web-разработчик
    В первом случае ты передаешь в newArr указатель на массив, потом изменяешь этот же массив через указатель arr.
    Во втором случае ты снова передаешь указатель в переменную newArr, а потом просто присваиваешь переменной arr другое значение, то есть убираешь из нее указатель, но не затираешь само значение. Мало того - ты вручную вообще никак не затрешь значение любого объекта, ты можешь только "забыть" о нем, а уберет его за тебя уже либо сборщик мусора, либо просто вся выделенная память затрется при перезагрузке страницы.
    Ответ написан
    Комментировать
  • Что такое jsonp и как им пользоваться?

    kirill89
    @kirill89
    Это технология для выполнения запроса к другому домену (через обчный XHR это не возможно).

    В двух словах работает это следующим образом:

    В head страницы добавляется новый тег script с src установленным в адрес запроса и параметры (например "www.example.com/?id=1&jsonp=myCallback").

    Как вы понимаете этот скрипт будет загружен браузером несмотря на домен на котором мы находимся.

    При этом ответная сторона (example.com) в тело этого скрипта вернет не просто JSON, а вызов javascript функции указанной в jsonp параметре (мы разумеется эту функцию должны заблаговременно объявить).
    Пример ответа от example.com: myCallback({ "user": "Rrooom", "message": "test" });

    Это не плохой способ обойти проблему кросс доменных запросов, но возможен только GET.
    Ответ написан
    1 комментарий
  • Как конвертировать объект в formdata?

    0xD34F
    @0xD34F Куратор тега JavaScript
    const fd = Object.entries(data).reduce((fd, n) => (fd.append(...n), fd), new FormData);
    Ответ написан
    Комментировать
  • Работает ли PHP на GitHub Pages?

    Можно gh pages с помощью AJAX отправлять формы в google forms
    Вот рабочий вариант https://github.com/jsdevel/google-form
    Ответ написан
    2 комментария
  • Как сделать hover на svg?

    Exomode
    @Exomode
    Архитектор ПО
    Для того, чтобы на вашем векторном канвасе работали все события js и css, вам нужно в разметку вашего документа (страницы) непосредственно внедрить полную разметку вашего svg. Далее вы можете с ним делать что угодно, словно это любой другой DOM-элемент. Доступ к дочерним элементам типа g или path так же сохранится с теми же событиями. Если вы подгрузите в документ свой вектор svg как <img src="some.svg" alt="svg" /> или в таком духе, ваши события, разумеется, не будут работать, ни в css, ни в js.
    Ответ написан
    Комментировать
  • Как использовать 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 вам, действительно, понадобится на практике.
    Ответ написан
    Комментировать
  • Как настроить Reformat code в PHPStorm?

    delphinpro
    @delphinpro Куратор тега PhpStorm
    frontend developer
    File | Settings | Editor | Code Style
    Опция "Hard wrap at"
    Общая и по отдельности для каждого языка.
    Ответ написан
    Комментировать
  • Замена CD-ROM на SSD/HDD в ноутбуках?

    @GRadiation
    Хочу предупредить о нескольких нюансах:
    1. переходник может не иметь ушка крепления к матплате, у ушко с родного привода может не подойти — я вырезал новое ножницами из консервной банки
    2. переходник может оказаться меньше вашего dvd-привода по высоте и в отсеке останется довольно большая щель
    3. фальш-панель (bezel) от Asus a53s (подозреваю что ни от одного современного ноута) не подходит к Espada SS95 расположением одной защелки. Получается что либо я оставляю фальш-панель из комплекта переходника, а она совершенно не подходит по дизайну, либо спиливаю одну из защелок родной панели и приклеиваю её на переходник, это поможет мне прикрыть ту самую щель из пункта 2.
    При этом родную панель уже не восстановить, а на ebay она стоит $30.
    4. качество сборки внешнего бокса для dvd-rom может быть просто отвратительным (espada usd01) и придется ножницами расширять отверстия под болты

    В общем, не расчитывайте, что все будет легко как в лего. Покупая дешевые китайские переходники надо быть готовым допилить их руками.
    Ответ написан
    Комментировать
  • Как добавлять сайты в open server?

    Проблема в файле host, у Open Server нет прав на редактирование файла host, а по умолчанию там только localhost. Просто задайте права и все.
    Ответ написан
    3 комментария
  • SetTimeout 0, костыль ли и чем заменить?

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

    Во-первых, почему бы не использовать virtual dom и вычислять все до того, как элемент вставится в DOM?
    Во-вторых, почему бы не использовать кастомные события, на которых и построить все взаимодействия? Называется event-driven architecture, EDA. Как только скопируете, вычислите и проверите, триггерите событие `element-loaded` и по событию уже вставляете в DOM.
    В-третьих, почему бы не брать ширину и высоту элемента, которого клонируем? Тогда вообще все мгновенно будет. Не совсем ясен смысл получения ширины \ высоты склонированного элемента, если учесть, что они одинаковые должны быть у оригинала и клона.
    Ответ написан
    3 комментария
  • Как передать данные в js файл?

    Я бы посмотрел на это не со стороны php, а с javascript. Пусть Ваш javascript "спрашивает" (тем же ajax'ом) у веб-сервера данные, который в свою очередь, через php-скрипт вернет ему нужные данные. Лично я юзаю ajax от jQuery, все просто, и я доволен как слон :)
    Ответ написан
    Комментировать
  • Мониторы с матрицей 10 бит поддерживают ли не профессиональные видеокарты в графических редакторах и играх?

    @premo96
    Я на 1060 6gb чекнул градиент в фотошопе, показывает не в полном экране 10 бит. Ранее говорилось что в openGL будет показывать только в полноэкранном режиме 10 бит на не проф. картах. DirectX 10 и 12 поддерживает и так и так. Работает только через display port. Вроде еще в новом hdmi порте тоже можно, но он выйдет хзе когда )
    Ну а так если не знаешь где смотреть, то и разницы не увидишь, переходы обычно не такие резкие как в тестовых файлах/прогах. Ну а если фильм смотреть, то madvr вообще убирает переходы градиентов даже на 6 битном монике.
    Ответ написан
    5 комментариев
  • Как получить src?

    KickeRocK
    @KickeRocK
    FrontFinish
    const allLinks = document.querySelectorAll('.slide-img a');
    allLinks.forEach(el=>el.addEventListener('click',function(e){
    e.preventDefault();
    console.log(el.querySelector('img').getAttribute('src'));
    });
    Ответ написан
    1 комментарий