Рубрики
Без рубрики

Строительство Калькулятор температуры батареи Tesla с реакцией (часть 1)

Мэтью Чои, здание калькулятор батареи Tesla Callet Calculator с React (часть 1) в этой серии статей, я буду проходить вас через процесс создания калькулятора диаметра аккумулятора Tesla с реакцией. В этом руководстве мы построим реагированную версию здания девизы TODD TESLA

Автор оригинала: FreeCodeCamp Community Member.

Мэтью Чой

В этой серии статей я пойду через процесс создания калькулятора диапазона батареи Tesla с реакцией.

В этом руководстве мы построим реагистрационную версию девизы Todd Motto’s Строительство Калькулятор температуры батареи Tesla с угловыми 2 Реактивными формами Отказ

Таким образом, этот пост повторно использует некоторые материалы (данные, изображения и стиль CSS). Мы сосредоточимся на восстановлении его в Реагистрирующий способ Отказ

Это последнее изображение GIF нашего приложения.

? Проверьте l ive версия прежде чем мы начнем.

? Вы также можете проверить S Зарубежный код.

Теперь давайте создадим приложение шаг за шагом.

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

1. Настройка проекта и создание-реактивное приложение

1.1 Требования

Инструменты и версии, которые я использовал во время реализации этого приложения:

node v7.3.0npm v3.10.10

1.2 Create-React-App

Creat-React-App Является ли новый инструмент, открытый с помощью Facebook для быстрого разработки приложения для быстрого реагирования, который позволяет легко начать реагировать приложения без сложных установок. Вы можете легко установить наш проект Реагнистон-тесла-диапазон-калькулятор и запустите приложение прямо сейчас со следующей командой:

  • NPM Установить -G Create-raction-App
  • React-app create-raction-app.
  • CD React – Tesla-Range-калькулятор
  • Начнем NPM

Создайте новое приложение через Create-React-App и открыть http://localhost: 3000/ Чтобы проверить сгенерированное приложение.

Если вы видите экран ниже, проект был успешно настроен.

Прежде чем мы начнем проект, нам нужно коснуться структуры источника проекта. Просто оставьте файлы, которые нам нужны для проекта и удалите остальные. (Удалить app.test.js, logo.svg)

Теперь наш каталог SRC должен выглядеть так:

src - App.css - App.js - index.css - index.js

Вот структура источника проекта:

1.3 Точка входа в проект

Сначала нам нужно установить точку записи, чтобы начать наше приложение Tesla. К счастью, это уже создано Create-React-App Отказ

SRC/App.js Является ли точка входа для нашего приложения.

Во-первых, измените свой App.js к этому:

import React, { Component } from 'react';import './App.css';
class App extends Component {  render() {    return (      

Let's get started

); }}
export default App;

Когда вы сохраняете файл, он будет автоматически скомпилирован, и вы можете увидеть обновленный экран.

1.4 Проектные изображения/активы

Все изображения, необходимые для этого проекта, могут быть загружены из:

Распаковать atsets.zip и поместите все изображения в SRC/Активы каталог и поместите загруженные favicon.ico в исходном корне.

react-tesla-range-calculator/src/assets

1.5 Сервис данных

Данные, которые вы можете получить от сайта Tesla, жестко закодированы и очень большие, поэтому мы будем использовать новую версию данных TODD, чтобы облегчить использование. ссылка на сайт

Мы не используем Инъекционно декоратор используется в Angular2, поэтому мы будем копировать только Экспорт Часть, просто сохраните его в SRC/Services/Batteryservice.js пока что. Позже мы будем использовать Импорт Это в Теслабатария контейнер.

Мы пересмотрим эту службу данных позже.

2. Разбие Ui

Почти все AID-приложением uis состоит из композиции компонентов. Например, приложение погоды состоит из компонента, который отображает локальное имя, компонент, который отображает текущую температуру, а компонент графа, который представляет собой пятидневный прогноз. По этой причине хорошая идея разложить UI в компонентные единицы перед разработкой приложения RACT.

Макет этого приложения показан ниже

Уэй представлен компонентным деревом следующим образом.

 -- Application entry point 
-- Container -- Presentational Component -- Presentational Component -- Presentational Component -- Presentational Component -- Presentational Component -- Presentational Component

2.1 Контейнерные и презентационные компоненты

В вышеупомянутом валке компонента мы можем видеть, что он классифицируется как Контейнерный компонент и Предметующая компонент Отказ

Это полезный рисунок, который можно использовать при разработке приложения с реагированием. Легче повторно использовать, разделив компоненты на две категории.

