Задать вопрос
  • Как правильно использовать паттерн MVC?

    black1277
    @black1277
    Вольный стрелок
    Касательно вашего случая - напишите схематично каркас вашего приложения, оптимально с вашей точки зрения, без конкретной реализации методов. А затем задайте себе вопрос - в скольких местах потребуется править уже готовый код, если понадобится добавить нового персонажа, или новое действие, или новый предмет, или изменить свойства уже существующего объекта или изменить его поведение. Чем меньше потребуется правок при изменениях и расширениях - тем ближе код к оптимальному.
    А пытаться применить некий паттерн ради паттерна - значит загнать себя в угол.
    Ответ написан
    Комментировать
  • Как поставить сайт в no-index?

    black1277
    @black1277
    Вольный стрелок
    Создаете файл robots.txt в корне файла
    Как запретить индексацию сайта
    Ответ написан
    3 комментария
  • Как отменить переход по ссылке?

    black1277
    @black1277
    Вольный стрелок
    Попробуй так
    <button
                style={{backgroundColor: `${color}`}}
                onClick={ (e):void => { e.preventDefault(); indexisbtnActive() } }
                className={styles.hero__add}>
                <img src={imgBtn}/>
                {btnText}
              </button>

    нужно остановить всплытие события, чтобы оно до Link не доходило.
    Ответ написан
    2 комментария
  • Как сделать отложенную загрузку?

    black1277
    @black1277
    Вольный стрелок
    У вас сразу 2 вопроса - 1 когда долистают страницу, пример из ссылки:
    var options = {
        root: document.querySelector('#scrollArea'),
        rootMargin: '0px',
        threshold: 1.0
    }
    var callback = function(entries, observer) {
        /* Content excerpted, show below */
    };
    var observer = new IntersectionObserver(callback, options);

    и второй вопрос ленивая загрузка
    Гуглится всё за 30 секунд...
    Ответ написан
    Комментировать
  • Почему при работе с несколькими группами radio, работает корректно только последняя группа?

    black1277
    @black1277
    Вольный стрелок
    У вас элемент
    <div class="form01">
    частично перекрывает первую группу с радиобаттонами. Закрывает вторую и третью, поэтому нажимается только первая
    Ответ написан
    Комментировать
  • Почему не отображается компонент через map()?

    black1277
    @black1277
    Вольный стрелок
    Добавьте экспорт в файл store
    export const store =[
    Исправьте импорт в index.js
    import {store} from './store';
    и добавьте key в App.js когда проходите map-ом
    const questinsArray = props.store.map(store=> (
        <FientQuest
          key={store.quest}
          qmumb = {store.qmumb}
          quest = {store.quest}
    //...
    Ответ написан
    Комментировать
  • Почему не работает inline-block?

    black1277
    @black1277
    Вольный стрелок
    У вас отсутствует закрывающий тег div
    вот тут
    <div class="waiting_descr">Всего за 2 вебинара мы научим вас, как создать свой сайт на WordPress.</в></div>

    у вас вместо /div там /в получилось
    Ответ написан
    1 комментарий
  • Реализация объектра затемнения?

    black1277
    @black1277
    Вольный стрелок
    Сделано с использованием SVG. В нём есть прямоугольник растянутый на всю ширину и высоту страницы и с прозрачностью 0.4 Когда происходит наведение на дом - прозрачность меняется на 0.6 - происходит затенение. Также внутри SVG есть маска по контуру домов, поэтому они остаются светлыми.
    Ответ написан
    Комментировать
  • Как в кнопках bootstrap убрать/уменьшить рамку при нажатии?

    black1277
    @black1277
    Вольный стрелок
    измените свойство
    outline: none;
    Если bootstrap 5-й версии - можно добавить кнопкам класс shadow-none
    <div class="btn-group" role="group" aria-label="Basic radio toggle button group">
      <input type="radio" class="btn-check" name="btnradio" id="btnradio1" autocomplete="off" checked>
      <label class="btn btn-outline-primary shadow-none" for="btnradio1">Radio 1</label>
    
      <input type="radio" class="btn-check" name="btnradio" id="btnradio2" autocomplete="off">
      <label class="btn btn-outline-primary shadow-none" for="btnradio2">Radio 2</label>
    
      <input type="radio" class="btn-check" name="btnradio" id="btnradio3" autocomplete="off">
      <label class="btn btn-outline-primary shadow-none" for="btnradio3">Radio 3</label>
    </div>
    Ответ написан
    Комментировать
  • Как правильно использовать ~ в указании пути?

    black1277
    @black1277
    Вольный стрелок
    Есть такая опция - алиасы называется:
    resolve: {
        extensions: ['.js'],
        alias: {
          '@': path.resolve(__dirname, 'src')
        },
      },

    работало в webpack 4-й версии, в пятой я не пробовал. Заменяет в скрипте 'import @/path' на полный путь. Можно попробовать так же и с тильдой.
    И почему вебпак компилирует sass в js файл, а не css?

    потому что вы так его настроили.
    Ответ написан
  • Можно ли в gulpfile настроить, чтобы при малейшей ошибке js не крашился dev сервер?

    black1277
    @black1277
    Вольный стрелок
    есть такой плагин gulp-plumber, как раз для этого
    const  plumber = require('gulp-plumber');
    
    function html() {
      return src(path.src.html, {base: 'src/'})
        .pipe(plumber())
        .pipe(pug({pretty: true}))
        .pipe(dest(path.build.html))
        .pipe(browsersync.stream())
    }

    вставляете первым пайпом в каждую цепочку процессов и всё будет работать
    Ответ написан
  • Почему так работает?

    black1277
    @black1277
    Вольный стрелок
    Потому что useAction() возвращает не ту же самую функцию, а функцию забинденную на dispatch и выглядит это примерно вот так:
    function bindActionCreator(actionCreator, dispatch) {
      return function () {
        return dispatch(actionCreator.apply(this, arguments));
      };
    }

    то есть по ключу fetchTodos лежит уже вызванная функция bindActionCreator(fetchTodos, dispatch) , и вызывая fetchTodos вы по сути вызываете вот этот участок:
    function () {
        return dispatch(actionCreator.apply(this, arguments));
      };

    надеюсь, понятно объяснил. Но лучше вывести самому в консоль лог и изучить.
    Ответ написан
    1 комментарий
  • Как провести get запрос при connect-history-api-fallback?

    black1277
    @black1277
    Вольный стрелок
    Я удивляюсь... Вы подключаете мидлвар, который перехватывает GET запросы и подставляет вместо них index.html (так написано в документации к библиотеке), а потом удивляетесь, что GET запрос не проходит. Если все же, нужно обработать GET запрос иначе, то можно указать опции перенаправления. Вот пример из доков
    history({
      rewrites: [
        { from: /\/soccer/, to: '/soccer.html'}
      ]
    });
    Ответ написан
    Комментировать
  • Как поменять радиус камеры к модели (приблизить модель) библиотеке model-viewer?

    black1277
    @black1277
    Вольный стрелок
    А почитать документацию?
    Добавляете атрибут
    camera-orbit="45deg 55deg 2.5m"
    первые 2 параметра начальный угол камеры, третий - расстояние объекта от камеры. Если объект маленький - уменьшаете расстояние до камеры, большой - увеличиваете.
    Ответ написан
    Комментировать
  • Как получить текстовое содержимое тега xml?

    black1277
    @black1277
    Вольный стрелок
    Вот накидал, у меня все работает. Пробуйте:
    const cheerio = require('cheerio')
    
    const xml = `
    <offer internal-id="12345">
    <living-space>
    <value>31</value>
    <unit>кв. м</unit>
    </living-space>
    <kitchen-space>
    <value>11</value>
    <unit>кв. м</unit>
    </kitchen-space>
    <image>https://example.website.yandexcloud.net/files/ycKZLv7B0GUZled.jpg</image>
    <image>https://example.website.yandexcloud.net/files/ycKZLv7B0GUZled.jpg</image>
    </offer>
    `
    async function main() {
      try {
        let $ = await cheerio.load(xml, {
          xmlMode: true
        })
        let title = $('image').text()
        console.log('title', title)
      } catch (e) {
        console.log(e)
      }
    }
    main()
    Ответ написан
    1 комментарий
  • Как считать файл nodejs?

    black1277
    @black1277
    Вольный стрелок
    Можно считать весь файл и разбить его на массив строк, разбив по символам окончания строки. Только нужно учесть в какой операционной системе был создан текстовый файл, потому что в windows это два символа - \r\n, в Unix - \n, а в Mac - \r
    const endLine = '\r\n'; // если Windows
    let lineArray = String( fs.readFileSync( 'price.txt' ) ).split( endLine );
    // что-то делаем с полученными строками
    // ...
    let file = lineArray.join( endLine ) // соединяем обратно в целый файл
    Ответ написан
    Комментировать
  • Где ошибка и где можно рациональнее написать код, чтобы сократить время обработки?

    black1277
    @black1277
    Вольный стрелок
    Зачем внутри getDivisors создавать массив, а потом писать отдельную ф-ю для складывания массива? Можно было сразу складывать в результат и возвращать сумму.
    По поводу использования i - вы не объявляли её внутри for, поэтому в нестрогом режиме она стала глобальной. Если объявлять внутри
    for (let i = 0; i < arr.length; i ++)
    то она будет локализована внутри цикла и проблем в других местах не будет.
    Для продвинутой работы с массивами, рекомендую ознакомиться с функциями reduce и map
    Ответ написан
    1 комментарий
  • Бесконечный цикл useEffect?

    black1277
    @black1277
    Вольный стрелок
    Всё от того, что вы не желаете знать про жизненный цикл компонентов. Разберем по порядку, что происходит.
    1 компонент смонтировался
    2 срабатывает useEffect - он всегда срабатывает после того как готово DOM дерево.
    3 в useEffect срабатывает useState
    4 изменение состояния обязывает реакт сделать ререндер
    5 тут ключевой момент, компонент уже был смонтирован, поэтому происходит только его обновление - и вот тут useEffect ведет себя по разному. Если у него нет массива зависимостей - то он опять сработает и всё будет повторятся с 3-го пункта. Если же у него есть массив зависимостей - то он сработает только если после рендера обновления изменилось значение в этом массиве.
    Значит вам нужно как минимум указать newSendedMessage в этом массиве. НО! У вас есть и другая функция, которая изменяет стейт - sortMessages. Её тоже нужно указать в массиве зависимостей, если не хотите пропускать обновление при изменении receivedMsg. Но если просто поместить эту ф-ю в массив зависимостей - то опять получите бесконечный перерендер - потому что ф-я каждый раз будет разная (она пересоздается каждый раз во время обновления). Есть разные варианты как это исправить - или завернуть sortMessages в useCallback (у которого должен быть массив зависимостей с receivedMsg) или перенести саму ф-ю sortMessages внутрь useEffect и вызывать там. Тут вам решать какой вариант подходит логике вашего компонента больше.
    Ответ написан
    1 комментарий
  • Почему button блокирует выбор файла?

    black1277
    @black1277
    Вольный стрелок
    добавьте в стили кнопки pointer-events: none;
    .upload {
        background: gold;
        height: 100%;
        pointer-events: none;
      }

    и всё заработает как надо.
    Ответ написан
    Комментировать
  • Как сделать срабатывание нахождения элемента только один раз?

    black1277
    @black1277
    Вольный стрелок
    Как вариант
    $('body').on('DOMNodeInserted', "div:contains('Cloud')", function () {
        alert();
        $('body').off('DOMNodeInserted', "div:contains('Cloud')"); // после первого срабатывания - удаляем событие
    });
    Ответ написан
    3 комментария