Автор оригинала: 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 = () => ()
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 () }}
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 () }}...
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 () }}...
Вот что вы должны видеть:
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 () }}...
В 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}
- {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 ()}...
Нам нужно пройти Карстаты
Массив на реквизит
Так что давайте установим значение, используя 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 ()}
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) => ();TeslaWheels.propTypes = { value: React.PropTypes.number, handleChangeWheels: React.PropTypes.func}export default TeslaWheels;Wheels
Наша реализация здесь похожа на конвертацию реквизит
объект массива в список в Тесластаты
составная часть. Повторить ropps.sizes
Массив, используя карта JavaScript ()
функция.
Для каждой итерации он возвращает Инне
g размер. Наконец лабика
Список Litems построен int o Tesla
Колеса компонента и оказанные.
В
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 () }}
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
библиотека. Тем временем, если у вас есть какие-либо комментарии, предложения или исправления, пожалуйста, не стесняйтесь публиковать их в разделе комментариев.
Спасибо за ваш отзыв заранее.