* Container Component (stateful component): - Are concerned with how things work. - In general, except for some wrapping divs, they do not have their   own DOM markup and have no style. - Provide data and actions to presentational or other container components. - Are often stateful, as they tend to serve as data sources.
* Presentational Component (stateless component): - Are concerned with how things look. - Usually have some DOM markup and styles of their own. - Receive data and callbacks exclusively via props. - Rarely have their own state (when they do, it's UI state rather than data).

Каковы преимущества использования этих шаблонов?

  • Лучше отделение проблем
  • Лучшая повторное использование
  • Извлечение компонентов макета для предотвращения дублирования

3. Компонент заголовка

Давайте создадим наш первый комментарий реагирования Заголовок Отказ Заголовок Компонент – это просто черный бар с логотипом Tesla и текстом.

Создать SRC/Компоненты/заголовок каталог, создать Header.js Файл в нем и введите следующий код:

import React from 'react';import './Header.css';import logoUrl from '../../assets/logo.svg';
const Header = () => (  
Tesla
)
export default Header;

3.1 Стиль компонентов заголовка

Создать Header.css Файл в SRC/Компоненты/заголовок каталог и введите следующий стиль:

.header {  padding: 25px 0;  text-align: center;  background: #222;}
.header img {  width: 100px;  height: 13px;}

3.2 Компонент импорта заголовка в контейнере приложений

Теперь, когда вы создали Заголовок Компонент, давайте использовать Импорт В точке входа App.js Отказ

import React, { Component } from 'react';import './App.css';import Header from './components/Header/Header';
class App extends Component {  render() {    return (      
); }}
export default App;

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

4. Контейнер Teslabattery

В нашем приложении Теслабатария Компонент несет ответственность за создание и управление данными и состояния как Контейнерный компонент , передавая его другим Презентационные компоненты выполнение функции обратного вызова и изменение его состояния.

Наследование Ract.component , Теслабатария Должен иметь оказывать Метод, необязательно, он может инициализировать его состояние через Конструктор и внедрить другие методы, такие как жизненный цикл обратные вызовы.

обратные вызовы жизненного цикла полезны, когда вы хотите рендер или обновлять компоненты или получать уведомления на разных этапах жизненный цикл Отказ

Создать SRC/контейнеры каталог, создать Teslabattery.js Файл в нем и введите следующий код:

import React from 'react';import './TeslaBattery.css';
class TeslaBattery extends React.Component {  render() {    return (      

Range Per Charge

) }}
export default TeslaBattery;

4.1 Стиль контейнера Teslabattery

Teslabattery.csss Держит только минимальный стиль.

.tesla-battery {  width: 1050px;  margin: 0 auto;}
.tesla-battery h1 {  font-family: 'RobotoNormal';  font-weight: 100;  font-size: 38px;  text-align: center;  letter-spacing: 3px;}

Компоненты, которые будут созданы в будущем, будут настроен в Теслабатария Контейнер последовательно.

5. Компонент Teslanotice

Давайте создадим статическую текстовую часть с помощью Teslanotice составная часть.

Создать SRC/Компоненты/Teslanotice каталог, создать Teslanotice.js Файл в нем и введите следующий код:

import React from 'react';import './TeslaNotice.css';
const TeslaNotice = () => (  

The actual amount of range that you experience will vary based on your particular use conditions. See how particular use conditions may affect your range in our simulation model.

Vehicle range may vary depending on the vehicle configuration, battery age and condition, driving style and operating, environmental and climate conditions.

)
export default TeslaNotice;

5.1 Стиль компонентов Teslanotice

Далее, создайте SRC/Компоненты/Teslanotice каталог, создать Teslanotice.css В нем и добавьте эти стили к вашему Teslanotice.css файл:

.tesla-battery__notice {    margin: 20px 0;    font-size: 15px;    color: #666;    line-height: 20px;}

5.2 Компонент импорта Teslanotice в контейнере Teslabattery

Далее импорт Teslanotice Компонент в Teslabattery.js :

...import TeslaNotice from '../components/TeslaNotice/TeslaNotice';
class TeslaBattery extends React.Component {  render() {    return (      

Range Per Charge

) }}...

6. Компонент Teslacar

Теперь давайте сделаем хорошую игрушечное изображение Tesla с колесной анимацией.

Создать SRC/Компоненты/Teslacar каталог, создать Teslacar.js Файл в нем, и внутри вашего Teslacar.js файл:

import React from 'react';import './TeslaCar.css';
const TeslaCar = (props) => (  
);
TeslaCar.propTypes = {  wheelsize: React.PropTypes.number}
export default TeslaCar;

Здесь мы указываем Пропорты используя реакстрационные встроенные типографии. В режиме разработки React Checks реквизит передается к компоненту. (Только в режиме разработки по причинам эффективности)

Для каждого реквизит атрибут, реагируйте попытки найти его в компоненте проптип Объект, чтобы определить, ожидается ли (1) опора (2) опоры, является правильным типом. В этом случае Teslacar Компонент ожидает реквизит атрибут колеблется и указывает, что это Номер тип. Если предусмотрено неправильное значение, в консоли JavaScript отображается предупреждение, что полезно для устранения потенциальных ошибок на ранней стадии.

https://facebook.github.io/react/blog/2017/04/07/react-v15.5.0.html#migrating-from-react.proptypes

// Before (15.4 and below) import React from 'react';
import React from 'react';import './TeslaCar.css';
.........................
TeslaCar.propTypes = {  wheelsize: React.PropTypes.number}
export default TeslaCar;
// After (15.5) import React from 'react'; import PropTypes from 'prop-types';import './TeslaCar.css';
...........................
TeslaCar.propTypes = {   wheelsize: PropTypes.number} export default TeslaCar;

6.1 Стиль компонента Teslacar

Далее создайте Teslacar.css Файл в SRC/Компоненты/Teslacar каталог и дать ему следующий стиль. Поскольку код длинный и опущен здесь, давайте проверим Исходный код Отказ

.tesla-car {  width: 100%;  min-height: 350px;  background: #fff url(../../assets/tesla.jpg) no-repeat top center;  background-size: contain; }
.tesla-wheels {  height: 247px;  width: 555px;  position: relative;  margin: 0 auto; }
...

Это дает нам наши анимации и компонентную базу для автомобиля, которая отображается в качестве фоновых изображений.

6.2 Импорт Teslacar компонент в контейнере Teslabattery

Далее нам нужно снова добавить этот компонент в наш контейнер. Импорт Teslanotice Компонент в Teslabattery.js :

...import TeslaCar from '../components/TeslaCar/TeslaCar';
class TeslaBattery extends React.Component {  render() {    return (      

Range Per Charge

) }}...

Вот что вы должны видеть:

7. Регистрация и инструменты разработчика реагирования

Ух ты! Это приятно, но что-то не хватает. Колеса не показаны. Давайте посмотрим причину. Согласно исходному коду Teslacar следует передавать реквизит и имя класса изменилось на основе roppsswheelsize Отказ

Другими словами, вам необходимо получить некоторые данные (в этом случае, колебание) от родительского компонента и представляют его правильно, и должен быть метод связи, который может принимать данные.

Реагирование состоит из компонентного дерева, которое состоит из контейнера для доставки данных и состояния, а также компонент для пассивно принимающих данные и состояние из контейнера. Инструмент, который доставляет это состояние в подкомпоненты, является одним объектом, реквизит Отказ

Вы можете легко понять это, проверивая компонентное дерево, используя Инструменты разработчика реагирования в хроме.

реквизит В этом случае является одним объектом JavaScript, в этом случае пустой объект. Это потому, что мы не прошли реквизит В родительском компонентах Теслабатария Отказ

8. Состояние заявления

Нам нужно подумать о том, что Государство требуется управлять в нашем приложении. Если вы посмотрите на окончательное изображение приложения GIF в верхней части этой статьи, значения состояния:

  • Carstats (массив объектов) : Массив объектов батареи численного значения на автомобильной модели в соответствии с выбранным текущим уровнем условия (скорость, температура, климат, колесо)
  • config (объект) : В настоящее время выбранные условия объекта (скорость: 55, температура: 20, климат: арисон на колесе: 19)

Это единственный источник правды для нашего приложения. Теперь мы добавим метод конструктора к Теслабатария Контейнер и установите начальное значение, чтобы мы могли управлять этим состоянием и передавать его в подкомпонент. Teslacar Компонент принимает колеблется вводится через реквизит И делает изображение Tesla Car и вращает колеса.

...class TeslaBattery extends React.Component {  constructor(props) {    super(props);
    this.state = {      carstats: [],      config: {        speed: 55,        temperature: 20,        climate: true,        wheels: 19      }    }  }    render() {    // ES6 Object destructuring Syntax,    // takes out required values and create references to them    const { config } = this.state;    return (      

Range Per Charge

) }}...

В Render () код в форме const {a, это Разрушение объекта ES6 Отказ Это требует необходимого значения из объекта и делает ссылку на него.

Одним словом эта концепция может быть выражена следующей формулой.

Функция, которая принимает данные в качестве ввода и возвращает представление.

Если вы сохраняете файлы, вы можете видеть, что оказанные автомобиль Tesla и анимация колеса хорошо работают на обновленном экране. Вы также можете увидеть, что реквизит проходит хорошо в дереве компонентов.

9. Компонент Teslastats

Теперь мы собираемся построить Тесластаты составная часть. Создать SRC/Компоненты/Teslastats каталог, создать Teslastats.js Файл в нем и введите следующий код:

import React from 'react';import './TeslaStats.css';
const TeslaStats = (props) => {  const listItems = props.carstats.map((stat) => (    
  • {stat.miles}

  • )); return (
      {listItems}
    )};
    TeslaStats.propTypes = {  carstats: React.PropTypes.array}
    export default TeslaStats;

    Тесластаты также Предметующая компонент Это получает состояние, и он принимает список массивов, содержащих значения модели по реквизит и делает их.

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

    Этот код печатает [2, 4, 6, 8, 10] к консоли.

    const numbers = [1, 2, 3, 4, 5];const doubled = numbers.map((number) => number * 2);console.log(doubled);

    Преобразование массива в список в реакции практически идентична. Здесь мы используем JavaScript карта Функция для итерации через ropps.Carstats множество.

    Для каждой итерации он возвращает < Li> Элемент Contesin г Модель и

  • каркас элемента ОУН Дин

    t; Ta г, содержащих мили.

    Наконец, он возвращает listiTems Массив в < ul> элемент.

    9.1 Стиль компонентов Teslastats

    Далее создайте Teslastats.css Файл в SRC/Компоненты/Teslastats каталог и введите следующий стиль. Поскольку код длинный и опущен здесь, давайте проверим исходный код

    ....tesla-stats {  margin: -70px 0 30px; }.tesla-stats ul {  text-align: center; }...

    Задача, которую выполняет этот компонент, является итерацией через ropps.Carstats Массив и свяжите определенный класс к элементу на основе stat.model Отказ Затем вы можете заменить фоновое изображение для отображения модели Tesla.

    9.2 Компонент импорта Teslastats в контейнере Teslabattery

    Затем добавьте следующие действия Импорт использовать Тесластаты Компонент в Teslabattery.js Отказ

    ...import TeslaStats from '../components/TeslaStats/TeslaStats';...render() {  const { config, carstats } = this.state;  return (    

    Range Per Charge

    )}...

    Нам нужно пройти Карстаты Массив на реквизит Так что давайте установим значение, используя Batteryservice Мы уже внедрили.

    9.3 Калькулятестаты и SetState

    Добавить импорт GetModeldata первый.

    После установки компонента через ComponentDidMount () , это называет StatsUpdate () функция. Когда Calculatestats () Функция, которая получает Carmodels и текущее состояние состояния в качестве ввода выполняется, объект с соответствующим Модель и мили Значения возвращаются, а возвращаемое значение передается через setState () И тогда объект штата обновляется.

    ...import { getModelData } from '../services/BatteryService';...
    calculateStats = (models, value) => {  const dataModels = getModelData();  return models.map(model => {    // ES6 Object destructuring Syntax,    // takes out required values and create references to them    const { speed, temperature, climate, wheels } = value;    const miles = dataModels[model][wheels][climate ? 'on' : 'off'].speed[speed][temperature];    return {      model,      miles    };  });}  statsUpdate() {  const carModels = ['60', '60D', '75', '75D', '90D', 'P100D'];  // Fetch model info from BatteryService and calculate then update state  this.setState({    carstats: this.calculateStats(carModels, this.state.config)  })  }  componentDidMount() {  this.statsUpdate(); }...

    Одно предостережение – это явное привязку в Теслабатария Функция конструктора необходима для доступа к это в классе.

    ...this.calculateStats = this.calculateStats.bind(this);this.statsUpdate = this.statsUpdate.bind(this);...

    9.4 Добавить дополнительный стиль

    Дополнительный стиль требуется для хорошего макета здесь.

    Сначала откройте SRC/index.css Файл и удалите все существующие код и добавьте следующее:

    @font-face {  font-family: 'RobotoNormal';  src: url('./assets/fonts/Roboto-Regular-webfont.eot');  src: url('./assets/fonts/Roboto-Regular-webfont.eot?#iefix') format('embedded-opentype'),       url('./assets/fonts/Roboto-Regular-webfont.woff') format('woff'),       url('./assets/fonts/Roboto-Regular-webfont.ttf') format('truetype'),       url('./assets/fonts/Roboto-Regular-webfont.svg#RobotoRegular') format('svg');  font-weight: normal;  font-style: normal;}
    *, *:before, *:after {  box-sizing: border-box;  margin: 0;  padding: 0;  font: 300 14px/1.4 'Helvetica Neue', Helvetica, Arial, sans-serif;  -webkit-font-smoothing: antialiased;}
    .cf:before,.cf:after {    content: '';    display: table;}.cf:after {    clear: both;}.cf {  *zoom: 1;}

    Далее откройте src/app.csss Файл и удалите все существующие код и добавьте следующее:

    .wrapper {  margin: 100px 0 150px;}

    Экран результата работы до сих пор выглядит следующим образом.

    10. Многоразовый компонент Teslacounter

    Скорость тесла и внешние контрольные температуры должны быть многоразовыми компонентами, поэтому я сделаю их универсальным счетным компонентом, который позволяет другим метаданным, таким как шаг, минимальный, максимальный, а также заголовок и агрегаты (MPH/степени).

    Кроме того, в отличие от компонентов, которые мы создали до сих пор, нам нужна действие для изменения значения состояния в ответ на пользовательский ввод (кнопка щелчка, выбора флажков и т. Д.). Давайте посмотрим, как обрабатывать события, которые происходят в подкомпоненте.

    Создать SRC/Компоненты/Teslacounter каталог как раньше создать Teslacounter.js Файл в нем и введите следующий код:

    import React from 'react';import './TeslaCounter.css';
    const TeslaCounter = (props) => (  

    {props.initValues.title}

    { props.currentValue } { props.initValues.unit }

    );
    TeslaCounter.propTypes = {  currentValue: React.PropTypes.number,  increment: React.PropTypes.func,  decrement: React.PropTypes.func,  initValues: React.PropTypes.object}
    export default TeslaCounter;

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

    Так как компонент должен только обновить свое собственное состояние, Теслабатария проходит обратный вызов ( увеличение , Уменьшение ) к Teslacounter Каждый раз, когда ему необходимо обновить его состояние. Вы можете использовать OnClick событие на кнопке, чтобы уведомить событие. Обратный вызов, пройденный Теслабатария звонки setState () И приложение обновляется.

    Мы осуществим обратный вызов, который будет передан Теслабатария Через несколько мгновений.

    10.1 Стиль компонентов Teslacounter

    Давайте сначала реализовать стиль. Создать Teslacounter.css Файл в SRC/Компоненты/Teslacounter каталог и укажите следующие стили. Поскольку код длинный и опущен здесь, давайте проверим исходный код

    .tesla-counter {  float: left;  width: 230px; }.tesla-counter__title {  letter-spacing: 2px;  font-size: 16px; }...

    10.2 Компонент импорта Teslacounter в контейнере Teslabattery

    Теперь мы реализуем Обратный вызов в Теслабатария и пропустите его к Teslacounter составная часть.

    Сначала добавьте Импорт использовать Teslacounter Компонент в Teslabattery.js Отказ

    Мы также реализуем функции обратного вызова увеличение () и уменьшение () и внутренняя функция UpdateCounterState () и связывать это в Конструктор Отказ Затем пройдите Обратный вызов Функция для Teslacounter компонент с реквизит Отказ

    ...constructor(props) {    super(props);
        this.calculateStats = this.calculateStats.bind(this);    this.statsUpdate = this.statsUpdate.bind(this);    this.increment = this.increment.bind(this);    this.decrement = this.decrement.bind(this);    this.updateCounterState = this.updateCounterState.bind(this);
        this.state = {      carstats: [],      config: {        speed: 55,        temperature: 20,        climate: true,        wheels: 19      }    }  }...updateCounterState(title, newValue) {    const config = { ...this.state.config };    // update config state with new value    title === 'Speed' ? config['speed'] = newValue : config['temperature'] = newValue;    // update our state    this.setState({ config });  }
      increment(e, title) {    e.preventDefault();    let currentValue, maxValue, step;    const { speed, temperature } = this.props.counterDefaultVal;    if (title === 'Speed') {      currentValue = this.state.config.speed;      maxValue = speed.max;      step = speed.step;    } else {      currentValue = this.state.config.temperature;      maxValue = temperature.max;      step = temperature.step;    }
        if (currentValue < maxValue) {      const newValue = currentValue + step;      this.updateCounterState(title, newValue);    }  }
      decrement(e, title) {    e.preventDefault();    let currentValue, minValue, step;    const { speed, temperature } = this.props.counterDefaultVal;    if (title === 'Speed') {      currentValue = this.state.config.speed;      minValue = speed.min;      step = speed.step;    } else {      currentValue = this.state.config.temperature;      minValue = temperature.min;      step = temperature.step;    }
        if (currentValue > minValue) {      const newValue = currentValue - step;      this.updateCounterState(title, newValue);    }  }  ...render() {		return (      

    Range Per Charge

    )}

    10.3 Стиль контейнера Teslabattery

    Дополнительный стиль требуется для Теслабатария Как только Teslacounter Компонент добавлен. Открыть Teslabattery.csss Файл и добавьте следующее:

    .tesla-climate-container {  float: left;  width: 420px;  padding: 0 40px;  margin: 0 40px 0 0;  border-left: 1px solid #ccc;  border-right: 1px solid #ccc;}.tesla-controls {  display: block;  width: 100%;}

    10.4 Реквизирует значение по умолчанию

    Здесь initvalues передан на Teslacounter является постоянным значением и передается от Приложение который является родительским компонентом Теслабатария Отказ

    Открыть App.js и пройти CounterdefaultVal объект к Теслабатария Компонент следующим образом:

    import React, { Component } from 'react';import './App.css';import Header from './components/Header/Header';import TeslaBattery from './containers/TeslaBattery';
    const counterDefaultVal = {  speed: {    title: "Speed",    unit: "mph",    step: 5,    min: 45,    max: 70  },  temperature: {    title: "Outside Temperature",    unit: "°",    step: 10,    min: -10,    max: 40  }};
    class App extends Component {  render() {    return (      
    ); }}
    export default App;

    Теперь, когда вы нажимаете скорость и температуру, вы можете увидеть, что измененные значения обновляются и повторно отображаются в состоянии состояния через Инструмент разработчика реагирования Отказ

    10.5 Виртуальный домо

    Какое одностраничное приложение может дать нам бесшовное пользователю и плавное взаимодействие.

    В нашем приложении ценности модели автомобиля обновляются без необходимости перезагружать всю страницу каждый раз, когда пользователь меняет скорость или температуру. Даже если вам нужно подключиться к серверу, чтобы получить данные. Чтобы предоставить этот пользовательский опыт, вам нужно знать, какую часть Дом Вам необходимо обновить, когда происходят изменения или взаимодействия.

    Каждый JavaScript Framework использует другую стратегию: Эмбер использует Связывание данных , Angular1 использует Грязная проверка и Реагировать использует Виртуальный Дом Отказ

    В реакции впервые называется метод рендеринга компонента, он печатает Виртуальный Дом модель, а не фактическая Дом сам элемент. Виртуальный Дом Является ли структура данных JavaScript, которая представляет внешний вид Дом Отказ Реагирование, затем принимает эту модель и создает фактический Дом элемент.

    Затем всякий раз, когда изменяется состояние компонента (например, SetState называется), метод рендеринга компонента называется и новый Виртуальный Дом создается, и это новое Виртуальный Дом сравнивается с предыдущим Виртуальный Дом Отказ Результатом этого сравнения – показать фактическое Дом изменения и Дом будет «исправлено» с изменениями, и экран изменится.

    11. Контроль воздуха и отопления

    Мы контролируем температуру и изменим Отопление к Aircon Когда это более 20 градусов, а Отопление Когда это ниже 20 градусов.

    Сначала создайте каталог SRC/Компоненты/Teslaclimate Создать Teslaclimate.js Файл в нем и введите следующий код:

    import React from 'react';import './TeslaClimate.css';
    const TeslaClimate = (props) => (  
    );
    TeslaClimate.propTypes = {  value: React.PropTypes.bool,  limit: React.PropTypes.bool,  handleChangeClimate: React.PropTypes.func}
    export default TeslaClimate;

    Этот компонент меняет класс стиля в соответствии с ropps.value передается и меняет текст в соответствии с ropps.limit Отказ

    Теслабатария проходит обратный вызов ( handlechangeClimate в этом случае) в Teslaclimate , который выполняется всякий раз, когда государство необходимо обновить. Onchange Событие может быть использовано для уведомления события. Обратный вызов пропущено Теслабатария называется с setState () обновить его состояние и перенаправить.

    11.1 Стиль теслаклимата

    Создать Teslaclimate.css Файл в SRC/Компоненты/Teslaclimate каталог и укажите следующие стили. Поскольку код длинный и опущен здесь, давайте проверим Исходный код Отказ

    .tesla-climate {	  float: left;   }  .tesla-climate__item {    cursor: pointer;    display: block;    width: 100px;    height: 100px;    border: 6px solid #f7f7f7;    border-radius: 50%;    box-shadow: 0px 1px 3px rgba(0, 0, 0, 0.3);    color: #666;    background: #fff;   }  ...

    11.2 Импорт Teslaclimate компонент в контейнере Teslabattery

    Теперь мы будем реализовывать Обратный вызов в Теслабатария и пропустите его к Teslaclimate составная часть.

    Сначала добавьте Импорт использовать Teslaclimate Компонент в Teslabattery.js Отказ Мы реализуем функцию обратного вызова HandleChangeClimate () и связывать это в Конструктор () Отказ Затем пропустите функцию обратного вызова к Teslaclimate Компонент как реквизит Отказ

    ...import TeslaClimate from '../components/TeslaClimate/TeslaClimate';...constructor(props) {  super(props);  ...  this.handleChangeClimate = this.handleChangeClimate.bind(this);  ...}// handle aircon & heating click event handlerhandleChangeClimate() {  const config = {...this.state.config};  config['climate'] = !this.state.config.climate;  this.setState({ config });}
    ... 10}  handleChangeClimate={this.handleChangeClimate}/>  ...

    Теперь значение состояния изменяется в зависимости от изменения температуры, и когда измененное значение передается на Teslaclimate Компонент, класс и текст стиля изменяются в соответствии со значением.

    12. Компонент Teslawheels

    Наконец, давайте сделаем окончательный компонент Teslawheels Отказ Как всегда, создайте каталог SRC/Компоненты/Teslawheels Создать Teslawheels Файл в нем и введите следующий код.

    import React from 'react';import './TeslaWheels.css';
    const LabelLists = (props) => {  const value = props.wheels.value;  const changeHandler = props.wheels.handleChangeWheels;  const sizes = [19, 21];  const LabelItems = sizes.map(size => (         )  );  return (    
    {LabelItems}
    );}const TeslaWheels = (props) => (

    Wheels

    );TeslaWheels.propTypes = { value: React.PropTypes.number, handleChangeWheels: React.PropTypes.func}export default TeslaWheels;

    Наша реализация здесь похожа на конвертацию реквизит объект массива в список в Тесластаты составная часть. Повторить ropps.sizes Массив, используя карта JavaScript () функция.

    Для каждой итерации он возвращает Эль> Элементы CORTA Инне g размер. Наконец лабика Список Litems построен int o Tesla Колеса компонента и оказанные.

    В Элемент EL>, эффект анимации колес показан путем изменения класса в соответствии с передаваемым размером колеса.

    12.1 Стиль компонентов Teslawheels

    Создать Teslawheels.css Файл в SRC/Компоненты/Teslawheels каталог и укажите следующие стили. Поскольку код длинный и опущен здесь, давайте проверим Исходный код Отказ

    .tesla-wheels__component {  float: left;  width: 355px;}.tesla-wheels__title {  letter-spacing: 2px;  font-size: 16px;}...

    12.2 Импорт компонента Teslawheels в контейнере Teslabattery

    Наконец, реализуйте Обратный вызов в Теслабатария и пропустите его к Teslawheels составная часть.

    Добавить Импорт использовать Teslawheels Компонент в Teslabattery.js Отказ Затем мы реализуем функцию обратного вызова handlechangewels () и связывать это в Конструктор Отказ Затем пропустите функцию обратного вызова к Teslawheels Компонент как реквизит Отказ

    ...import TeslaWheels from '../components/TeslaWheels';...constructor(props) {    super(props);    this.calculateStats = this.calculateStats.bind(this);    this.increment = this.increment.bind(this);    this.decrement = this.decrement.bind(this);    this.handleChangeClimate = this.handleChangeClimate.bind(this);    this.handleChangeWheels = this.handleChangeWheels.bind(this);    this.statsUpdate = this.statsUpdate.bind(this);...handleChangeWheels(size) {  const config = {...this.state.config};  config['wheels'] = size;  this.setState({ config });}......

    Результатом завершения колес анимации заключается в следующем.

    13. Государственное обновление

    Мы наконец сделали? Даже если пользователь меняет несколько значений условия, значение разности модели автомобиля не изменяется должным образом.

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

    this.setState({ config });

    Теперь давайте изменим Карстаты Состояние всякий раз, когда значение состояния конфигурации изменяется.

    statsUpdate() {  const carModels = ['60', '60D', '75', '75D', '90D', 'P100D'];  // Fetch model info from BatteryService and calculate then update state  this.setState({  carstats: this.calculateStats(carModels, this.state.config)  })}

    Теперь мы создаем функцию, которая принимает Carmodels и текущее состояние состояния в качестве входных данных и отражает измененное Карстаты в состоянии приложения и передайте его на this.setState как обратный вызов.

    Делая это, можно обновить config . объект первым в setState () , который управляет асинхронным методом, а также для того, чтобы изменить Статистика на экране на основе этого.

    this.setState({ config }, () => {this.statsUpdate()});

    Это завершает все головоломки. Полный код для Teslabattery:

    import React from 'react';import './TeslaBattery.css';import TeslaNotice from '../components/TeslaNotice/TeslaNotice';import TeslaCar from '../components/TeslaCar/TeslaCar';import TeslaStats from '../components/TeslaStats/TeslaStats';import TeslaCounter from '../components/TeslaCounter/TeslaCounter';import TeslaClimate from '../components/TeslaClimate/TeslaClimate';import TeslaWheels from '../components/TeslaWheels/TeslaWheels';import { getModelData } from '../services/BatteryService';
    class TeslaBattery extends React.Component {  constructor(props) {    super(props);
        this.calculateStats = this.calculateStats.bind(this);    this.statsUpdate = this.statsUpdate.bind(this);    this.increment = this.increment.bind(this);    this.decrement = this.decrement.bind(this);    this.updateCounterState = this.updateCounterState.bind(this);    this.handleChangeClimate = this.handleChangeClimate.bind(this);    this.handleChangeWheels = this.handleChangeWheels.bind(this);
        this.state = {      carstats: [],      config: {        speed: 55,        temperature: 20,        climate: true,        wheels: 19      }    }  }
      calculateStats = (models, value) => {    const dataModels = getModelData();    return models.map(model => {      const { speed, temperature, climate, wheels } = value;      const miles = dataModels[model][wheels][climate ? 'on' : 'off'].speed[speed][temperature];      return {        model,        miles      };    });  }
      statsUpdate() {    const carModels = ['60', '60D', '75', '75D', '90D', 'P100D'];    // Fetch model info from BatteryService and calculate then update state    this.setState({      carstats: this.calculateStats(carModels, this.state.config)    })  }
      componentDidMount() {    this.statsUpdate();  }
      updateCounterState(title, newValue) {    const config = { ...this.state.config };    // update config state with new value    title === 'Speed' ? config['speed'] = newValue : config['temperature'] = newValue;    // update our state    this.setState({ config }, () => {this.statsUpdate()});  }
      increment(e, title) {    e.preventDefault();    let currentValue, maxValue, step;    const { speed, temperature } = this.props.counterDefaultVal;    if (title === 'Speed') {      currentValue = this.state.config.speed;      maxValue = speed.max;      step = speed.step;    } else {      currentValue = this.state.config.temperature;      maxValue = temperature.max;      step = temperature.step;    }
        if (currentValue < maxValue) {      const newValue = currentValue + step;      this.updateCounterState(title, newValue);    }  }
      decrement(e, title) {    e.preventDefault();    let currentValue, minValue, step;    const { speed, temperature } = this.props.counterDefaultVal;    if (title === 'Speed') {      currentValue = this.state.config.speed;      minValue = speed.min;      step = speed.step;    } else {      currentValue = this.state.config.temperature;      minValue = temperature.min;      step = temperature.step;    }
        if (currentValue > minValue) {      const newValue = currentValue - step;      this.updateCounterState(title, newValue);    }  }
      // handle aircon & heating click event handler  handleChangeClimate() {    const config = {...this.state.config};    config['climate'] = !this.state.config.climate;    this.setState({ config }, () => {this.statsUpdate()});  }
      // handle Wheels click event handler  handleChangeWheels(size) {    const config = {...this.state.config};    config['wheels'] = size;    this.setState({ config }, () => {this.statsUpdate()});  }  
      render() {        const { config, carstats } = this.state;    return (      

    Range Per Charge

    10} handleChangeClimate={this.handleChangeClimate} />
    ) }}
    export default TeslaBattery;

    14. Сборка

    Пришло время построить наше приложение.

    npm run build

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

    Теперь наша сборка готова к развернутым.

    15. Развертывание

    С такими инструментами, как Воспитание Мы можем действительно легко развернуть нашестроенное приложение.

    Воспитание Простое, однокомальное веб-публикация. Он публикует HTML, CSS и JS бесплатно, не выходя из командной строки.

    Сначала установите инструмент с помощью NPM и запустить Воспитание команда в построить каталог.

    $ npm install -global surge$ cd build$ surge

    Если это ваш первый рабочий день, вам нужно будет ввести свой адрес электронной почты и пароль, чтобы зарегистрировать новую учетную запись.

    Развертывание завершено в мгновение.

    Давайте подключимся к нашему развернутому проекту.

    Заключение

    В этом посту мы узнали о некоторых точках создания компонентов RACT и составляя их для создания предельной приложения, посредством восстановления Калькулятор температуры батареи Tesla Отказ Если вы следите до сих пор до сих пор, потом поздравляем при получении reac app ent up и запустить.

    В следующем взносе мы рассмотрим, как улучшить наше государственное управление с Redux библиотека. Тем временем, если у вас есть какие-либо комментарии, предложения или исправления, пожалуйста, не стесняйтесь публиковать их в разделе комментариев.

    Спасибо за ваш отзыв заранее.