Эммануэль Юсуфу
Этот пример и дизайн долится то, что я узнал из книги Полный реагировать Отказ Я настоятельно рекомендую это как хороший ресурс для изучения реагирования и его экосистемных технологий. Проверьте это здесь: fullstackreact.com Отказ
Представьте, что как разработчик, вы были поручено создать MVP для продукта запуска, который необходимо продемонстрировать для потенциальных инвесторов.
Приложение представляет собой заявление для голосования, вдохновленного продуктом Hunt и Reddit. В приложении продукты отображаются в коллекции. Пользователи могут расширить лучшие продукты, и приложение будет автоматически сортировать их в соответствии с количеством голосов, размещающих самые высокие до самой низкой.
Особенности приложения мы будем строить, очень просты:
- Пользователи могут просматривать существующие/отображаемые продукты.
- Пользователи могут разделить продукты, которые их порадуют.
- Продукты сортируются автоматически в соответствии с количеством голосов.
Вы можете Посмотреть демонстрацию здесь Отказ
Шаг 1: первые вещи в первую очередь
Кулак всех, отправляйтесь на Github и загрузите папку стартера, которую я уже создал с необходимой настроек для нашего приложения здесь Отказ Скопируйте URL Предоставляется зеленым клоном/кнопкой загрузки и запустите в своем предпочтительном пути в вашей командной строке. У вас должен быть уже установлен Git.
git clone URL
Как только папка загружается, откройте его в своем редакторе кода и соблюдайте файлы папок и структуру. Это похоже на это:
├───src | ├───app.js | ├───seed.js | ├───style.css └───vendor ├───bootstrap-3.3.7-dist ├───font-awesome-4.7.0 ├───react.js ├───react-dom.js └───babel-standalone.js
Примечание: Ваш редактор кода должен иметь живой сервер. Это позволяет нам служить файлам в вашем браузере для просмотра нашей работы. Обязательно установите расширение для вашего предпочтительного редактора кода.
Под папкой SRC есть app.js. и Seed.js файлы. Файл app.js – это то, где мы напишем большую часть кода для нашего приложения. Файл SEED.JS уже содержит сбор данных продуктов для отображения.
Наш файл SEED.JS содержит следующий код
window.Seed = (function () { function generateVoteCount() { return Math.floor((Math.random() * 50) + 15); } const products = [ { id: 1, title: 'Yellow Pail', description: 'On-demand sand castle construction expertise.', url: '#', votes: generateVoteCount(), submitterAvatarUrl: 'images/avatars/daniel.jpg', productImageUrl: 'images/products/image-aqua.png', }, ... ]; return { products: products }; }());
Этот код создает функцию GenerateVoteCount ()
Что мы объясним позже и Продукты
Массив, который содержит данные наших продуктов. Они обернуты как самозазывной функцией и прилагаются к окно
объект нашего браузера. Таким образом, мы можем получить доступ к ним где угодно, которые мы хотим их.
Семя
Функция в конечном итоге возвращает объект с свойством продуктов и значением Продукты
Отказ Это означает, что если мы выполним Семена. Продукты
У нас должен быть каждый объект продукта возвращен нам.
React.js Файл – это код, содержащий сам ядро реагирования. Также React-Dom.js Является ли код, который помогает нам рендеры реагирования, которые мы создали в HTML DOM. Наконец, babel-standalone.js Является ли кодом Babel, который транкирует код Advanced JSX и ES6, мы будем работать с кодом ES5 (наиболее распространенной спецификацией JavaScript, что сегодня самые старые и текущие браузеры поддерживают сегодня).
Шаг 2: Создание компонентов
Нам нужно создать два компонента реагирования. Мы назовем родительский компонент ProductList
и коллекция детских компонентов ИТ-хаус будет Продукт
Отказ
Внутри файла App.js создайте родительский компонент, делая это:
class ProductList extends React.Component { render() { const products = Seed.products.map((product) => ()); return ( ); } } ReactDOM.render(Popular products
{products}, document.getElementById('content'));
В родительском компоненте мы намерены создать дочерний компонент на основе каждого объекта, доступного из Семена. Продукты
. Итак, мы настроили некоторые реквизиты. Теперь давайте на самом деле объявляем дочерний компонент еще в том же файле под названием Продукт
:
class Product extends React.Component { render() { return (); } }
Мы можем ссылаться на Реагировать. Компонент
и Reactom.runder
Поскольку мы уже загрузили файлы rance.js и ract-dom.js. Они доступны для использования, даже если в настоящее время мы в файле App.js. Создав компонент, Reactom.runder (WhatComponent, где)
делает это до DOM.
Запуск вашего живого сервера, у вас должен быть следующий экран:
Шаг 3: Добавить интерактивность
Пока что мы смогли кодировать компоненты нашего приложения – но они все еще статичны. Как мы можем сделать их интерактивными?
В кодировании React Apps следуйте этим общим процессу:
- Разделите UI приложение на компоненты
- Построить статическую версию приложения
- Определите, какие данные являются государством
- Определите в каких компонентах каждая часть государства должна жить
- Жесткий код начальных состояний
- Добавить обратный поток данных от ребенка до родителя через реквизиты
- Добавить сервер связи
Мы не будем делать все вышеперечисленное, но давайте пойдем с Государство Отказ Единственная часть данных в нашем приложении, которое можно считать государственным или постоянно меняющимся, является количество голосов. Помните: это свойство в коллекции продуктов в нашем файле Sete.js. Голоса в каждом Продукт
Объект, так это представляет наше состояние.
Зная нашего государства, где мы инициализируем это? Государства в реагировании самостоятельно содержатся в определенных компонентах, в отличие от реквизита, которые передаются вниз. Количество голосов как государство принадлежит <Продукт/>
, но поскольку сбор продуктов, которые у нас есть сформированы из
Мы инициализируем состояние там. В
сделать это до Визуализация ()
Метод:
constructor() { super(); this.state = { products: [] } }
При инициализации состояния в компоненте мы пытаемся определить, как он должен выглядеть, когда удерживайте его пустым. Наша продукция – это массив, поэтому мы используем пустой массив. Мы инициализируем его внутри Конструктор () {}
Потому что это кусок кода, который запускается при создании нашего компонента.
Давайте сделаем наш компонент читать Продукты
от его собственного состояния вместо из файла. Добавлять:
componentDidMount() { this.setState({ products: Seed.products }) }
установить состояние в использовании. Также обновить const.products
к const.state.products
Отказ Чтобы сделать JavaScript сортировать его в соответствии с наибольшим количеством голосов, напишите это вместо этого:
const products = this.state.products.sort((a, b) { b.votes - a.votes });
JavaScript Сортировать();
использует Сравнить функцию внутри. Вы можете узнать об этом в документации.
Шаг 4: Ручка вверх
Давайте отправимся к гиперссылке, окружающей шрифт-потрясающий, значок CARET-UP и создать функцию, используя OnClick.
После того, как мы определили функцию, давайте на самом деле создадим его. Внутри компонента продукта создайте Passtheid ();
Функция:
constructor() { super(); this.passTheId = this.passTheId.bind(this); } passTheId() { console.log('Id will be passed'); }
Мы связали функцию для Это
Ключевое слово, потому что только встроенные функции, такие как Render (), имеют доступ к использованию этого слова.
Давайте создадим другую функцию в компоненте ProductList. Этот обновит состояние, работающее с Handupvote
Функция компонента продукта.
handleProductUpVote = (productId) => { const nextProducts = this.state.products.map((product) => { if (product.id === productId) { return Object.assign({}, product, { votes: product.votes + 1, }); } else { return product; } }); this.setState({ products: nextProducts, }); }
Государства в реакции должны рассматриваться как неизменные. То есть они не должны быть изменены напрямую. Вышеуказанная функция сделает это, используя JavaScript Объект.assign ();
Создавая, казалось бы, новый массив под названием NextProducts
Отказ Это похоже на существующее состояние, но имеет изменение количества голосов. NextProducts
затем устанавливается как новое состояние. Кажется, странно делать такие вещи таким образом, но это то, что команда Ract React рекомендует повысить производительность.
Мы хотим пройти идентификатор продукта от ребенка Продукт
Компонент для родителя ProductList
Компонент, так что давайте сделаем РучкаProductupvote
Доступно для ребенка в качестве реквизита:
const productComponents = products.map((product) => ());
Мы добавили onvote = {thish.handleproductupvote}
Отказ Так что на дочернем уровне мы можем получить доступ к этому через это
passTheId() { console.log('Id will be passed'); this.props.onVote(this.props.id) }
Ваш весь app.js
Файл должен выглядеть так:
class ProductList extends React.Component { state = { products: [], }; componentDidMount() { this.setState({ products: Seed.products }); } handleProductUpVote = (productId) => { const nextProducts = this.state.products.map((product) => { if (product.id === productId) { return Object.assign({}, product, { votes: product.votes + 1, }); } else { return product; } }); this.setState({ products: nextProducts, }); } render() { const products = this.state.products.sort((a, b) => ( b.votes - a.votes )); const productComponents = products.map((product) => ()); return ( ); } } class Product extends React.Component { constructor() { super(); this.passTheId = this.passTheId.bind(this); } passTheId() { console.log('Id will be passed'); this.props.onVote(this.props.id); } render() { return (Popular products
{productComponents}); } } ReactDOM.render(, document.getElementById('content'));
Обновите свой браузер, и вы должны увидеть рабочее приложение. Просмотр демо .
Не стесняйтесь делиться, комментировать или задавать вопросы. Для окончательного кода посетите этот Github Link и клон к вашему компьютеру.
Если вам понравилось эту статью, дайте мне несколько хлопьев, чтобы все больше людей видят это. Спасибо за чтение.
Вы можете прочитать больше моего письма в моем блоге: Звездный код Отказ
Оригинал: “https://www.freecodecamp.org/news/how-to-build-a-basic-version-of-product-hunt-using-react-f87d016fedae/”