Ответы пользователя по тегу React
  • Какой необходимый уровень знаний для junior React.js Разработчика?

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

    не включая основы js

    Извините, но стандартная задача, про "напишите функуцию add, которая при вызове add(1)(2) вернет 3" - многих положила на лопатки =) Поэтому будьте готовы..

    React
    0) Какую проблему решает react ?
    1) Мгновенно ли срабатывает setState? Если нет, то как выполнить код, который 100% выполнится после того, как новый state будет установлен?
    2) Зачем многие постоянно пишут в constructor: this.FUNCTION_NAME = this.FUNCTION_NAME.bind(this) и отсюда вопрос вытекает чему равно this в разных местах вашего компонента...
    3) в каких методах жизненого цикла стоит выполнять xhr запросы? В каких стоит "обновлять state на основе props"?
    4) Что будет если вызвать this.setState в render методе компонента?
    5) зачем нужен componenWIllUnmount, приведите пример..
    6) Контролируемые, не контролируемые компоненты
    7) Как организовать роутинг в реакт приложении? (ответ: взять react-router - подходит, но было бы круто, если бы вы рассказали, как он примерно работает)*
    8) Зачем нужны propTypes? Что происходит с ними в production сборке?
    9) Как можно удобно "отлаживать" чужой код приложения, написанного на react (намек в сторону React devtools)
    ...

    Redux
    0) Какую проблему решает redux?
    1) Зачем многие создают типы действий NAME_REQUEST / NAME_SUCCESS ? А заодно, что такое "действие", а что такое "создатель действия"...
    2) Что такое редьюсер? Можете написать простой редьюсер без react/redux?*
    3) Для чего нужен redux-thunk? Как он работает? Напишите (можно псевдокод) асинхронный создатель действия (либо, если надоело говорить "терминами" - асинхронный aciton)
    4) Как компоненты приложения получают "пропсы" из "стора"?*
    5) Можно ли (и считается ли это нормальным) использовать state, если используется Redux?
    6) Почему в reducer'ax мы возвращаем новые объекты? Приведите пример, когда вы возвращаете новый объект, а когда тот же самый.
    6.5) А так же, "как в js вообще это работает?". Например:
    let obj1 { name: 'Test', age: 100 }
    let obj2 = obj1
    obj2.name = 'Test_new'

    Что будет в obj1, почему? В каких случаях объекты могут быть равны?
    7) Что возвращает функция connect (из react-redux)?
    ...

    Общее:
    0) package.json
    1) Webpack, gulp, etc...
    2) node.js
    3) promise

    Что-нибудь практическое:
    1) Как бы вы валидировали форму, если ошибки валидации приходят после submit'a ее на сервер..
    2) Почему не работает следующий код, сделайте чтобы работало
    ...
    На истину не претендую, но такие вопросы имели место быть на собеседованиях. В беседе можно многое разузнать дополнительными вопросами и так далее. Так же, если часть вопросов вам неизвестна - не беда, многие и на половину ответить не могут.

    p.s. возможно дополню...
    p.p.s. звездочкой отметил, на мой взгляд не самые необходимые для junior-собеседования вопросы.
    Ответ написан
    31 комментарий
  • Почему не импортируются константы?

    maxfarseer
    @maxfarseer
    https://maxpfrontend.ru, обучаю реакту и компании
    Потому что вы сделали именованный экспорт, следовательно подключать нужно:
    import { Constants } from './Constants';
    Ответ написан
    Комментировать
  • Почему теряется this?

    maxfarseer
    @maxfarseer
    https://maxpfrontend.ru, обучаю реакту и компании
    С версии 0.14 при записи extends ... Component реакт больше не "автобиндит" this.
    Если использовать React.createClass - будет. Но лучше просто bind'ить необходимое в constructor'e
    Ответ написан
    Комментировать
  • Какая правильная организация react-redux приложения?

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

    Есть меню(не навигация, а просто набор плюшек, к примеру добавить заметку) и сама область где отображается эта заметка.

    Почему этот "набор плюшек" не завязать на "навигации" ?
    То есть "добавить заметку" -> /add, редактировать -> /edit/:id .. ? В любом случае, вы сами пишите о 2х областях, которые есть на всех страницах, значит у вас должен быть родительский компонент, в котором рендерится "шапка (меню это или нет, не важно) + рабочая область"

    Получается, если вы все же за идею с роутером, то примерный код будет таким:
    App.js
    ...
    <HeaderContainer /> // (или тупой <Header />)
    { this.props.children }
    ...


    Внутри children, само собой разумеется - то, что возвращает ваш роутинг, значит, код роутера примерно такой:
    ...
    <Route path='/add' component={AddContainer} />
    <Route path='/edit/:id' component={EditContainer} />
    ...


    Когда я говорю "контейнер", значит я подразумеваю (как и все остальные), что это компонент, который присоединен к redux ( то есть
    connect(mapStateToProps,mapDispatchToProps)(имя_компонента)
    ).

    Таким образом, мы уже решили вашу задачу про: Меню при вызове запускает компонент конкретной задачи. тот отправляет результат на рабочий стол и там оно хранится , так как у нас в меню все сделано с помощью Link из react-router'a, и наша рабочая область изменяется вместе с URL-адресом браузера. Если есть необходимость, все клики по меню "прогонять" через ActionCreators (AC) выполняя какие-то дополнительные действия, или просто "для порядка" - то вы можете использовать внутри ваших AC push из react-router-redux, выглядит это обычно так:
    dispatch(push('/newUrl'))

    Если вы с реакт-роутером не хотите пример делать, то принцип все равно будет такой же, только вместо URL адреса, у вас должен быть другой признак, на основе которого будет создаваться рабочая область.

    ---
    И еще. думаю вынести все данные(пункты меню к примеру) в отдельный файл(этакий недосервер)
    Где с ним лучше общаться? использую react-redux

    Определенно будете общаться в ваших функциях-создателях-действий, так как это же будет асинхронный запрос за json-файликом, а значит другого места быть не может. Если опустить правильные названия, то ваша область работы с файлом - actions.
    ---

    Как уже сказано, в конце не пойму о чем вы пишите... Структура "ответа с сервера" ? или о чем речь? Зачем вам компонент, который будет приводить структуру в нужный вид? и тд.

    ---
    Напоследок:

    Да и мне примеры вовсе не нужны. хочу для начала своих шишек набить.
    НО точно не хочу пару месяцев пилить проект(бесконечно усложняющаяся toDo) а потом понять что привык делать так как не надо.

    Никакого привыкания "делать, как не надо" - не бывает. Вы сначала делаете так, как считаете наилучше возможным, в процессе, что-то подпиливая, потом приходит озарение/совет - вы понимаете, что так будет лучше и делаете дальше. Если программист знает как "сделать лучше", но при этом делает "как привык" то грошь ему цена.
    Ответ написан
    8 комментариев
  • Какой метод необходимо вызвать при изменении props в дочернем компоненте?

    maxfarseer
    @maxfarseer
    https://maxpfrontend.ru, обучаю реакту и компании
    Когда у вас 1й раз происходит "и то и другое" - это ваш componentDidMount + render (у Child)
    Когда вы "нажимаете на кирпичик", то у вас componentDidMount уже не происходит (судя по коду, так как компонент у вас не удаляется из DOM и не появлется там снова). Но так как вы по нажатию меняете у родителя что-то, и это что-то прокидываете в потомка - значит "ему пришли новые props", следовательно используйте componentWillReceiveProps, где в nextProps - будет то что вам нужно.

    Документация про lifecycle methods

    p.s. проверьте, у вас в тексте примера есть someId и sometId (опечатка)
    Ответ написан
    2 комментария
  • Как решить проблему перезагрузки страницы react-router?

    maxfarseer
    @maxfarseer
    https://maxpfrontend.ru, обучаю реакту и компании
    Где-то отвечал на тостере, не могу найти вопрос, но ответ кроется здесь в главе, если у вас не грузится bundle, а скорее всего так и есть.
    Если нет - покажите ошибку в консоли браузера.
    Ответ написан
  • Со знанием какого MVC фреймворка больше шансов найти работу в русскоязычном сегменте?

    maxfarseer
    @maxfarseer
    https://maxpfrontend.ru, обучаю реакту и компании
    Всегда есть возможность посмотреть сайты с вакансиями! Вам нужно поанализировать hh.ru и moikrug.ru
    По моим наблюдениям, годных вакансий на удаленку, на Моем круге всегда было больше.
    p.s. фильтры по удаленке настраиваются на обоих сайтах.
    Ответ написан
    Комментировать
  • Как в react-redux реализовать вызов метода в ответ на изменение стейта?

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

    Представим ваш action creator (функцию), которая на success возвращает успешную авторизацию, например:
    $.ajax(url...
      success(data) { dispatch({type: AUTH_SUCCESS, data }) })


    Кто мешает сделать так?
    $.ajax(url...
      success(data) { 
        dispatch({type: AUTH_SUCCESS, data }) 
        loadUserCart(data.user_id) // <- еще один action creator
    })

    Суть уже понятна? Мы после успешной авторизации юзера, вызываем сразу же следующий экшен-крейтор:
    function loadUserCart(id) {
      return (dispatch) => {
        
        dispatch({ type: CART_REQUEST }) // получается, это событие вызовется сразу после успешной авторизации, практически мгновенно
    
        
        $.ajax(urlForCartUpdate...
          success(data) { 
            dispatch({type: CART_SUCCESS, data })
        })  
      }
    }


    Далее вы в компоненте с корзиной, настраиваете показ прелоадера, и вуаля! Получается, для юзера, без задержек, как только он авторизовался - у корзины будет крутиться прелоадер. Юзеру все понятно, он занимается своими делами. Как только "данные подъехали" - вы скрыли прелоадер и показали ему необходимые данные по корзине.

    нужно сначала сделать AJAX-запрос, а по его результатам уже рендерить корзину

    Именно это мы и сделали.

    P.S. не знаю, требуется ли это, но на всякий случай укажу, что чтобы сделать прелоадер в шаблоне, вам нужно в редьюсере корзины создать какое-нибудь поле (флаг), например isLoading и устанавливать его в true когда получите action с типом CART_REQUEST, и false для CART_SUCCESS. Таким образом, вы сможете сделать банальный if в шаблоне рендера и показывать либо разметку прелоадера, либо разметук с данными корзины.

    === вторая часть ===
    В компонентах-контроллерах есть только функция connect() со своими функциями-аргументами, которые передают данные в представление. Как-то реагировать на изменения состояния такие компоненты не умеют (я ведь не ошибаюсь в этом?).

    Еще как умеют, в этом и суть. Вы в mapStateToProps передаете в общем случае:
    {
      ваше_название_поля: reduxStore.название_редьюсера
    }

    В частном случае, может выглядеть так:
    function mapStateToProps(state) {
      return {
        rate: state.rate,
      }
    }


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

    Имейте ввиду, что все здесь написано для понимания простым русским языком, на самом деле, так как вы используете компонент Provider на самом верхнем уровне вашего приложения, он прокидывает необходимые props вниз. Ваши connect(Компоненты) умеют реагировать на изменение необходимых props => реакт вызывает рендер, так как "пришли новые props".
    Ответ написан
    2 комментария
  • Чтение и перенос json данных в таблицу ES6?

    maxfarseer
    @maxfarseer
    https://maxpfrontend.ru, обучаю реакту и компании
    К предыдущему вопросу добавлю, так как вижу тэг 'react'

    1) вам нужно осознать, что раз приходят новые данные, значит у нас есть какой-то "изменяемый кусок", следовательно - необходимо будет использовать state, следовательно нужно задать this.state в constructor, с какими-то начальными данными, например "пустой массив"

    2) нужно выполнить запрос после того, как компонент окажется на странице, для этого подойдет метод жизненного цикла - componentDidMount

    3) в момент componentDidMount вы может выполнить запрос с помощью любой библиотеки, например jquery из ответа выше, но чаще с реактом используют npm-fetch, axios и подобные.. а можно и вообще XHR объектом стандартным обойтись...

    4) после выполнения запроса, на успешный ответ, вы должны изменить state, то есть вызвать this.setState

    5) после выполнения шагов выше, реакт вызовет метод render - в котором вы уже отрисуете таблицу, на основе ваших данных из state
    Ответ написан
  • Выбор js фреймворка (технологии) для crm?

    maxfarseer
    @maxfarseer
    https://maxpfrontend.ru, обучаю реакту и компании
    Как уже не раз здесь обсуждалось, сейчас из "трендов" 3 технологии: react, angular, vue
    Выбирайте ту, которая больше по душе...
    По популярности уже сложно сказать, где больше/лучше, но думаю по angular больше различных материалов и рецептов, чем по react/vue + желаемый вами material и angular от одной конторы.
    Ответ написан
  • Redux-Form. Как получить formValueSelector формы, когда имя формы передается в пропсах?

    maxfarseer
    @maxfarseer
    https://maxpfrontend.ru, обучаю реакту и компании
    Из примера непонятно, что мешает передавать вместо строки 'selectingFormValues' - переменную, в которой будет название формы?

    Например в switch case операторе, в зависимости от props устанавливать необходимое значение в переменную и ее передавать в formValueSelector(моя_переменная)
    Ответ написан
  • Как сделать анимацию добавления элемента?

    maxfarseer
    @maxfarseer
    https://maxpfrontend.ru, обучаю реакту и компании
    Есть анимация в реакте ( React transition group ), которая сделана на основе ng-animate, которая в свою очередь использовалась в ангуляре. Если с ней знакомы, то быстро въедете, если нет - придется, наверное, пару раз перечитать доку.

    Суть: вы добавляете css классы по типу NAME-enter, NAME-enter-active и подобное (все опять же есть по ссылке выше), а в реакт компоненте указываете внутри ReactCSSTransitionGroup transitionName="NAME"
    Ответ написан
    Комментировать
  • Как открыть страницу поста в wordpress rest api?

    maxfarseer
    @maxfarseer
    https://maxpfrontend.ru, обучаю реакту и компании
    Судя по документации, чтобы получить пост, вам нужно вызвать:
    GET /wp/v2/posts/<id>
    Собственно в чем проблема?

    как сделать вывод именно того поста по которому нажали

    Передать именно тот id в запрос. Если вопрос в этом - то id можно взять, например из data-* атрибута, предварительно туда запихнув его в момент рендера всех постов на странице.

    Если вопрос в том, как открыть его по отдельному роуту, то вам нужен react-router и роут вида:
    <Route path='/posts/:id' component={PostMoreContainer} />


    Тогда у вас в this.props.params будет id вашей статьи и вы сможете выполнить GET запрос в момень componenDidMount. Подробнее в документации реакт-роутера.

    p.s. недавно подъехала статейка (ENG) по вашему вопросу.
    Ответ написан
    1 комментарий
  • Как перерисовывается DOM при использовании с Redux?

    maxfarseer
    @maxfarseer
    https://maxpfrontend.ru, обучаю реакту и компании
    В общем случае, метод render компонента вызывается в случае изменения state / props
    Никто (даже создатель библиотеки Redux) не просит вас отказываться от state. Это хорошая и удобная "фича" компонентов в react.

    Когда вы подключаете redux, вы оборачиваете все свое приложение в Provider (конечно, с указанием store). Затем Provider прокидывает куда нужно (в зависимости от ваших "подключенных" через функцию connect компонентов) необходимые props. Так как приходят новые props - вызывается метод render и компонент перерисовывается.

    Во всем этом можно убедиться, если посмотреть ваше корректное приложение на redux через React Dev Tools в консоли браузера. Вы увидите, что на самом верху "гнездится" Provider с кучей данных. Затем ниже по дереву, вы найдете свои, обернтуые в connect(Компонент) компоненты. Никакой магии здесь нет.
    Ответ написан
    Комментировать
  • React.js: Почему может не рендериться компонент?

    maxfarseer
    @maxfarseer
    https://maxpfrontend.ru, обучаю реакту и компании
    Так же (плюс то, что вам уже ответели), возможно, что в компоненте ./Message.jsx неправильный export default

    Если там указн export без default, то значит нужно импортировать с фигурными скобками, причем имя в импорте, должно совпадать с именем в экспорте. (например, import { Message } from ... )

    p.s. приложите код компонента Message
    Ответ написан
    Комментировать
  • Почему не обновляется props после unshift и dispatch?

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

    Здесь кроется главная ошибка, вы "сделали диспатч", того же самого массива. Почему он стал новым? Не правда.

    Т.е. вы возвращаете тот же самый объект (в js объекты передаются по ссылке), для react вьюхи ничего не изменилось, значит render вызывать не надо => ничего не происходит.

    Попробуйте возвращать новый(!) массив, в вашем случае это:
    setAdminData: [clients_info, ...currentList]

    Либо чуточку понятнее, но вставляя в конец массива:
    setAdminData: currentList.concat(clients_info)

    Метод concat всегда возвращает новый массив.

    Ну и чтобы стало совсем понятно в чем дело, попробуйте в консоли выполнить следующий код:
    let arr1 = [1,2,3,4]
    let arr2 = arr1
    arr2.unshift(1)
    console.log(arr1)

    Вопросы: чему равен arr1? Почему? Будет ли arr1 === arr2, почему?
    Еще вопросы: В каком случае react вызывает функцию render?
    Ответ написан
    5 комментариев
  • Как правильно настроить webpack-dev-server?

    maxfarseer
    @maxfarseer
    https://maxpfrontend.ru, обучаю реакту и компании
    1) либо не создан index.html на одном уровне с конфигом webpack
    2) либо нет роута по '/'

    p.s. + покажите console браузера, может там еще какая ошибка по делу будет.
    Ответ написан
  • Как подружить React, OpenSeaDragon и плагин селекта к нему?

    maxfarseer
    @maxfarseer
    https://maxpfrontend.ru, обучаю реакту и компании
    Судя по доке, вам достаточно "Include dist/openseadragonselection.js after OpenSeadragon in your html." (добавить openseadragonselection после вашего OpenSeadragon скрипта). Вы вроде бы так и сделали..

    Думаю, стоит попробовать без npm просто в index.html подключить сначала OpenSeadragon, затем OpenSeadragonSelection (с помощью тэга scripts) и далее уже создавать viewer как вы это делаете в вопросе. Если так будет работать, то уже думать дальше, либо так и оставить. Если так работать не будет, то вопрос не в том, как подружить React + OpenSeaDragon + плагин, и стоит создать чистый index.html статичный и прямо в нем прописать в тэге scripts пример из документаций, чтобы убедиться, что все на самом деле работает.
    Ответ написан
  • Примеры приложений, разработанных на React/Angular?

    maxfarseer
    @maxfarseer
    https://maxpfrontend.ru, обучаю реакту и компании
    На react: facebook, instagram.. или здесь целый список.

    Здесь можно подсмотреть некоторые open source проекты на реакте.
    Ответ написан
    Комментировать
  • React. Как динамически вешать обработчики?

    maxfarseer
    @maxfarseer
    https://maxpfrontend.ru, обучаю реакту и компании
    Добавлю, что если есть необходимость навешивать обработчики на события, которых нет "из коробки" (react events), например на resize окна,, можно использовать:
    1) addEventListener (+ создание событий)
    2) привычное вам jquery (многие против этого, лично мое мнение: иногда необходимость есть, ничего плохого здесь не вижу)

    p.s. для доступа к DOM элементу, можете использовать ref.
    Ответ написан
    Комментировать