• Что именно сломалось в ПК?

    Vlad_IT
    @Vlad_IT
    Front-end разработчик
    98% того, что видюха. т.к. артефачит видео.
    Ответ написан
    2 комментария
  • Над чем нужно работать, что улучшать?

    Vlad_IT
    @Vlad_IT
    Front-end разработчик
    1. Закомментированный код на гитхабе - не хорошо. https://github.com/marinarodkin/aviasales-app/blob...
    2. Минимум логики в render функции компонента. Все сложные конструкции переносите в методы, а лучше в отдельные компоненты (тогда сможете легче контролировать перерисовку компонентов через shouldComponentUpdate , чтобы они не перерисовывались, если данные не поменялись). Вы можете прямо как методы писать стрелочные функции:
      class Flight extends Component {
          getWeekDay = (date) => {
              //..
          }
          // ....
      }

    3. Вы в половине случаев используете точку с запятой, а в половине нет. Используйте чаще.
    4. Атрибут for нельзя использовать в jsx (как и class, как вы знаете). Вместо for пишите htmlFor
    5. Смотрите консоль инструментов разработчика, там есть ошибки.
    6. Освойте shouldComponentUpdate, он позволяет контролировать перерисовку компонента при изменении состояния или пропсов. У вас при изменении кол-во пересадок, перерисовывается весь список билетов, даже те, которые уже были в этом списке. Многие скажут, что еще рано такое учить, но я не согласен. Если не учиться контролировать перерисовку еще в начале обучения, то можно написать очень много тормознутого софта.
    7. У вас данные ticket.json подгружаются хардкодно из github, это не хорошо, т.к. этот файлик с данными есть в папке public, и если потенциальный работодатель захочет поменять там что-то, он не увидит изменений (т.к. грузится с гитхаба).
    8. У вас если в данных в параметре departure_date стоит 11.10.2018 (т.к. сегодня), то отобразится это как "11 окт 2018, вс", т.е. день недели неправильный. А он неправильный потому, что это не октябрь, а ноябрь. Ошибка в методе getDateFormat
      const newDate  = new Date (year, month, day, );
      const monthName = ["дек", "янв", "фев", "мар", "апр", "мая", "июня", "июля", "авг", "сент", "окт", "ноя", "дек"];
      const newMonth = monthName[newDate.getMonth()];

      конструктор Date вторым аргументом ожидает номер месяца, нумерация которого начинается с нуля. т.е. 0 - январь, 1 - февраль, 11 - декабрь. Судя по monthName вы подозвевали, что есть что-то неладное, но ошибись с реализацией. monthName должен иметь обычный вид, начинаться с января и заканчиваться декабрем, т.к. нулевой элемент массива как раз подходит по логике с нулевым месяцем. В getDateFormat, а также в getWeekDay, вычтите из month - 1
      const newDate = new Date(year, month - 1, day)
    9. У вас в тех же getDateFormat и getWeekDay в конструкторе Date вы в конце аргументов пишите запятую, так не нужно делать. Это не вредно и не полезно, просто дурной тон. Там в любом случае будет undefined, хоть с запятой хоть без нее.
    10. Картинки тоже грузятся с marinarodkin.github.io, измените.

    11. const getStopsNumber = (stop) =>{
            switch (stop) {
              case 3:
                return "3 пересадки"
              case 2:
                return "2 пересадки"
              case 1:
                return "1 пересадка"
              case 0:
                return "без пересадок"
              default:
                return // это не нужно делать, писать return. Если вы удалите эту (и строку выше), то результат будет такой же - undefined
            }
          }

    12. Если бы в SideBar пропс stopsData был не объектом, а строкой или числом, то компонент SideBar можно было бы безболезненно превратить в PureComponent. Ну это так, к слову об оптимизации.
    13. Я бы в stopsClick передавал не объект события e, из которого вы потом берете id элемента через e.target.id (что не есть гуд), а сделал бы стрелочную функцию (или bind), в которую бы передавал id. Вот так
      <input onClick={() => this.props.stopsClick("allStops")} />
      <input onClick={() => this.props.stopsClick("noStops")} />

      Если это читают опытные ReactJS разработчики, рассудите пожалуйста. Согласен, что на каждый компонент будет создана своя копия функции, но по крайней мере, не нужно взаимодействовать с DOM напрямую.
    14. Это не красиво
      if( this.state.stops.allStops === false && this.state.stops.noStops === true && this.state.stops.oneStop === true && this.state.stops.twoStop === true && this.state.stops.threeStop === true  ){
               newStops = {...this.state.stops, allStops: true}
          }

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


    Может я многое высосал из пальца, но это будет вам полезно. Учитесь, развивайтесь. Удачи вам в этом :-)
    Ответ написан
    1 комментарий
  • Slim 3 для коммерческих целей?

    Vlad_IT
    @Vlad_IT
    Front-end разработчик
    Это к документации. На странице проекта на гитхабе стоит MIT https://github.com/slimphp/Slim/blob/3.x/LICENSE.md
    Ответ написан
    1 комментарий
  • Как верстать такой прогресс бар?

    Vlad_IT
    @Vlad_IT Куратор тега CSS
    Front-end разработчик
    В defs определяете градиент https://developer.mozilla.org/ru/docs/Web/SVG/%D0%... и в stroke круга вместо цвета пишите
    stroke: url(#название-градиента)
    вот к вашему примеру
    https://codepen.io/anon/pen/gBRRXX?editors=1010
    Ответ написан
    1 комментарий
  • Связный список (или нет), как правильно в этом случае?

    Vlad_IT
    @Vlad_IT Куратор тега JavaScript
    Front-end разработчик
    Можно добавить к каждому варианту параметр dependentList, который будет содержать массив вариантов из предыдущего вопроса. И если в предыдущем вопросе выбрали вариант из этого списка dependentList следующего вопроса, то этот вариант в следующем вопросе будет отображаться. Или же нужна глубина еще на два или несколько предыдущих вопроса?
    Ответ написан
  • Как трансформировать object Object?

    Vlad_IT
    @Vlad_IT Куратор тега JavaScript
    Front-end разработчик
    const option = object.map(obj => Object.values(obj)[0])

    Если ожидается, что могут быть некорректные данные вместо объекта, сделайте дополнительную проверку.
    Но мне кажется, вам нужно с сортировкой по этому индексу?
    Ответ написан
    Комментировать
  • Как в js динамически рисовать предметы?

    Vlad_IT
    @Vlad_IT Куратор тега JavaScript
    Front-end разработчик
    Логикой. Имеете две точки, стартовая и конечная, пока они пустые. При первом клике делаете проверку, если стартовой точки нет, то этот клик и будет стартовой точкой, значит записываем координаты клика в стартовую точку. В этот момент должно работать событие мыши mousemove, которое делает проверку, есть ли стартовая точка и нет конечной, тогда рисуем прямоугольник от стартовой точки до точки координат мыши. При повторном клике опять делается проверка, если стартовая точка есть а конечной нет, то записываем точку мыши в конечную. В этот момент условие в mousemove больше не работает, т.к. есть конечная точка, прямоугольник закрыт. Можно его нарисовать окончательно.
    У fillRect конечная точка описывается шириной и высотой, поэтому нужно ее высчитывать вот так:
    width = xEnd - xStart;
    height = yEnd - yStart;
    Ответ написан
    5 комментариев
  • Обращение к элементу константы находясь внутри этой константы?

    Vlad_IT
    @Vlad_IT Куратор тега JavaScript
    Front-end разработчик
    Я не думаю, что так можно. По приоритету, сначала формируется объект, потом его ссылка передается в PATHS. Можете сделать через функциональный класс
    const PATHS = new function () {
       this.src = 'src';
       this.srcAssets = this.src + '/assets';
    }

    Если не хотите писать this, то можете вот так
    const PATHS = (function () {
       const basePath = 'src';
       return {
          src: basePath,
          srcAssets: basePath + '/assets',
       };
    })();
    Ответ написан
    Комментировать
  • Как работать с ускоренным написанием кода и какие есть методы?

    Vlad_IT
    @Vlad_IT Куратор тега HTML
    Front-end разработчик
    Учите emmet, это он и есть. Там все это есть.
    Вот это вам пригодится https://docs.emmet.io/cheat-sheet/
    Ответ написан
    Комментировать
  • Как создать бесконечную инвертированную прокрутку для чата?

    Vlad_IT
    @Vlad_IT Куратор тега JavaScript
    Front-end разработчик
    Самый простой вариант. Запоминаете самый первый блок до подгрузки, после подгрузки берете у этого блока позицию относительно родителя, и скроллите родителя на эту позицию.
    UPD: другой способ. Вычисляете перед добавлением сообщений высоту скролл-области элемента, и после добавки сообщений, вычитываете из новой высоты скролл-области блока с сообщениями старую, и это значение и есть scrollY
    Ответ написан
    3 комментария
  • Почему не работает событие?

    Vlad_IT
    @Vlad_IT
    Front-end разработчик
    Мне не нравится два определения data (объект и метод). Опишите так
    export default {
            name: "profile-account",
           
            props: [
                'url',
                'amount'
    
            ],
            mounted() {
    
            },
            data() {
                return {
                    balance: this.amount,
                    isOpen: false
                }
            },
            methods: {
              showAddfunds: function(){
                this.isOpen = !this.isOpen
                console.log(this.isOpen)
              }
            }
        }
    Ответ написан
    1 комментарий
  • Как составить письмо руководителю о нелегальном ПО?

    Vlad_IT
    @Vlad_IT
    Front-end разработчик
    Я бы ушел, а я и ушел когда-то из-за такой проблемы. Никто ничего делать не будет с этим софтом. А написав служебную записку, вы лишь документально подтвердите, что вы были в курсе преступления, и ничего с ним не сделали. Когда я работал, у меня было только 2 варианта: переносить все и всех на линукс, титанический труд переобучения специалистов и настройка специфичного софта из линукса. Софт куда проще настроить, а самый упоротый виндовый софт легко запускается на ReactOS (но тут опять, могут сказать, не сертифицированный софт - если это гос-учреждение), а вот работники никак не хотели привыкать. Последней точкой кипения стал формат docx, который в линуксных свободных пакетах открывается фигово, а в департаментах (несмотря на гост https://wiki.openoffice.org/wiki/RU/goverment/odf ) плевались в сторону отличных от doc(x) форматов. Никому ничего не надо, а проверкам надо. Поэтому я ушел, и лично вам советую, ибо проблем это создаст (как минимум сильный стресс во время и при наступлении проверки).
    В судный день все покажут пальцами на вас - "Я не разбираюсь в этих ваших компьютера, это Сашечка все настраивал, у него спрашивайте".
    Ответ написан
    Комментировать
  • Как сделать лини рядом с заголовком адаптивными?

    Vlad_IT
    @Vlad_IT Куратор тега CSS
    Front-end разработчик
    Самый простой вариант, если фон будет одноцветным: блоку с заголовком делаете фон этой линии (градиент, border), и для заголовка делаете белый фон.
    Ответ написан
    Комментировать
  • Как расположить элементы по кругу?

    Vlad_IT
    @Vlad_IT Куратор тега CSS
    Front-end разработчик
    Делайте по такому принципу.
    Ответ написан
    12 комментариев
  • Как вывести рекурсивно?

    Vlad_IT
    @Vlad_IT Куратор тега JavaScript
    Front-end разработчик
    Не очень понял, что вы не поняли.
    Вот есть функция createData, она рисует список элементов из массива, который передается ей в параметре l. Все.
    В функции проходимся по каждому значению из l. Имеется условие: если l это строка, то выводим ее в li, если же это массив, то вероятно это список дочерних элементов, которые нужно вывести в отдельный блок ul. Для этой цели рекурсивно (рекурсивно, значит вызов функции самой себя) вызываем функцию createData и передаем ей уже не массив всех элементов, а лишь массив дочерних элементов текущего элемента из цикла. И там опять все также, смотрим на элементы, если у элемента есть дочерние элементы, опять вызываем createData.
    Ответ написан
    1 комментарий
  • Как проверить массив отсортирован ли он?

    Vlad_IT
    @Vlad_IT Куратор тега JavaScript
    Front-end разработчик
    Как делать надо я не успел показать, поэтому покажу, как делать не надо :-)
    var arr = [1,2,3,4,5];
    arr.toString() === arr.slice().sort().toString();
    Ответ написан
    Комментировать
  • С чего начать создание приложения для майндмэппинга?

    Vlad_IT
    @Vlad_IT
    Front-end разработчик
    С нуля будет сложно, хотя это не очень сложная задача. Можете оценить объем работы https://github.com/learn-anything/react-mindmap
    Нужно отталкиваться от того, какие знания и в какой области у вас есть. Если веб, то идите в сторону VueJS + SVG, это будет быстрее и проще.
    Ответ написан
    Комментировать
  • Как можно улучшить функцию?

    Vlad_IT
    @Vlad_IT Куратор тега JavaScript
    Front-end разработчик
    Что вас именно смутило в этом фрагменте? Пусть он и не короткий, но он понятный. Если так хочется, можете создать класс с конструктором, который будет в аргументах принимать значения
    class OptionItem {
       constructor(id, label) {
          this.id = id;
          this.label = label;
          this.value = id;
       }
    }
    ...
    const optionObject = new OptionItem(packData.id, packData.title);
    Ответ написан
    Комментировать
  • Как скрыть div если в нем число 0?

    Vlad_IT
    @Vlad_IT Куратор тега JavaScript
    Front-end разработчик
    Ставьте ему атрибут data-num="0" и в css пишите
    [data-num="0"] {
    display: none;
    }

    UPD: способ на jQuery
    $('.classDiv').each(function() {
       var $this = $(this);
       if ($this.text().trim() === '0') {
          $this.hide();
       }
    });

    вместо .classDiv поставьте свой селектор. Но лучше залезьте в php (или попросите бэкендера), и подставьте в атрибут.
    Ответ написан
    1 комментарий
  • Как сделать простой скрипт на js?

    Vlad_IT
    @Vlad_IT Куратор тега JavaScript
    Front-end разработчик
    Следите за кликом по .item, в клике получаете второй класс кликнутого элемента (например three), производите поиск элемента по селектору .message.three, если нашли, то находите все .message.active и удаляете у них класс active, после чего найденному элементу .message.three добавляете ему в classList класс active.
    Ответ написан
    Комментировать