• Контекст функции?

    maxfarseer
    @maxfarseer
    https://maxpfrontend.ru, обучаю реакту и компании
    В конструкторе можете "прибить":
    this.getMouse = this.getMouse.bind(this)
    с помощью оператора bind ваш метод класса (getMouse) всегда будет вызываться в контексте this (которая в момент бинда ссылается на ваш класс)
    Ответ написан
    4 комментария
  • Как оргаизовать logout у пользователя?

    maxfarseer
    @maxfarseer
    https://maxpfrontend.ru, обучаю реакту и компании
    export const logout = () => {
      sessionStorage.removeItem('auth');
      return {}; <-- забыли экшен свой { type: LOGOUT }
    };
    Ответ написан
  • Как реализовать поведение такого компонента?

    maxfarseer
    @maxfarseer
    https://maxpfrontend.ru, обучаю реакту и компании
    Вам нужно хранить у кнопки в каждом блоке свой идентификатор. Например в data-* аттрибуте. Тогда, когда будете нажимать на кнопку минус, относящемуся к данному блоку, сможете считать у нее этот атрибут и вуаля.

    Пример кнопки:
    <button data-myId='100' onClick={this.minus}>minus</button>

    Пример считывания:
    minus = (e) => {
      console.log(e.currentTarget.dataset.myId) // 100
    }

    Массив с данными ваших "блоков" хранится в state и по минусу + зная айдишник, можно этот "блок" из state удалить (то есть, удалить элемент из массива).

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

    Да, на деле все выглядит легко, если я правильно понял вашу задачу, но если у вас много пробелов в понимании этого теоретического поста, то нужно подтягивать основы. Трудность этой задачи может заключаться для вас в том, что нужно иметь прослойку с данными (расположенную в state, об этом было выше), по которым вы будете генерировать селекты+опции+кнопки для каждого блока.
    Ответ написан
    Комментировать
  • Как понять нажат chexbox или отпущен?

    maxfarseer
    @maxfarseer
    https://maxpfrontend.ru, обучаю реакту и компании
    У вас в событие передается нативный event, следовательно вы можете считать цель события, так сказать - event.target (элемент на котором произошел клик), что вернет DOM элемент( ваш чекбокс) и у него считать свойство checked

    итого: event.target.checked (у вас это буквой e обозначено, значит e.currentTarget.checked , currentTarget - потому что так советует документация по реакту, потому что... - дальше уже сами =) )

    p.s. обязательно читать
    Ответ написан
    2 комментария
  • Как написать роуты, чтобы было совместимы node js и react?

    maxfarseer
    @maxfarseer
    https://maxpfrontend.ru, обучаю реакту и компании
    Для формирования title можете использовать react-helmet, это решит все ваши проблемы?

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

    p.s. если вы еще отдаете какие-то данные по API с этого же сервера на ноде - то немного посложнее конфиг будет, но принцип прежний: на клиенте роутингом рулит реакт + _библиотека/свой код_ (например реакт-роутер)
    Ответ написан
  • Как реализовать отправку файла на сервер на чистом JS?

    maxfarseer
    @maxfarseer
    https://maxpfrontend.ru, обучаю реакту и компании
    На днях долго ковырялся с нативными fetch + formData для загрузки файла с формы. Как вы знаете, для того, чтобы браузер посчитал content-length и все такое нужен заголовок Content-type: multipart/form-data… в итоге, путем долгих поисков было найдено, что если использовать нативный fetch (не jquery.Ajax, не суперагент, isomorphic-fetch и другие, а именно нативный) - то заголовок Content-type устанавливать (внимание) не нужно.

    Поэтому если есть возможность использовать нативный fetch (смотрите поддержку браузерами) - то все получится.
    Ответ написан
    Комментировать
  • Курсы реакт, что дальше?

    maxfarseer
    @maxfarseer
    https://maxpfrontend.ru, обучаю реакту и компании
    Все что написано до вас может быть:
    а) написано хорошо
    б) написано плохо
    в) настраиваться легко и удобно (вытекает из А)
    г) настраиваться плохо, кастомизация и универсальность на нуле, поддержка компонента медленная или вообще не производится (вытекает чаще всего из Б, но иногда хороший компонент могут просто забросить и тогда появляется его форк или конкурент, или не появляется).

    Итого, при поиске компонента, смотрите на гитхабе: сколько issues (активных/закрытых и какие), обновляется ли компонент (если это требуется, обычно да, хотя бы реакт и проп-тайпсы должны быть версии повыше).

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

    На практике может выглядеть так: есть библиотеки с графиками, есть UI библиотеки (которые устраивают вас по дизайну или для прототипа), для таблиц, для работы с датами, для календарей - то есть все популярные задачи, обычно уже сделаны, и сделаны хорошо - БЕРЕМ. Но вам для работы все равно останется место: нужно будет прислать в эти компоненты данные с сервера, научить их как-то отправлять от пользователя какие-то действия к вам на сервер и тд тп.
    Ответ написан
    3 комментария
  • Как в AJAX запросе получить файл?

    maxfarseer
    @maxfarseer
    https://maxpfrontend.ru, обучаю реакту и компании
    "/auto.json"
    или полный URL пропишите (htpp://localhost/blabla)
    Ответ написан
  • Как дать команду на ре-рендер после добавления элемента в firebase?

    maxfarseer
    @maxfarseer
    https://maxpfrontend.ru, обучаю реакту и компании
    Вам нужно подписаться на события от Firebase (API документация - может здесь, может где-то еще в доке, должно быть что-то связанное с "сообщениями от базы", скорее всего здесь).

    Далее, когда вам приходить событие в стиле: в_базу_добавился_новый_элемент вы должны вызвать action, который будет обновлять у вас в сторе ваши данные. Таким образом, если тут все правильно приготовить, то у вас в компонент придут новые пропсы и он перерисуется.

    То есть, здесь совсем не понадобятся методы жизненного цикла у компонентов (разве что, componentWillReceiveProps в будущем, но пока точно без него можно сделать).
    Ответ написан
    Комментировать
  • Как обновить запись в массиве без изменения порядка (Immutable)?

    maxfarseer
    @maxfarseer
    https://maxpfrontend.ru, обучаю реакту и компании
    Читаем документацию: update
    Смотрим пример:
    const list = List([ 'a', 'b', 'c' ])
    const result = list.update(2, val => val.toUpperCase())
    // List [ "a", "b", "C" ]


    Почему не работает данный кусок - потому что immutable.
    Ответ написан
    Комментировать
  • Как построить график?

    maxfarseer
    @maxfarseer
    https://maxpfrontend.ru, обучаю реакту и компании
    -1) нужно разобраться с большим количеством вопросов по теории разработки и основам языка. (пока опустим)
    по делу:
    0) нужно выбрать библиотеку для отрисовки графиков.
    1) нужно приготовить данные для этой библиотеки
    2) нужно отрисовать компонент из библиотеки с графиками и туда передать в качестве props данные.

    Окей, разберемся подробнее:
    0) допустим это https://github.com/jerairrest/react-chartjs-2
    Какой план работ? Идем по ссылке на гитхаб, там видим, что это лишь "реакт-обертка" для библиотеки - www.chartjs.org/docs/latest - отлично! Смотрим документацию, видим следующий пример:

    var myChart = new Chart(ctx, {
        type: 'bar', // тип диаграммы
        data: { // ДАННЫЕ
            labels: ["Red", "Blue", "Yellow", "Green", "Purple", "Orange"], // МЕТКИ - здесь ваши AF, AX, AL ... в массиве
            datasets: [{
                label: '# of Votes', 
                data: [12, 19, 3, 5, 2, 3], // ДАННЫЕ - здесь ваши "количество говорящих" - 652230, 1580, 28748.. - так же в массиве и в том же порядке.
                backgroundColor: [ // настройки цветов... и значения остальных пунктов, так же можно найти в документации.
                    'rgba(255, 99, 132, 0.2)',
                    'rgba(54, 162, 235, 0.2)',
                    'rgba(255, 206, 86, 0.2)',
                    'rgba(75, 192, 192, 0.2)',
                    'rgba(153, 102, 255, 0.2)',
                    'rgba(255, 159, 64, 0.2)'
                ],
                borderColor: [
                    'rgba(255,99,132,1)',
                    'rgba(54, 162, 235, 1)',
                    'rgba(255, 206, 86, 1)',
                    'rgba(75, 192, 192, 1)',
                    'rgba(153, 102, 255, 1)',
                    'rgba(255, 159, 64, 1)'
                ],
                borderWidth: 1
            }]
        },
        options: { // ЕЩЕ опции, тоже значения опций в документации, можно просто опустить.
            scales: {
                yAxes: [{
                    ticks: {
                        beginAtZero:true
                    }
                }]
            }
        }
    });


    Так же, почти у всех настроек есть значения по умолчанию, поэтому большинство из них можно опустить.

    2) отрисовка компонента - это уже нужно смотреть в документации реакт-обертки:
    import {Doughnut} from 'react-chartjs-2'; // отрисует Doughunt диаграмму, вам наверняка нужны Line или Bar
    
    <Doughnut data={...} /> // а вот и сама отрисовка, это нужно сунуть в ваш div, где в data должен быть объект*


    2.5) разжую про объект:
    const myData = { // минимальный пример
    labels: ["AF", "AX", "AL"], // МЕТКИ - здесь ваши AF, AX, AL ... в массиве
    datasets: [{
        label: '# of Votes', 
        data: [652230, 1580,28748], // ДАННЫЕ - здесь ваши "количество говорящих" - 652230, 1580, 28748.. - так же в массиве и в том же порядке.
    }]
    }


    Итого ваш рабочий пример с "жестко записанными данными":
    import {Bar} from 'react-chartjs-2';
    ...
    render() {
     const myData = { // минимальный пример
       labels: ["AF", "AX", "AL"], // МЕТКИ - здесь ваши AF, AX, AL ... в массиве
       datasets: [{
        label: '# of Votes', 
        data: [652230, 1580,28748], // ДАННЫЕ - здесь ваши "количество говорящих" - 652230, 1580, 28748.. - так же в массиве и в том же порядке.
       }]
      }
     return (
        <div><Bar data={myData} /></div>
     )


    само собой разумеется, что вам нужно вместо жестко описанной myData формировать переменную на основе тех данных, что вы получили от сервера и записывать ее в state, а в компоненте из state считывать. Тогда при получении новых данных от сервера будет происходить перерисовка.
    Ответ написан
    Комментировать
  • Построение графика axios+react, как лучше сделать?

    maxfarseer
    @maxfarseer
    https://maxpfrontend.ru, обучаю реакту и компании
    Доброе утро.

    1) из данных формируете новый "слепок" значений: язык + кол-во говорящих (например: { ru: 1000, en: 2000 } или [1000, 2000] + словарик ['ru', 'en'] )
    2) наносите это на график, например, используя react-chartjs2
    Ответ написан
  • Сейчас модно не создавать свой код на PHP, а использовать reactJs или Angular и все данные хранить или в google firebase, или aws. Это того стоит?

    maxfarseer
    @maxfarseer
    https://maxpfrontend.ru, обучаю реакту и компании
    оффтоп: Слово "модно" не приносит хорошего в программировании (впрочем как и в жизни от моды пользы никакой, только если ты на "моде" зарабатываешь).

    По теме: firebase / aws - удобно. Иногда (и даже часто) подходит для ускорения работы. Особенно если бэкэндера нет, или знаний особых в бэке нет.

    Чтобы понять как это все работает, нужно банально(!) подключить к тому же create-react-app сначала firebase, затем aws (читать по документации, там годно расписано) - посмотреть удобно ли вам, помогает ли, ускоряет ли работу и какие еще плюшки дает, а далее принять взвешенное решение.

    так же гугл выдал (для firebase):
    https://www.codementor.io/yurio/all-you-need-is-re...
    https://css-tricks.com/intro-firebase-react/
    https://react.rocks/tag/Firebase
    Ответ написан
    Комментировать
  • Что делать, если react-библиотека требует PropTypes?

    maxfarseer
    @maxfarseer
    https://maxpfrontend.ru, обучаю реакту и компании
    Горе-разработчики!

    Хотелось бы прокомментировать, но не буду =)

    Итак, у вас есть несколько путей:
    1) делаете форк redux-saga-router и в ней изменяете везде (автозаменой в принципе, может будут трудные места, но
    вряд ли) - подключение PropTypes
    Затем либо использует свой форк (в package.json) прописывая урл до гитхаб репозитория, либо (правильнее) делаете pull request в библиотеку и помогаете другим.

    2) пишите автору(ам) в issue, что пора бы пофиксить (но сначала проверьте, нет ли там уже такого issue, и может быть уже даже есть pull request, но его еще не приняли или есть чей-то уже рабочий форк и тд тп)
    Ответ написан
    2 комментария
  • Как по клику отрисовывать разные данные?

    maxfarseer
    @maxfarseer
    https://maxpfrontend.ru, обучаю реакту и компании
    Загружаете ваши данные в state, так же там содержите переменную, в которой указано какой из подмасивов показывать.
    Далее в рендер функции проверяете какой массив нужно показывать.
    Делаете обработчик на кнопку, который при клике меняет переменную хранящую номер подмассива для показа в стейте - реакт автоматически перерисует.

    Набросок:
    ...this.state = {
      data: [ [{a:1}, {b:2}, {c: 3}], [{a: 100}, {b: 200}, {c: 300}] ],
      index: 0, // для показывания первого подмассива
    } 
    ...
    onBtnClick = (e) => {
      this.setState({ index: e.currentTarget }) // старая запись
      this.setState( prev => { ...prev, { index: e.currentTarget - 1}}) // новая (рекоммендуемая?) запись
    }
    ...
    render() {
      const { index, data } = this.state
    
      return (
        <div>
          <button onClick={this.onBtnClick}>0</button>
          <button onClick={this.onBtnClick}>1</button>
          <p> { data[index] } </p> // само собой тут должна быть какая-то верстка в зависимости от ваших данных
        </div>
      )
    }
    ...
    Ответ написан
  • Как правильно обновить комонент в react + redux?

    maxfarseer
    @maxfarseer
    https://maxpfrontend.ru, обучаю реакту и компании
    Чтобы изменить один компонент из другого, нужно либо достучаться до общего родителя и спустить props вниз, либо использовать redux (который делает тоже самое по сути).

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

    > нужно добавить проверку в компоненте ChangeMe не изменились ли параметры
    lifecycle метод componentWillReceiveProps вам поможет

    > но есть ситуации когда его нужно обновить даже когда парамерты не изменились
    эту ситуацию описать внутри componentWillReceiveProps в обычном if условии.
    Ответ написан
  • Есть ли возможность в одном проекте использовать react.js, react-redux-router и hashHistory?

    maxfarseer
    @maxfarseer
    https://maxpfrontend.ru, обучаю реакту и компании
    Добрый день, ну так и спросить у гугла: react redux react-router
    (четвертая ссылка похожа на что-то максимально подходящее вам)

    А по факту: лучше спокойно разобраться:

    Сначала react, затем асинхронная загрузка чего либо на реакте (без redux, recompose, reselect, immutable, react-router, и прочих библиотек, гы-гы, наболело просто). Все это есть как в видео-уроках, так и в текстовых учебниках. В быстрой и краткой форме - есть официальная документация (хорошая).

    Затем следующий шаг: добавление redux и асинхронная загрузка (да-да, тех же самых данных) - но уже через redux.

    Затем добавляется react-router.

    И в таком случае, даже если вы не успеете сделать что-то сейчас сразу быстро (подозреваю, что либо тестовое задание, либо дружеская "халтурка" в помощь), то вы сможете в будущем без проблем все это реализовать.

    Если нужно быстрее - либо статья выше, либо с ментором.

    P.S. вредный совет - ищите react redux react-router boilerplate - репозитории с шаблоном для новых проектов. Зачастую там все уже есть и настроено. Вредный, потому что будет тяжело вносить изменения в сборку, если нет понимания что откуда и куда. А так как авторы популярных бойлерплейтов уже столько накрутили, то там частенько сложно разобраться.
    Ответ написан
    2 комментария
  • Как в React + Redux обмениваться данными между компонентами?

    maxfarseer
    @maxfarseer
    https://maxpfrontend.ru, обучаю реакту и компании
    Как в React + Redux обмениваться данными между компонентами?

    Обмен данными происходит через один общий объект состояния store.
    Вам нужно "приконнектить" оба компонента с помощью:
    connect(mapStateToProps, mapDispatchToProps)(ComponentName)

    и тогда они у вас будут слушать изменения в сторе (за счет, того, что вы передадите в функции mapStateToProps), а так же смогут уметь передавать изменения в стор (с помощью dispatch функции, которую вы будете вызывать внутри mapDispatchToProps).

    К сожалению, объяснение очень сухое и может быть не понятным, но и ваш вопрос выглядит как: ребята, объясните мне (желательно кодом) как работает redux. Лучше пройти какоий-нибудь туториал внимательно и такой вопрос сам по себе отпадет.

    Если немного упростить, то вам нужно будет:
    из компонента Settings вызвать action creator (через dispatch)
    в компоненте User это дело поймать (поймаете с помощью редьюсера, на который будет "натравлена" функция mapStateToProps)
    Ответ написан
    1 комментарий
  • Не получилось создать таблицу?

    maxfarseer
    @maxfarseer
    https://maxpfrontend.ru, обучаю реакту и компании
    В документации вижу, что нужно еще css подключить.
    <link rel="stylesheet" href="./dist/react-bootstrap-table.min.css">

    59f60d0bce793257553441.jpeg
    Ответ написан
    Комментировать