• Где найти примеры приложений React.js?

    maxfarseer
    @maxfarseer
    https://maxpfrontend.ru, обучаю реакту и компании
    Сейчас мы делаем тестовые задания ( первое, второе, разбор первого), затем будем и проект полноценный пилить. Хотя текущие ТЗ уже по сути небольшие мини-проекты. Так же на стриме можно задать вопросы и посмотреть, что пишут другие.
    Ответ написан
    2 комментария
  • Почему не работает создание объекта?

    maxfarseer
    @maxfarseer
    https://maxpfrontend.ru, обучаю реакту и компании
    Дополню ответ 0xD34F - нельзя в качестве названия свойства указывать что-то через точку.

    return {
              ...state,
              название_поля:{
                  title:action.title
              }
          }


    где вместо название_поля должна быть строка! Если вы хотите, чтобы это было вычисляемое выражение, то нужно добавлять (как уже сказано было) квадратные скобки, то есть:

    return {
              ...state,
              [action.title]:{
                  title:action.title
              }
          }


    Но я думаю 99% вам хочется чего-то не такого, ибо в таком случае у вас получается что в state будет установлен title в поле с таким названием, которое вам придет в action.title, например:

    return {
              ...state,
              dollar:{
                  title: "dollar" // предположим что в action.title строка "dollar"
              }
          }


    Чтобы разобраться - теория.

    p.s. тэг "функциональное программирование" тут смотрится слишком опасно)
    Ответ написан
    1 комментарий
  • Как будет выглядеть аналогичный код на любом action creator?

    maxfarseer
    @maxfarseer
    https://maxpfrontend.ru, обучаю реакту и компании
    Вы отправляете простой объект:
    {
      type: 'BLA_BLA'
    }

    Это ваш action.

    Это
    function qq() {
      return {
        type: 'BLA_BLA',
      }
    }

    ваш "создатель действия" (action creator).

    Чтобы объект с типом (и данными если нужно), попал в редьюсер, его нужно прокинуть через специальную "трубу" - dispatch (диспетчер).

    То есть:
    dispatch(qq())
    // или
    dispatch({
      type: 'BLA_BLA',
    })


    Затем, пропущенный через "диспетчер" объект, попадет во все редьюсеры. В каком-то из редьюсеров, будет команда "фас" на определенный тип (type), в нашем случае - строка 'BLA_BLA', значит:

    export default (state = initialState, action) => {
        switch (action.type)
        {
            case 'BLA_BLA':
                // вот сюда придет javascript компилятор, так как вы попали в нужный кейс
                // ибо выше указано - switch по типу экшена (action.type)
               // ниже вы делаете что вам нужно с вашими данными
              // конкретно в этом кейсе, вы берете все что было в state и изменяете loading на true
                return { ...state, loading: true };
            case CALLBACK_SUCCESS:
                // сюда action с типом 'BLA_BLA' не попал
                return { ...state, status: 'OK' };
            case CALLBACK_ERROR:
               // сюда тоже
                return { ...state, status: 'ERROR', message: action.message };
            default:
              // и сюда
                return state;
        }
    }
    Ответ написан
    Комментировать
  • Верстальщик без опыта в офисе, на что рассчитывать?

    maxfarseer
    @maxfarseer
    https://maxpfrontend.ru, обучаю реакту и компании
    Например скажут поправить элемент на корпоративном сайте - ок, без проблем, но вряд ли нужно каждый день что-то подправлять, добавлять или удалять?

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

    по теме: если офис хороший (спецы сильные, не знаю как вы будете определять*, для начала хотя бы по ощущениям) - то я за в офис.

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

    maxfarseer
    @maxfarseer
    https://maxpfrontend.ru, обучаю реакту и компании
    Проблем в connect'e не вижу. Ищите дальше по цепочке. Может быть дело в reducer'e?
    Экшен IS_AUTH в логгере или redux_dev_tools виден?
    Ответ написан
  • Как реализовать OAuth в React приложении через GitHub?

    maxfarseer
    @maxfarseer
    https://maxpfrontend.ru, обучаю реакту и компании
    Из личного опыта ничего посоветовать не могу, но нашел следующие материалы, которые бы стал использовать для изучения:

    - https://medium.com/front-end-hacking/use-github-oa...
    - auth0 тут как тут тоже - https://auth0.com/authenticate/react/github/
    - видео learn.humanjavascript.com/react-ampersand/redirect...

    вот копните в эти материалы (EN), затем что-то прояснится.
    Ответ написан
    Комментировать
  • Почему не рисуется график в Canvas внутри React компонента?

    maxfarseer
    @maxfarseer
    https://maxpfrontend.ru, обучаю реакту и компании
    зум/драг - скорее всего запускают изменения пропсов, и график рисуется.
    Сделайте минимальный пример с вызовом этой функции и канвасом без всего остального. На чистом create-react-app, к примеру. Возможно, если у вас уже будет работать - то вы поймете, что имеется в списке "отличий" и потихоньку добавляя/удаляя - выясните.
    Если же нет - у вас будет пример, который вы зальете на гитхаб и мы поможем.

    Сложно придумать, что может быть не так, не смотря в код. Очевидно, что либо канвас элемент как-то не отрисовался, когда вы пытаетесь туда что-то засунуть, или просто ссылка смотрит не на текущий canvas, а куда-то в другое место, раз вы говорите, что с данными все в порядке.

    Плюс, может баг какой, форс апдейт попробуйте (грязный вариант, но раз уж все равно репозитория с примером нет...)
    Ответ написан
  • Когда mapStateToProps готов?

    maxfarseer
    @maxfarseer
    https://maxpfrontend.ru, обучаю реакту и компании
    вариант: делаете компонент WalletsContainer, в которой передается массив кошельков (сначала пустой, а потом уже и заполненый, и все без доп проверок, просто пришли новые пропсы), в котором внутри проверяется запросом каждый кошелек (через promise.all в экшене) и в итоге по окончанию проверок всего что нужно - вызывается апдейт в сторе. Либо апдейты в сторе вызываются асинхронно, обновляя только нужный кошелек (запрос на баланс котрого завершился). Если нужно взаимодействовать с родителем - либо функции прокидываете, либо используете redux далее.

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

    maxfarseer
    @maxfarseer
    https://maxpfrontend.ru, обучаю реакту и компании
    Основа по тестированию есть у Кантора: learn.javascript.ru/testing
    По реакту есть хороший курс на udemy (EN) https://www.udemy.com/react-tdd (10$)
    По redux текстом в доках - https://redux.js.org/recipes/writing-tests
    На хабре полно информации. Ну и как вам уже написали - в гугле миллион ссылок.
    Ответ написан
    3 комментария
  • Как соединить front и back?

    maxfarseer
    @maxfarseer
    https://maxpfrontend.ru, обучаю реакту и компании
    dfv123 написал все верно, но добавлю: у вас больше нет шаблонов на handlebars. Максимум для index.html
    Ваш сервер, на все маршруты кроме тех, что вы напишете для API, должен отдавать index.html, где подключен "бандл" (общий файл скриптов js) и есть элемент, куда будет монтироваться приложение.

    Затем, вы создаете API: связка из нескольких маршрутов которые принимают запросы (GET/POST/PUT/DELETE) и отдают данные в виде JSON. Вы эти данные на клиенте считываете и отображаете.

    Роутинг внутри приложения (изменения урлов), тоже переезжает на клиент, и вы это будете делать, скорее всего с помощью react-router.
    Ответ написан
    1 комментарий
  • Как правильно удалить объект в массиве при обновлении состояния компонента?

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

    state = {
      users: [/*.. массив с юзерами*/]
    }
    ...
    onDeleteClick = (e) => {
      const id = e.currentTarget.dataset.myId
      const новый_массив =  массив_без_удаленного_элемента (подсказка, удалять можно через фильтрацию по айди)
      this.setState({ users: новый_массив })
    }
    ...
    let user = this.props.users.map(function(user){
          return <li key={user.id}><User number={user.id} id={user.id} text={user.id} onDeleteClick={this.onDeleteClick}/></li>
     })
    ...
    // где-то там в компоненте User (что там внутри не знаю, но предположим есть кнопка удаления как вы пишите)
    ...
    render() {
     <div>
     // что-то по верстке про юзера
       <button onClick={this.props.onDeleteClick} data-my-index={this.props.user.id}> Удалить</button>
     </div>
    }


    Главная идея: состояние (список юзеров) хранится в родителе в стейте. Для удаления, вы должны из родителя послать функцию, в качестве одного из props, чтобы внутри этой функции изменить стейт (в родителе же). Для того, чтобы понять какого пользователя удалить, передаете какой-нибудь признак, например id из нативного data-* атрибута, который сами же и устанавливаете, передавая id в качестве props из родителя, когда рисуете User
    Ответ написан
    Комментировать
  • Как подключить css в react?

    maxfarseer
    @maxfarseer
    https://maxpfrontend.ru, обучаю реакту и компании
    Если в конфиге вебпака указано все корректно (а тут я думаю create-react-app был), то нужно просто использовать эти файлы, например: <img src="//images/my_image.jpg">

    попробуйте запустить проект и в браузере открыть вашу картинку - localhost:3000/images/my_image.jpg
    Ответ написан
  • Как сделать несколько компонент с независимым состоянием на странице?

    maxfarseer
    @maxfarseer
    https://maxpfrontend.ru, обучаю реакту и компании
    Внутри connect функции вы подписываетесь на кусочек вашего store (то есть, на кусочек всего состояния вашего приложения). Обычно это выглядит так:

    const mapStateToProps = state => ({ // state = все ваши редьюсеры, то есть тут лучше было бы писать store, но так уж поевелось..
      campaigns: state.campaigns, // компонент подписывается только на state.campaigns (то есть только на редьюсер campaigns)
    });
    connect(mapStateToProps/*, mapDispatchToProps*/)(CampaignsList) // происходит коннект, mapDispatshToProps - это для "прокидывания" создателей действий (action creator)


    Следовательно, вы можете просто в обоих компонентах приконнектится к одной части в сторе, либо еще лучше приконнектится в родителе и отрисовывать два списка компонентами.

    В скором времени будет вебинар (вход свободный) по основам редакса, думаю вы к тому времени уже разберетесь, но тем не менее заходите (vk / telegram, сайт)
    Ответ написан
  • Где найти рабочий конфиг Webpack для типовой верстки?

    maxfarseer
    @maxfarseer
    https://maxpfrontend.ru, обучаю реакту и компании
    Комментировать
  • Как избежать дублирования экшенов и редьюсеров?

    maxfarseer
    @maxfarseer
    https://maxpfrontend.ru, обучаю реакту и компании
    Одинаковые данные грузятся одним и тем же экшеном, в один и тот же редьюсер.
    Ситуация с юзерами вполне ясна, загружаете их и используете на разных страницах. Если нужно обновить список юзеров - то вызывается тот же экшен.
    Если нужно как-то с юзерами взаимодействовать, но так, чтобы в другом месте они не изменелись, то поясните, я не могу придумать такой кейс, обычно это "не одинаковые" данные.
    Ответ написан
    6 комментариев
  • Почему не меняется состояние хранилища?

    maxfarseer
    @maxfarseer
    https://maxpfrontend.ru, обучаю реакту и компании
    Вы забыли store.subscribe

    Сравните с примером здесь
    Ответ написан
    Комментировать
  • React - Как правильно построить работу с внешним апи?

    maxfarseer
    @maxfarseer
    https://maxpfrontend.ru, обучаю реакту и компании
    Из вопроса непонятно, где проблема.
    Вы грузите данные асихнронно в том компоненте, где они вам нужны в момент componentDidMount, затем пишете их в state (с помощью this.setState) и реакт сам вызовет функцию рендер => на экране появятся ваши данные.

    > Чтобы обработчик сабмита посылал данные
    сделать запрос

    > получал данные и сразу их выводил в нужном месте
    положить в state. Если "нужное место" - это другой компонент, то значит нужно стейт держать в родителе и обновлять его с помощью функции переданной в качестве props в компонент, где данные вызываются. А другой компонент, где данные нужны, просто получает их из стейта компонента родителя в качестве props и так же отрисовывает (если приехали новые props реакт тоже вызывает render)

    Ключевой момент: если ваши компоненты не знают ничего друг о друге, то вам нужно распологать данные "наверху" в общем родителе.

    p.s. по-моему вы все верно начинаете разбирать, главное помнить, что в качестве props можно из родителя передать функцию (коллбэк), и через нее можно будет установить данные в стейт родителя и тд тп.

    p.p.s. обычно так делать не приходится, потому что либо данные заранее живут в нужном компоненте, либо вы уже используете redux или что-то подобное.

    // Parent component
    ...
    state = {
      data: [],
    }
    ...
    myMethodInParent = (values) => {
      this.setState({data: values })
    }
    ...
    render() {
     ...
     <AnyChildren testName={this.myMethodInParent} />
    }
    
    // AnyChildren component
    ...
    
    handleSubmit() => {
      this.props.testName( _ваши_данные_которые_нужно_в_стейт_родителя_ )
    }
    ...
    render() {
    ...
    }
    Ответ написан
  • Простой пример обновления store в reactjs redux через ajax?

    maxfarseer
    @maxfarseer
    https://maxpfrontend.ru, обучаю реакту и компании
    Store - нет в react, он есть в redux.
    В react нужно обновлять state, чтобы в компонент попали новые данные, и он обновился.
    Посмотрите здесь https://youtu.be/fsC6r_prek8?t=51m30s
    Исходный код

    Суть: делается xhr-запрос, по окончанию которого в state устанавливаются новые данные.

    Псевдо код:

    // ваш компонент
    
    // 1) устанавливаем начальный state
    state = {
     data: []
    }
    
    // 2) делаем ajax (xhr) запрос, например в comonentDidMount (в момент, когда компонент примонтирован)
    
    componentDidMount() {
       // $.ajax( ...
       // или xhr,  или fetch 
       // покажу fetch
       const self = this
       fetch(`${API_ROOT}/${endPoint}`)
        .then(ОТВЕТ => {
            // УСТАНАВЛИВАЕМ в STATE
            self.setState({ data: ОТВЕТ })
          } 
        })
     // реальный код фетча - https://github.com/maxfarseer/forge/blob/2-books-router/src/helpers/network.js
    }
    
    // 3) в компоненте рисуем
    
    render() { return <div>ваши_данные</div>
    Ответ написан
    Комментировать
  • Кто может посоветовать актуальный курс для начинающих по react?

    maxfarseer
    @maxfarseer
    https://maxpfrontend.ru, обучаю реакту и компании
    Ру текст: https://maxfarseer.gitbooks.io/react-course-ru-v2/...
    Документация: https://reactjs.org/tutorial/tutorial.html (EN)
    Видео: https://learn.javascript.ru/screencast/react (RU, сам не смотрел, но должно быть хорошо)
    Ответ написан
    Комментировать
  • Какая структура файлов должна быть для webpack-react-node проекта?

    maxfarseer
    @maxfarseer
    https://maxpfrontend.ru, обучаю реакту и компании
    Вот у вас есть директория javascripts - туда складывайте весь JS.
    Файлы "сервера" кладите отдельно, вне папки в которой пробегает webpack, либо укажите директорию внутри public/javascript/например_server - как исключение, по которой webpack'у ходить будет не нужно.

    p.s. вообще вопрос не самый удачный. Если вы хотите вклинить реакт в уже рабочий проект (например на ROR), то храните как хотите, лишь бы вам было удобно.

    Если же проект с нуля, то самая обычная структура, это папка src/ для всех файлов проекта на react, где-то рядом в соседях (или в другой вообще директории) - ваш сервер.
    Ответ написан
    Комментировать