Ответы пользователя по тегу React
  • Является ли корректным в идеологии Redux диспатчить экшен постфактум?

    rockon404
    @rockon404 Куратор тега React
    Frontend Developer
    А зачем вам понадобилась подобная интеграция роутинга с Redux? Я к тому, что многие люди пихают в стор все подряд, сами не понимая зачем.

    смена роута > dispatch > обновление state

    Непонятно зачем вообще в этой схеме dispatch > обновление state, почему бы не использовать
    dispatch(push('/somePlace')); раз уж в проекте используетеся react-router-redux?

    Насколько я знаю, redux предполагает несколько иную очередность: dispatch > смена роута в ответ на dispatch > обновление state.


    Непосредственно Redux предполагает только dispatch > обновление state. Остальное это middleware и сайд эффекты.

    Мы в последних двух проектах вообще не использовали react-router-redux.
    Ответ написан
    1 комментарий
  • Как реализировать подобный функционал на react + REDUX?

    rockon404
    @rockon404 Куратор тега React
    Frontend Developer
    В самом простом варианте.
    1. При загрузке приложения по опеределеному роуту, разбирать query string на составляющие и по ним делать запрос к API и рендерить состояние фильтров.
    2. По клику на фильтр, обновление его состояния и push нового location с query string, собранной по новому состоянию фильтра.
    Ответ написан
    9 комментариев
  • Где джуну получать тестовые задания?

    rockon404
    @rockon404 Куратор тега React
    Frontend Developer
    Для тестового задания надо что-нибудь посложней. Простенький real world app.

    Например простенький Weather App:
    1. Строка поиска городов(можно использовать например API Google):
    2. Результат поиска с погодой.
    3. Список сохраненных городов.
    4. Погода в текущей позиции.
    Для погоды можно использовать API любого сервиса(например OWM API).
    Такое приложение спроектировать сложней, тут помимо тупой работы с API библиотек придется проектировать.
    Можно использовать роутинг, а можно обойтись и без него. Да и целый ряд задач, над решением которых новичку придется хорошо подумать:
    1. Структура приложения
    2. Работа с API
    3. Реализация строки поиска
    4. Обработка исключений( нет связи, отклонили использование геолокации)
    5. Верстка
    Когда такой проект начнет оживать и работать как задумано это, конечно, принесет человеку радость и уверенность в себе.

    Так же можно реализовать Dashboard, но это посложней и требует серверной части или использование публичного тестового API вроде Star Wars API
    Еще можно реализовать простенький клиент для любого сервиса. Например поиски и проигрывание видео c Youtube.

    ИМХО совсем простые задачи, конечно могут показать знание API той или иной библиотеки, но обладает ли кандидат навыками необходимыми для Junior Developer они не отразят. А Junior Developer должен уметь самостоятельно решить точно поставленную задачу с пояснениями и рекомендациями по пути ее решения.
    Ответ написан
    8 комментариев
  • Как использовать ReactJS если приложение на RoR?

    rockon404
    @rockon404 Куратор тега React
    Frontend Developer
    Вы уверены, что вам вообще нужен React? Если да, то либо переписывайте весь server side rendering на React, для этого понадобится дополнительный node.js сервер, либо реализуйте на React только модули со сложной логикой для которых не нужна индексация: корзина, личный кабинет, оформление заказа, админка.
    Ответ написан
    Комментировать
  • Как работать с API?

    rockon404
    @rockon404 Куратор тега React
    Frontend Developer
    1. да
    2. да
    3. лучше сохранять в state данные, а мапить их уже в render
    Ответ написан
    1 комментарий
  • Как настроить маршрутизацию?

    rockon404
    @rockon404 Куратор тега React
    Frontend Developer
    Вы можете добавить в store ключ isLoaded и проверять:
    const { isLoaded, fetchData } = this.props;
    
    if (!isLoaded) fetchData();


    Не понятно зачем action fetchData абстрактный. Переделайте в fetchTodos и пропишите url в нем, а не передавайте в компоненте.

    Контейнер CreateTodo можно переписать так:
    import React, {Component} from 'react';
    import { connect } from "react-redux";
    import { addData } from '../actions';
    import Form from '../components/Form';
    
    const mapDispatchToProps = {
        addData,
    };
    
    export default connect(null, mapDispatchToProps)(Form);
    Ответ написан
    2 комментария
  • Как определять state компонента?

    rockon404
    @rockon404 Куратор тега React
    Frontend Developer
    В state пишут состояние. Если компонент пребывает в разных состояниях их необходимо фиксировать. Данные полученные от пользователя или с сервера это тоже состояние. Другой вопрос, каким состоянием воспользоваться непосредственно компонента, родителя или вообще вынести в хранилище redux? Чтобы хорошо понимать этот вопрос необходим опыт и знания полученные путем анализа и сравнения разных решений в контексте разных задач. Изучайте хороший код, читайте статьи, пишите.
    Если есть более конкретные вопросы на примерах - задавайте.
    Ответ написан
    1 комментарий
  • ReactJS: Почему компонент не обновляется при изменении хранилища?

    rockon404
    @rockon404 Куратор тега React
    Frontend Developer
    Вы передаете в компонент один и тот же объект. Вот он и не обновляется. Изменения хранилища ваш компонент не интересуют, только изменение данных которые вы туда передаете.
    Храните плоские данные. Тогда таких проблем возникать не будет.
    Ответ написан
    3 комментария
  • Как сохранить последнее значение в props?

    rockon404
    @rockon404 Куратор тега React
    Frontend Developer
    Как я понял, у вас контролируемый input. Вам надо разделить в коде searchValue и значение input(назовем его searchInputValue). То есть, по нажатию кнопки Поиск пишите значение searchInputValue в state как searchValue, его и передавайте в компонент с ошибкой. В итоге в input будет использоваться searchInputValue, в ошибке и поисковом запросе searchValue.
    Ответ написан
    8 комментариев
  • Как быть в рамках Redux, когда экшены раскиданы по компонентам?

    rockon404
    @rockon404 Куратор тега React
    Frontend Developer
    Решение плохое. В таком случае можно было и вовсе обойтись без Redux. Обернуть в connect можно любой компонент. И чем ближе вы будете передавать части состояния к месту их использования, тем меньше в вашем приложении будет лишних перерисовок.
    Одно модальное окно на все приложение не лучшее решение.
    Ответ написан
    Комментировать
  • Отображение api call в другом компоненте, как совершить?

    rockon404
    @rockon404 Куратор тега React
    Frontend Developer
    Самый простой вариант это передавать хандлер и данные через родителя:
    class Parent extends Component {
      state = {
        search: '',
        data: [],
      };
    
      componentDidMount() {
        fetchData().then(({ data }) => this.setState({ data }));
      }
    
      handleFilterChange = e => {
        this.setState({ search: e.target.value });
      };
    
      render() {
        const { data, search } = this.state;
        const filteredData = data.filter(el => /* some stuff */);
        
        return (
          <Wrapper>
            <SearchFilter onChange={this.handleFilterChange} />
            <DataList data={filteredData} />
         </Wrapper>
        )
      }
    }
    Ответ написан
    Комментировать
  • Как по клику узнать ключ?

    rockon404
    @rockon404 Куратор тега React
    Frontend Developer
    Зачем вам ключ? Передавайте сам элемент:
    сlick(e, item) {
      console.log(item);
    }
    
    render() {
        const { array } = this.state;
        const unit = array.map((item, index) => (
          <a 
            key={index}
            style={{display:"block"}}
            onClick={(e) => this.click(e, item)}
          >
            Hello, {item}
          </a>
         ));


    Если все-таки нужен именно ключ, то просто добавьте еще один аргумент в вызов click.
    Ответ написан
    3 комментария
  • Хранение (для вёрстки) данных состояния приложения в Redux. Адекватно ли?

    rockon404
    @rockon404 Куратор тега React
    Frontend Developer
    Если, что-то проще сделать без redux, не надо это туда тянуть. Это касается всего: форм, модалок, фильтров и прочего.
    Определять версию лучше по user agent, а передавать эти данные через контекст.
    Ответ написан
    Комментировать
  • Почему выдает ошибку cannot read propery of undefined?

    rockon404
    @rockon404 Куратор тега React
    Frontend Developer
    Видимо в initialState пустой массив items не задаете или уничтожаете его в редьюсере в кейсе FETCH_MENU. Без кода редьюсера точно не сказать. Но думаю дело именно в этом.

    На будущее. Прикладывайте к вопросу примеры кода, а не скриншоты. И примеры именно того кода который вызывает ошибку, а не какого-то другого.
    Ответ написан
    Комментировать
  • Почему, когда обновляю state в родительском компоненте в дочернем props остаються тикими же?

    rockon404
    @rockon404 Куратор тега React
    Frontend Developer
    Вы задаете state в конструкторе. Конструктор вызывается лишь раз, при инициализации компонента.
    this.props.data обновляется, просто, вы его, видимо, не используете.

    Насколько я понимаю вашу задачу, вам нет никакого смысла писать props в state. Просто используйте props напрямую в методе render и все. Если надо их менять по какому либо событию, то предавайте дополнительно хандлер из родителя.

    Старайтесь избегать макарон вида:
    label={this.props._sharedData.loc.advanced_search.select_brand}
    Ответ написан
    7 комментариев
  • Почему Promise pending?

    rockon404
    @rockon404 Куратор тега React
    Frontend Developer
    Вы неправильно работаете с асинхронным кодом. Вызывать его в render неправильно.
    Вы что сделать то хотите?
    Для работы с асинхронными вызовами основанными на Promise используйте метод then или async/await функции.
    Пример использования метода then:
    isValidEmail("mail@gmail.com").then(result => someAction(result));

    Пример использования async/await:
    async someHandler() {
      const result = await isValidEmail("mail@gmail.com");
    
      return someAction(result);
    }
    
    async someOtherHandler() {
      const result = await isValidEmail("mail@gmail.com");
      
      /* вызов someOtherAsyncAction тоже возвращает Promise, поэтому ждем 
         и возвращаем только когда придет результат, для этого используем 
         ключевое слово await                                             */
      return await someOtherAsyncAction(result); 
    }
    Ответ написан
    3 комментария
  • Как вывести спиннер по середине экрана?

    rockon404
    @rockon404 Куратор тега React
    Frontend Developer
    Можно так:
    const wrapperStyle = {
      position: 'fixed',
      top: 0,
      bottom: 0,
      left: 0, 
      right: 0,
      display: 'flex',
      justifyContent: 'center',
      alignItems: 'center',
      height: '100%'
    };
    
    const Preloader = () => (
      <div style={wrapperStyle}>
        <div className="spinner" />
      </div>
    );
    Ответ написан
    Комментировать
  • Как добавлять react-атрибуты по условию?

    rockon404
    @rockon404 Куратор тега React
    Frontend Developer
    Вариант 1:
    <li className={someCondition ? someClass : someOtherClass} />

    где someCondition условие, например:
    someProp === SOME_CONSTRANT

    Вариант2:
    <li className={getClassName(someProp)} />

    Вы передаете в вызове map элемент первым аргументом, но при этом обращаетесь к нему через массив:
    key = {this.props.data[index]['id']}
    очень нелогичный ход, исправьте на:
    key = {value.id}
    Ответ написан
    3 комментария
  • Как сразу после получения данных найти min и max элемент массива?

    rockon404
    @rockon404 Куратор тега React
    Frontend Developer
    const min = res.data.reduce(
      (acc, el) => (acc > el.price ? el.price : acc),
      Infinity
    );
    
    const max = res.data.reduce(
      (acc, el) => (acc < el.price ? el.price : acc),
      -Infinity
    );
    
    this.setState({ studios: res.data, isLoading: false, min, max });
    Ответ написан
    Комментировать
  • Почему возникает ошибка при считывании данных из state?

    rockon404
    @rockon404 Куратор тега React
    Frontend Developer
    Опечатка и неправильное условие. Исправить можно так:
    onChange = value => {
      const [from, to] = value;
    
      const filteredStudios = this.state.studios.filter(studio => 
        studio.price >= from && studio.price <= to
      );
    
      this.setState({
        studios: filteredStudios,
        from,
        to,
      });
    };


    Только вы перезаписываете отфильтрованный state поверх не отфильтрованного. Это тоже думаю неправильно.
    Ответ написан
    5 комментариев