Задать вопрос
gatilin222
@gatilin222
Frontend-разработчик

Прокомментируете приложение на React/Redux?

Привет всем.
Я сделал свое первое приложение на React/Redux и ищу любой обратной связи(код, дизайн).
Приложение отображает текущую погоду пользователя(можно менять локацию).
Гитхаб
Приложение
  • Вопрос задан
  • 813 просмотров
Подписаться 1 Оценить 7 комментариев
Помогут разобраться в теме Все курсы
  • Яндекс Практикум
    Мидл фронтенд-разработчик
    5 месяцев
    Далее
  • Javascript.ru
    Курс по React
    5 недель
    Далее
  • Нетология
    Fullstack-разработчик на Python + нейросети
    20 месяцев
    Далее
Решения вопроса 1
devellopah
@devellopah
1) ты можешь использовать spread operator из-под коробки

вместо

case 'SWITCH_EDIT_MODE':
      return Object.assign({}, state, {
        editMode: action.value
      })


так

case 'SWITCH_EDIT_MODE':
      return { ...state, editMode: action.value}


2) weatherApiId спрятать в .env, а .env кинуть в .gitignore (dotenv-webpack to the rescue)

3)MainContainer на мой взгляд
import React from 'react';
import { connect } from 'react-redux';
import { bindActionCreators } from 'redux';
import * as actionCreators from './../../actions/actionCreators';
import Main from './../Main/Main';

class MainContainer extends React.Component {

	componentDidMount() {
    this.props.actions.detectLocation();
  }

  render() {
  	return <Main {...this.props.store}  {...this.props.actions} />
  }
}

const mapStateToProps = state => ({ store: state })
const mapDispatchToProps = dispatch => ({ actions: bindActionCreators(actionCreators, dispatch) })

export default connect(mapStateToProps, mapDispatchToProps)(MainContainer)


и Main соответсвенно
import React from 'react';
import PropTypes from 'prop-types';

import styles from './Main.css';

import PageBackground from './../PageBackground/PageBackground';
import WeatherIcon from './../WeatherIcon/WeatherIcon';
import Temperature from './../Temperature/Temperature';
import Location from './../Location/Location';
import Loader from './../Loader/Loader';
import Error from './../Error/Error';

const propTypes = {
  pageBackground: PropTypes.string,
  location: PropTypes.object,
  editMode: PropTypes.bool,
  changeLocation: PropTypes.func,
  switchEditMode: PropTypes.func,
  weatherIcon: PropTypes.string,
  temperature: PropTypes.number,
  weatherDescription: PropTypes.string
};

export default function Main (props) {
  return (
    <div className={styles.container}>
      {props.loading && <Loader />}
      {props.loadingError && <Error>Sorry, an error occurred. Try to reload page</Error>}
      <PageBackground background={props.pageBackground} />
      <Location city={props.location.city}
        editMode={props.editMode}
        onLocationSelect={props.changeLocation}
        onChangeLocationClick={() => props.switchEditMode(true)}
        onInputBlur={() => props.switchEditMode(false)} />
      <div className={styles.split}>
       <WeatherIcon code={props.weatherIcon} class={styles.icon}/>
      	<span className={styles.date}>Today</span>
      </div>
      <Temperature value={props.temperature}/>
      <div className={styles.description}>props.weatherDescription}</div>
    </div>
  )
}

Main.propTypes = propTypes;


4) в идеале все компоненты кромеMainContainer должны (в этом проекте) быть functional components.

5) можно было бы написать больше редьюсеров(отдельный для получения location, для weather, для pagebackground) это позволило бы тебе "выдавить" логику из дочерних компонентов(PageBackground, Temperature, WeatherIcon) в MainContainer, чтобы представить в функуиональном виде

6) нужно ограничить кол-во запросов за определённый промужуток времени(например, 15минут), ибо погода не меняется так часто (express-rate-limit).
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Прикольный дизайн)))
В коде наткнулся на небольшой косяк
fetchJsonp(...)
.then(response => response.json(), error => {dispatch(loadingFailed())})
.then(weather => dispatch(receiveWeather(weather)));

Если у вас fetchJsonp падает, то dispatch(loadingFailed()), но после этого всеравно же заходит в dispatch(receiveWeather(weather)), где weather - undefined =(
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
ITK academy Нижний Новгород
от 50 000 до 90 000 ₽
IT ATLAS Москва
от 200 000 до 250 000 ₽
ITK academy Казань
от 50 000 до 90 000 ₽