Ответы пользователя по тегу React
  • Как использовать combineReducers redux?

    devellopah
    @devellopah
    начальное состояние
    const initialState = {auth: {}, lotteries:{}, categories: {}, tickets:{}}

    сократи количество редьюсеров до 4(по одному на каждый кусок состояния)
    const reducer = combineReducers({ auth, lotteries, categories, tickets})
    Ответ написан
  • Как сделать, чтобы после нажатия на кнопку она исчезала на одну минуту с отсчётом, а потом снова появлялась?

    devellopah
    @devellopah
    Смена кусков интерфейса реализуется через условный рендеринг

    {this.state.secondsLeft
        ?  <Countdown secondsLeft={this.secondsLeft} />
        :  <Form runTimer={this.runTimer} />}


    нужно выполнить props.runTimer на успешный сабмит формы
    Ответ написан
    Комментировать
  • Если в action нет асинхронных запросов нужно ли использовать middleware?

    devellopah
    @devellopah
    посчитай прямо в компоненте

    import { sum } from 'lodash'
    ...
    // где-то в методе какого-то компонента
    this.props.action(sum([a, b, c]))
    ...
    const action = payload => ({
        type: ACTION_TYPE,
        payload
    });
    Ответ написан
    Комментировать
  • Как передать данные из ExpressJS в ReactJS?

    devellopah
    @devellopah
    Делал такую штуку пару лет назад, правда, использовал для фронта vuejs (но это не важно).
    Здесь прокси-сервер.
    Ответ написан
    Комментировать
  • Почему при перезагрузке страницы не грузит контент?

    devellopah
    @devellopah
    в файле маршрутизации (обычно это App.js, если поднимал через create-react-app) добавляешь
    <Route path='/info' component={Info}/>

    в компоненте <Info /> меняешь куски

    ...
        <nav>
          <ul className='info-menu-list'>
            <li className='info-menu-item'>
              <NavLink to={this.props.match.path}>Валютный курс</NavLink>
            </li>
            <li className='info-menu-item'>
              <NavLink to={this.props.match.path + '/market'}>Валютный рынок</NavLink>
            </li>
            <li className='info-menu-item'>
              <NavLink to={this.props.match.path + '/rialto'}>Валютная биржа</NavLink>
            </li>
            <li className='info-menu-item'>
              <NavLink to={this.props.match.path + '/nbu'}>НБУ</NavLink>
            </li>
            <li className='info-menu-item'>
              <NavLink to={this.props.match.path + '/law'}>Закон</NavLink>
            </li>
          </ul>
        </nav>
    ...


    ...
    <Switch>
      <Route exact path={this.props.match.path + '/market'} component={InfoMarket} />
      <Route exact path={this.props.match.path + '/rialto'} component={InfoRialto} />
      <Route exact path={this.props.match.path + '/nbu'} component={InfoNbu} />
      <Route exact path={this.props.match.path + '/law'} component={InfoLaw} />
      <Route exact path={this.props.match.path} component={InfoRates} />
    </Switch>
    ...
    Ответ написан
  • Как правильно хранить и передавать состояние в React.js?

    devellopah
    @devellopah
    минимальный набор для вашего проекта:
    react,
    react-dom,
    react-router-dom(маршрутизация),
    redux(хранилище данных),
    react-redux(подключение компонентов к хранилищу),
    redux-thunk(асинхронное изменение данных в хранилище),
    axios(удобный http-клиент),
    formik(формы)
    Ответ написан
    1 комментарий
  • Как хранить секретные данные в Реакт?

    devellopah
    @devellopah
    на фронте никак
    Ответ написан
    Комментировать
  • Чисто Django или в связке с React?

    devellopah
    @devellopah
    так просто круче, но сложнее
    если бюджет достойный связки restful api + react.js(vue.js), то берёте эту связку, в противном случае делаете "по старинке"
    Ответ написан
    Комментировать
  • Как сохранить данные в хранилище, передаваемые из метода компонента, используя mapDispatchToProps?

    devellopah
    @devellopah
    // actions.js
    export const increaseNumber = value => ({ type: 'INCREASE_NUMBER', value })
    
    //reducer.js
    ...
    case 'INCREASE_NUMBER':
        return {...state, value: state.value + action.value}
    ...
    // SmallApp.js
    import { increaseNumber } from '..путь до/actions'
    ...
      render(){
    
        return (
          <div>
            <AddComponent add = {this.props.increaseNumber} />
          </div>
        )
      }
    ...
    
    export default connect(mapStateToProps, { increaseNumber })(SmallApp)


    p.s. подключение AddComponent к хранилищу излишнее
    Ответ написан
  • Чем отличается react от vue, основное отличие?

    devellopah
    @devellopah
    react - это ООП + функциональное программирование
    vue - это ООП + реактивное программирование
    Ответ написан
    5 комментариев
  • Зачем нужен redux-thunk?

    devellopah
    @devellopah
    Я бы сказал, что redux-thunk, redux-saga или какое-то другое "решение" для организации сайд-эффектов не является необходимой зависимостью для любого приложения, написанного на reactjs.
    Точно так же как и не является необходимостью сам redux. Но если ваше приложение нуждается в инструменте для управления состоянием(redux), то автоматически из этого следует, что оно так же нуждается в инструменте для организации сайд-эффектов.

    В redux-thunk вы диспатчите функцию словно это action. Это очень важно. В контейнере вне зависимости от "природы" экшена, вы будете писать this.props.dispatch(whateverAction).

    А ваш коллега, напротив, будет вынужден синхронные экшены диспатчить через this.props.dispatch(syncAction), а асинхронный просто вызовом функции, содержащей setTimeout.

    Как-то не очень красиво, да и самому контейнеру не обязательно знать какие экшены синхронные, а какие асинхронные.
    Ответ написан
    2 комментария
  • Где можно посмотреть пример кода компонента React взаимодействующий с API?

    devellopah
    @devellopah
    в идеале компонент не "взаимодействует" с api.
    если используешь redux-thunk, то запрос на api совершает оператор(action creator), сам же контейнер всего лишь дёргает этот оператор в методе componentDidMount.
    Ответ написан
    Комментировать
  • Лучшая библиотека для asynchronous data fetching?

    devellopah
    @devellopah Автор вопроса
    Прошу прощения, не совсем верно сформулировал влпрос. Я имел ввиду библиотеку, которая сохраняет полученные ассинхронным запросом данные в редуксе и затем снабжаете этими данными компоненты.
    Ответ написан
    Комментировать
  • Что именно рендерит на сервере Next.js?

    devellopah
    @devellopah
    у них, видимо, code-splitting "из коробки", но ты и сам можешь настроить, если с вебпаком "в ладах"

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

    Затем на клиенте react проверяет совпадают ли значения аттрибутов data-react-checksum клиетского приложения и серверного. Если совпадают, это означает, что если мы "поднимем" клиентское приложение(дорогая операция), то что мы получим будет совпадать с тем, что отправил сервер. Выходит, что этого можно избежать. Именно это и делает реакт, просто копирует полученный на сервер DOM в клиентское приложение.

    Next.js делает всё это за тебя. С одной стороны это хорошо, не надо возиться с настройкой серверного рендеринга, с другой стороны - плохо, потому что всё-таки стоит знать как всё происходит в деталях на сервере.
    Ответ написан
    Комментировать
  • React. Полезные библиотеки на подобие Redux?

    devellopah
    @devellopah
    на самом деле, таких библиотек пишется очень много. Поэтому лучше подпишись на рассылки по реакту, пусть новинки приходят на почту
    Ответ написан
    Комментировать
  • Почему в работе так категорично требуют реакт или ангуляр?

    devellopah
    @devellopah
    V1 - производительность приложения написанного на ваниле
    V2 - производительность приложения, написанного с помощью реакт(или альтернативы)
    T1 - время, потраченное на написание ванильного приложения
    T2- время, потраченное на написание реактовского варианта аналогичного приложения

    V1 - V2 < T1 - T2

    Даже если ты напишешь сложное приложение на ваниле, которое будет читабельно и будет поддерживаемо и масштабируемо так же хорошо как и вариант на реакте, ты же не идиот, чтобы каждый раз так сложно писать. Ты захочешь упростить написание кода, что-то абстрагировать и в итоге сам напишешь ui library типа vuejs.
    Ответ написан
    9 комментариев
  • Прокомментируете приложение на React/Redux?

    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).
    Ответ написан
    3 комментария
  • Объясните простым языком Higher Order Component в React?

    devellopah
    @devellopah
    замени слово component на слово function и всё поймёшь
    Ответ написан
    Комментировать