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

Создание полного мобильного приложения с помощью Tymdscript, Ionic, React и Mobx – Bogrocket Blog

Ionic теперь предлагает интеграцию на реагирование. Возьмите его для спина, создавая полное приложение для отслеживания настроения наряду с Tymdscript и Mobx.

Автор оригинала: Foysal.

В этом посте я выберу тебя через создание приложения Tracker Tracker с помощью Tymdscript, Ionic, React и Mobx. Затем мы сделаем его публично доступным, развертывая приложение в NetLify.

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

Я считаю, что удивительно, как ионная команда, после четырех лет, все еще сохраняет возможности импульса и судов и инструменты для расширения возможностей своей пользовательской базы. Интеграция React – это одна из таких признаков, в которой я полагаю, собирается превратить много головок в сообществе DEV к Ionic и его экосистеме.

Ионическое было исторически угловым/напечатанным на уровне, и в то время как его ядро все еще развивается с угловой, команда недавно провела много времени и ресурсов для интеграции фреймворков, таких как React и Vue, чтобы снизить барьер для ввода для разработчиков всех вкусов.

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

Если вы знакомы с моим стилем блога, вы знаете, что я твердый верующий в «Учитесь по строительству». Мне нравится брать руки грязными, совершать ошибки и понять вещи самостоятельно вместо того, чтобы запоминать документацию перед использованием нового инструмента. Если это звучит как хороший подход к вам, то пожалуйста, прочитайте.

Для недвижимости

Никто не уходит время для чтения примерно 7000 слов в блоге блога, не зная, что они попадают. Итак, для нетерпеливых (таких как я):

  • Вот репо Github который содержит все приложение
  • Вот сам приложение Для вас принять его для быстрого вращения. Я рекомендую использовать мобильное устройство для доступа к нему, так как он оптимизирован только для мобильного просмотра. Тем не менее, он также должен работать на вашем настольном браузере
  • Вот быстрый взгляд на конечный продукт:
Завершено предварительный просмотр приложения

Это кому?

Для того, чтобы следовать этому посту, я бы ожидал, что вы:

  • Бегите систему на базе * NIX (Linux или MacOS) – извините, люди Windows (я знаю, это почти 2020, я должен сойти с моей высокой лошади, верно?)
  • Иметь базовое понимание NPM, Teadercript и React
  • Иметь некоторое знакомство с терминалом и веб-разработкой в целом
  • У вас есть среда разработки, настроенную хотя бы студию Android и Xcode
  • Поймите, что все вышеперечисленные правила – это некоторая авторитарная пропаганда, чтобы остановить вас от достижения высшего роста в вашей карьере, и я не твоя мама, поэтому я не могу сказать вам, что вы можете и не можете сделать – так это полностью зависит от вас, если вы хотите настроить парус на это эпическое путешествие или нет

Леса

Первое, что вам нужно, это ионный пакет NPM, установленный на вашем компьютере. Бег NPM установить -G [защищена электронная почта] На вашем терминале это отсортировано для вас. Сейчас CD В каталог, где вы хотите создать свою папку Ionic App и запустить Ionic Начните Moodular Blank Отказ

Нажмите здесь, чтобы увидеть полную демонстрацию сетевых запросов

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

Вывод init.

Давайте сделаем то, что Ionic сказал нам сделать:

cd ./moodular
ionic serve

Это должно автоматически открывать http://localhost: 8100/Главная в вашем браузере. Если это не откройте новую вкладку и перейдите к этой странице в браузере, чтобы увидеть его в действии. Красиво, верно …? Неа! Вы правы, это неловко. Давайте сделаем это лучше – давайте будем кодировать!

Вкладки и страницы

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

Леса на предыдущей странице уже дали нам страницу в SRC/страницы/home.tsx файл. Давайте создадим еще один файл в папке, Touch SRC/Pages/History.tsx И вставьте следующий код в этом новом файле:

import { IonContent, IonPage } from '@ionic/react';
import React from 'react';

const History: React.FC = () => {
    return (
        
            
                

History page

); }; export default History;

Здесь мы создаем функциональный компонент RACT с именем История и экспортировать его. Компонент оказывает Ionpage компонент с Ioncontent внутри него. Эти компоненты представляют собой компоненты на строительстве макета Ionic предоставляют из коробки. Я только что скопировал и вставил из автогенерации Home.tsx файл и разделить часть ненужной разметки.

Теперь, когда у нас есть оба страницы, давайте покажем полосу вкладки вкладчика и включить навигацию между страницами. Мы хотим, чтобы наша полоса TAB была доступна на каждой странице, поэтому она имеет смысл для этого быть в общем месте. Мы поставим это в SRC/app.tsx файл. Откройте этот файл и замените Приложение внутреннее составляющее со следующим:


        
            
                
                    
                    
                     }
                    />
                

                
                    
                        
                        Today
                    

                    
                        
                        History
                    
                
            
        
    

Мы используем несколько новых ионных компонентов здесь, которые не были там раньше, поэтому мы должны убедиться, что они импортируют должным образом. Прокрутите обратно в верхнюю часть файла и найдите строку, которая выглядит как Импорт {...} из '@ Ionic/React' и заменить это с этим:

import { IonApp, IonRouterOutlet, IonTabs, IonTabBar, IonTabButton, IonIcon, IonLabel } from '@ionic/react';

На протяжении всего этого поста в разных местах мы будем использовать ионные компоненты, а иногда я могу забыть явно напомнить вам, чтобы импортировать его из @ Ionic/React ' Отказ Пожалуйста, дайте мне знать, если вы найдете такие случаи, и я исправлю это.

Теперь давайте сломаем код и посмотрим, что мы делаем.

Компонент Ionroouteroutlet


    
    
     }
    />

Этот компонент позволяет вам определить ваши маршруты/страницы для вашего приложения. Его дети должны быть <Маршрут> Компоненты с путь и а Компонент опоры хотя бы. путь Опора рассказывает IONIC, как будет выглядеть URL-йорк, когда маршрут поражен, и Компонент Определяет, какой компонент будет отображаться, когда ударил этот URL/маршрут.

В нашем коде мы определили два маршрута для двух наших страниц: Главная и История Отказ Обратите внимание, что мы не импортировали наших недавно созданных История Компонент пока, так что давайте снова вернемся к верху и импортируйте его сразу после нашего Главная Импортировать:

import Home from './pages/Home';
import History from './pages/History';

Третий <Маршрут> Вот ловца по умолчанию. Если пользователь не указывает маршрут, требуется их в /сегодня по умолчанию с помощью , который, в свою очередь, оказывает нашу Главная составная часть.

Вы можете прочитать о маршрутизации в Ionic здесь Отказ

Примечание: Это в основном использует React-Router-DOM Пакет и не имеет ничего общего с самой ионной, так что если вы знакомы с экосистемой React Ecosystem, это должно выглядеть знакомым для вас.

Компонент ионобар


    
        
        Today
    

    
        
        History
    

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

Каждая из кнопок указывает href опоры, которые в значительной степени работает как кнопка ссылки. Итак, когда вы нажимаете на них, браузер приведет вас к назначенному URL. Здесь href Значения должны соответствовать путь Значения опоры, которые мы определены для наших <Маршрут> составные части.

Значки отображаются с использованием Ionicon Компонент, где Значок Пропор указывает, какой значок показать. Нам нужно импортировать эти значки из Ionicons упаковка. Добавьте следующий импорт вблизи верхней части файла:

import { calendar as calendarIcon, happy as happyIcon } from 'ionicons/icons';

Узнайте больше о Ionicons и ION-TAB-BAR Отказ

Компонент Iontabs

Наконец, мы охватываем все это в Ионтабс Компонент, который должен быть внутри IONREACTROUTER Компонент для навигации работать должным образом.

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

Предварительный просмотр навигации приложения

Это было не слишком сложно, верно? С помощью нескольких изложенных инструментов нам удалось установить беспроблемную навигацию между двумя страницами, которые хорошо играют с URL-адресами браузера.

Лучшее изобретение 21-го века: Emojis!

Хорошо, может быть, это немного изменитости, но вы не можете отрицать, насколько переплетены нашу повседневную жизнь с эмографией в эти дни. Всегда есть эмодзи практически все, что вы хотите сказать. Так что для этого приложения мы будем использовать Emojis, чтобы представлять наши настроения. Мы будем использовать emoji-mart Как сборщик вместо встроенной нативной/клавиатуры Emojis.

Сначала, конечно, установите пакет: NPM установить --save emoji-mart Отказ И поскольку мы собираемся использовать его через Tymdercript, нам нужно будет запустить NPM i --save-dev @ Типы/emoji-mart Чтобы установить типы для этого пакета.

Далее нам нужно включить его таблицу стилей. Давайте добавим это в SRC/app.tsx Файл, где включены другие файлы CSS:

/* Third-party styles */
import "emoji-mart/css/emoji-mart.css";

Теперь давайте откроем SRC/страницы/home.tsx Файл и избавиться от автогенерационного контента, чтобы поставить наш сборник эмоджи в нем:

// ... other imports
import { Picker } from "emoji-mart";

// ... component definition

    
        

Moodular

В Сборщик Компонент, мы проезжаем включить Убедитесь, что в пилере появляется только «люди» эмодзи. У пакета есть ряд других наборов Emoji, которые вы можете включить/исключить в соответствии с вашими потребностями.

На данный момент, на домашней странице, вы должны увидеть сборщик Emoji, как ниже:

Предварительный просмотр пикера Emoji

Данные и состояние

Руководитель, все будет немного больше грязно. Леса и макеты, как правило, более легкая сторона приложения по сравнению с данными и управлением состоянием – особенно при использовании IONIC, поскольку вы получаете все эти встроенные компоненты, чтобы ваше приложение выглядеть хорошо.

Но Ionic позволяет вам выбрать свой собственный инструмент для управления данными. Я не хочу, чтобы этот пост был вашим вступлением к науке данных или больших данных, поэтому я буду держать его минимальным. Все наши данные будут храниться в локальном магазине браузера, а для реактивного управления состоянием мы будем использовать MobX Отказ Прежде чем мы попадем в тех, хотя давайте подумаем по поведению, которое мы хотим реализовать.

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

С вышеуказанными соображениями мы можем сделать вывод, что каждое настроение может быть объект с emoji , а Детали и а Дата имущество. Чтобы дать каждую запись уникальный идентификатор, давайте добавим ID Имущество на объект настроения.

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

Давайте создадим Moodservice.ts Файл в SRC/страницы/ папка. Я знаю, что это не идеальное место для сервисного файла, но у нас нет много модулей для этого приложения, поэтому давайте оставим его там сейчас. Добавьте следующий код в нем:

import { EmojiData } from "emoji-mart";
import { persist } from "mobx-persist";
import { observable, computed, action } from "mobx";

export interface Mood {
    emoji: EmojiData,
    details: string,
    date: Date,
    id: number,
};

export class MoodStore {
    @persist('list')
    @observable
    list: Mood[] = [];

    @computed get entries(): Mood[] {
        const sortFunc = (firstItem: Mood, secondItem: Mood): number => {
            if (firstItem.id > secondItem.id)
                return 1;

            if (firstItem.id < secondItem.id)
                return -1;

            return 0;
        };

        return this.list.slice().sort(sortFunc);
    };

    @action
    save(emoji: EmojiData, details: string, date: Date) {
        this.list.push({emoji, details, date, id: Date.now()});
    };

    @action
    remove(moodId: number) {
        const moodIndex = this.list.findIndex(({ id }) => moodId === id);
        this.list.splice(moodIndex, 1);
    };
};

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

Прежде чем мы сделаем это, пожалуйста, перейдите к Сайт mobx И прочитайте его резюме, концепции и принципы, чтобы получить базовое понимание того, почему этот пакет существует и почему он используется. О, и не забудьте установить два новых пакета, которые мы импортируем в этом файле: NPM Установка --save mobx mobx-persist Отказ

Первое, что вы заметите, это Настроение интерфейс. Как спланировано выше, у нас есть необходимые свойства, определенные в этом интерфейсе, и он будет использоваться в качестве единого объекта настроения, зарегистрированного пользователем. Примечательно вот это Emojidata тип. Каждый эмодзи в emoji-mart Пакет представлен как Emojidata Вот почему данные Emoji в этом интерфейсе имеют тип данных.

Наблюдается

export class MoodStore {
    @persist('list')
    @observable
    list: Mood[] = [];

Здесь мы создаем Moodstore Класс, который будет нашим основным государственным контейнером для приложения. У него есть один наблюдаемый Собственность, Список который является массивом Настроение Записи.

Используя @obsibable Декоратор, мы говорим Mobx отслеживать изменения, внесенные в это свойство. Используя @Persist («Список») Декоратор, мы говорим MobX-Spersist Пакет для сохранения этого массива в локальном магазине браузера и Список Параметр говорит о персисте, что это свойство является массивом.

Декораторы еще не поддерживаются по универсально, поэтому вам может потребоваться рассказать ThereScript Compiler Ionic, чтобы узнать его в вашем коде. Добавить «ЭКСПЕРИМЕНТАЛЬНЫМДЕНТАЛЬНЫЕМЕНТЫ»: правда к Компиляторы Недвижимость в tsconfig.json файл в корне проекта.

Действия

@action
    save(emoji: EmojiData, details: string, date: Date) {
        this.list.push({emoji, details, date, id: Date.now()});
    };

    @action
    remove(moodId: number) {
        const moodIndex = this.list.findIndex(({ id }) => moodId === id);
        this.list.splice(moodIndex, 1);
    };

Moodstore Также имеет пару действий, которые по существу являются операциями в данных магазина. Довольно очевидно из их имен, Сохранить Действие добавляет новое настроение в список и Удалить Действие удаляет настроение из списка.

Мы просто используем методы манипуляции массива JavaScript для выполнения этих действий в этом случае, но в конце концов, вы подключите его к серверу API или локальной базой данных для постоянства.

Список Собственность, быть @obsibable , будет реактивный, и MOBX автоматически обновит наши компоненты реагирования, когда что-то добавляется/удалено/обновлено до свойства, когда мы связываем магазин и компонент.

При звонке Сохранить мы должны передать это emoji , Детали и Дата Затем этот метод заполнит ID Свойство автоматически использует Date.now () , который возвращает метку Unix. Не супер уникальный в Гранд-схеме вещей, но поскольку все наши данные местные прямо сейчас, это сделает.

Для Удалить , нам нужно только пройти в ID ввода настроения, и это выберет его из Список Массив, используя Сращивание () метод.

Вычисленные свойства

@computed get entries(): Mood[] {
        const sortFunc = (firstItem: Mood, secondItem: Mood): number => {
            if (firstItem.id > secondItem.id)
                return 1;

            if (firstItem.id < secondItem.id)
                return -1;

            return 0;
        };

        return this.list.slice().sort(sortFunc);
    };

В MobX мы используем наблюдаемые, чтобы сохранить данные в необработанном состоянии. Для целей отображения нам может потребоваться доступ и выводить разные представления данных различными способами, где @computed Свойства приходят. Они позволяют определять свойства, которые возвращают производную/вычиснутую версию из необработанных данных магазина.

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

Обратите внимание, что мы делаем ломтик () на Список массив, потому что JavaScript Сортировать это мутируют и напрямую мутируют @obsibable Массив может вызвать всевозможные проблемы.

Это в значительной степени ядра всей системы управления данными/государством нашего приложения. Красивая краска, верно? Я надеюсь, что объяснение выше, помогло вам понять это, но не волнуйтесь, если это не так. Мы медленно начнем интегрировать эту услугу в нашу Главная и История Компоненты, а затем станут более очевидными, почему все так, как они находятся в этом файле.

Подключение магазина MOBX с компонентами

Прямо сейчас наше Moodservice Существует в вакууме в том смысле, что ни один из наших страниц/компонентов не использует магазин. Давайте исправить это. Нам нужен новый пакет, MobX-React , для этого. Установите его с помощью NPM I --save mobx-rect Затем откройте SRC/app.tsx Файл и оберните Ionicreactrouter Компонент, как это:

//... other imports 
import { Provider } from "mobx-react";
import { create } from "mobx-persist";

//... other imports
import { MoodStore } from "./pages/MoodService";

//... other imports
const App: React.FC = () => {
    const hydrate = create({});
    const moodStore = new MoodStore();

    hydrate("moodStore", moodStore);

    return (
        
            
                
                //....tabs and other components
                
            
        
    );
};

Сначала мы создаем нашу Moodstore класс. Тогда мы увлажняем Moodstore Экземпляр, чтобы убедиться, что на первой нагрузке MobX-Spersist Нагружает ранее сохраненное состояние магазина от LocalStorage.

Он выглядит немного осложненным всем функциональным программированием Mumbo-Jumbo и терминами, такими как «увлажняющие», но на простом английском языке: если мы закрываем наше приложение и открываем его или закрываем вкладку браузера и открываем его, все наши ранее сохраненные настроения все равно быть там в Moodstore пример. Провайдер Компонент делает наши Moodstore Экземпляр, доступный как опоры для внутренних компонентов.

Это только соединяет наши страницы с помощью магазина MOBX, но мы не используем магазин на наших страницах … пока.

Все еще со мной? Я надеюсь, что это так. Мы так много сделали, и вы заслуживаете перерыва. Иди гулять, выпей стакан жидкости по вашему выбору, а затем вернись, чтобы продолжить с остальной частью поста.

… Назад? Хорошо, давайте закончим его.

Сохранение настроения с MOBX

Теперь мы можем играть больше с магией государственного управления Reaction и Mobx. Начнем с SRC/страницы/home.tsx файл. Когда пользователи нажимают на emoji, мы покажем всплывающее окно, где можно указать дополнительные детали и дату для записи настроения. Мы будем использовать Эрористический Компонент за это:



     setShowInputs(false)}
        header={`Add Details`}
        inputs={[
            {
                type: "text",
                name: "details",
                placeholder: "Write out how you are feeling..."
            },
            {
                name: "date",
                type: "date",
                max: `{new Date()}`,
                min: "2017-09-09",
                value: new Date(),
                placeholder: "Change date"
            }
        ]}
        buttons={[
            {
                text: "Cancel",
                role: "cancel",
                cssClass: "secondary",
                handler: () => {
                    setShowInputs(false);
                    setEmoji(null);
                }
            },
            {
                text: "Ok",
                handler: data => {
                    moodStore.save(emoji, data.details, data.date)
                }
            }
        ]}
    />

Прежде чем мы сломаем этот код, давайте импортируем Эрористический от @ Ionic/Rect В верхней части нашего файла: Импорт {Ioncontent, Ionpage, ionert} '@ Ionic/Rection';

Первое изменение в нашем существующем коде – это новый onselect опоры в Компонент, и он принимает функцию, как это значение. Мы даем это функцию handeremojiselect , который мы еще не определены.

Прежде чем определить это, давайте посмотрим на Эрористический составная часть. Его isopen Определяет, должен ли поле оповещения на дисплее. Мы хотим показать бдительную коробку, когда emoji постучал, верно? Итак, естественно, ценность isopen должна быть государственная переменная, которая переключается между правда и ложь на основе взаимодействия пользователя.

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

Мы будем использовать Уместите Реагируйте крюк, чтобы определить эту переменную, и мы определим нашу handeremojiselect Функция для изменения этих переменных состояний соответственно. Добавьте следующий код прямо выше оператора возврата в компоненте страницы:

const [showInputs, setShowInputs] = useState(false);
    const [emoji, setEmoji] = useState(null);

    const handleEmojiSelect = (selection: EmojiData) => {
        setEmoji(selection);
        setShowInputs(true);
    };

    return (
        

Уместите Необходимо импортировать из реакции, поэтому добавьте, что в строку импорта реагирования: Импорт реагировать, {stestate} от «Реагистрация»; Отказ Как объяснено выше, ценность isopen это Showinputs Государственная переменная, которая изначально устанавливается на ложь Так что оповещение не будет отображаться на первой нагрузке.

Чтобы содержать выбранные Emoji, мы создаем другую вариабельную переменную состояния с именем, emoji Отказ Тогда, конечно, мы определяем нашу handeremojiselect Функция принимать один параметр – выбранный эмодзи – а затем функция хранит эмодзи в состоянии и переключает Showinputs Государство в правда Отказ На данный момент коробка оповещения должна появиться.

Обратите внимание, что мы определяем тип Выбор быть Emojidata , но мы еще не импортировали. Убедитесь, что вы добавите это в оператор импорта из emoji-mart :

import { Picker, EmojiData } from "emoji-mart";

Теперь давайте посмотрим на содержание нашей коробки оповещения. Мы даем это Заголовок и а Subheader Чтобы показать какой-то текст инструкции для пользователя. ondiddismiss Компонент – это функция, которая называется, когда пользователь закрывает поле оповещения. Мы просто переключаемся Showinputs Переменная состояния Вернуться к ложь в этой функции.

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

У нас есть два кнопки действия для подтверждения и сохранения ввода настроения или отмены и отказаться от записи. Естественно, когда отмен нажал, мы просто переключаемся Showinputs Вернуться к ложь так что коробка оповещения исчезнет, а затем опустошить выделение эмози, установив emoji Переменная состояния в null Отказ

Кнопка «Подтвердить», однако, вызывает функцию со всеми значениями поля ввода, заключенных в данные Объект, где объектные свойства соответствуют Имя Мы дали каждому из входы Отказ После наших определений у нас будет data.details и data.date Отказ В рамках функции мы используем Сохранить Метод действий Мы определили в нашем магазине настроения и передайте emoji от государственной переменной и других параметров от данные Переменная.

Тем не менее, вы заметите, что в рамках Главная Компонент, у нас нет доступа к Moodstore экземпляр, верно? Хороший улов. Помните все настройки, которые мы сделали в нашем SRC/app.tsx файл с Провайдер и гидрат и хранить экземпляры? Вот где они вступают в игру.

Во-первых, нам нужно Импорт {inject, Observer} из «MOBX-RECT»; в верхней части нашего файла, а затем заменить Экспорт Default Home В нижней части файла с Экспорт ввод по умолчанию («Moodstore») (Observer (Home)); Отказ

Это выглядит запутанным, я знаю, но вы можете рассмотреть его код BoverTack, который вы просто скопируете и вставьте. На простом английском, это означает: сделать Главная Компонент Наблюдатель магазина MOBX и специально дает ему доступ к магазину с именем Moodstore Отказ

Mobx знает, где получить Moodstore из-за того, потому что в нашем Компонент, мы передали его приподнятым по имени Moodstore С ценностью, являющимся экземпляром нашего Moodstore MobX Store. С этим на месте у нас теперь есть доступ к Moodstore в пределах нашего компонента в качестве опоры.

Поскольку мы используем TypectScript, мы должны сообщить транспорте, что Главная Компонент может на самом деле получить опоры с именем Moodstore предоставлено этому. Мы делаем это, заменяя Const House: Rect.FC = () => { со следующим:

import { MoodStore } from "./MoodService";

type HomeProps = {
    moodStore: MoodStore,
};

const Home: React.FC = ({ moodStore }) => {

Это для домашней страницы. Теперь вы должны быть в состоянии войти в систему ввода настроения, как это:

Сохранение входа настроения

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

Помните, что мы использовали библиотеку под названием MobX-Spersist ? Эта библиотека возьмет наш вклад – в частности, все @obsibable Свойства (I.E., Список Свойство) нашего Moodstore – И сохранить его в локальном магазине браузера. Скриншот ниже должен помочь вам выяснить, как посмотреть на это, и, конечно же, вы видите ввод настроения там:

Проверка ввода настроения

Показывая историю настроения

Вы и я, будучи самым умными программистами мира, можно легко посмотреть под капотом бегущей машины, которая является нашим приложением и потребляет необработанные данные JSON, как если бы мы читали романский роман, но нам нужно больше разума нашим пользователям , верно? Итак, давайте заполним нашу страницу истории, чтобы показать явно зарегистрированные настроения, как мы планировали с самого начала.

На этот раз наш урок о печатах и комментариях React Components и Provider и Provider Mobx мы начнем, убедившись, что наша страница страницы истории все будет настроен для получения Moodstore составная часть:

import { inject, observer } from "mobx-react";
import { MoodStore } from "./MoodService";

type HistoryProps = {
    moodStore: MoodStore;
};

const History: React.FC = ({ moodStore }) => {
    //... component code
};
export default inject("moodStore")(observer(History));

Теперь, когда у нас есть доступ к нашему магазину MOBX, мы можем просто использовать вычисленные Записи Свойство для доступа к настроениям. Мы будем использовать Ионлист Компонент Чтобы показать настроения:

//... other imports

import { Emoji } from "emoji-mart";
import { trash as trashIcon } from "ionicons/icons";

//... previous code

            
                
                    {moodStore.entries.map(mood => (
                        
                            
                                
                                    
                                
                                
                                    

{printDate(mood.date)}

{mood.details || "No Details"}

{" "} setRemovingMoodId(mood.id)} >
))}

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

Ионитем Компонент – это то, что мы увидим для каждого настроения, и IoniteMoptions Компонент – это то, что мы увидим, когда мы проверим предметы слева, потому что мы устанавливаем сторона = "конец" пропры

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

Ионитем Компонент отображает аватар слева, который просто показывает эмодзи и детали текста, с датой настроения справа от аватара. Если в записи нет подробностей, мы просто покажем Нет подробностей Текст так, чтобы элемент не выглядит пустым. Чтобы отобразить дату, мы используем функцию помощника, PrintDate по двум причинам:

  1. Даты тяжелые! JavaScript имеет Дата Примитивный, но когда он должен быть сохранен в хранилище, который не поддерживает его, он превращается в строку. В нашем случае, когда Mobx сохраняет дату в локальной табличке браузера, он преобразует его в строку. Таким образом, когда мы получаем доступ к дате ввода настроения из хранения, он в строковом формате, но когда пользователь вводит его, это Дата пример.
  2. Даты используются в различных форматах по всему миру, и показать его пользователям в собственном языке, мы будем использовать Толокаледаледатель () Способ встроен в объект даты в JavaScript.

Определить эту сложность, мы определяем PrintDate За пределами компонента, как показано ниже:

const printDate = (date: Date | string): string => {
    if (typeof date === "string") {
        date = new Date(date);
    }

    return date.toLocaleDateString();
};

Это принимает значение даты в либо строка или Дата формат. Если это строка, она создает Дата Экземпляр из этого из этого он возвращает локализованную версию даты в качестве вывода функции.

Другое место для определения PrintDate будет в пределах экземпляра входа настроения через Typeycts. Я оставлю это как домашнее задание для вас, читатель, чтобы выяснить.

Удаление настроения из истории

Мы уже настроили способ удалить настроение из истории в нашем магазине MOBX, и мы дали каждое нажатие клавиши, чтобы показать кнопку удаления. Все, что нам нужно сделать, это зацепить эти два с хорошим UX. Я указываю Хорошо UX, потому что пользовательские данные являются драгоценными, и удаляя его без подтверждения, всегда является плохим ux.

Мы постараемся избежать этого. Как обычно, давайте посыпьтесь волшебной волшебностью реагирования с помощью фея пыли ионной компонентами в нашем коде. Добавьте следующую переменную состояния в верхней части История Определение компонента и добавить Эрористический Компонент внутри страницы:

const [removingMoodId, setRemovingMoodId] = useState(0);

    return (
        
             0}
                onDidDismiss={() => setRemovingMoodId(0)}
                header={"Remove Mood?"}
                message={`Sure you want to remove mood?`}
                buttons={[
                    {
                        text: "Cancel",
                        role: "cancel",
                        cssClass: "secondary",
                        handler: () => setRemovingMoodId(0)
                    },
                    {
                        text: "Yes, Remove It",
                        handler: () => {
                            moodStore.remove(removingMoodId);
                            setRemovingMoodId(0);
                        }
                    }
                ]}
            />

Мы уже устанавливаем идентификатор настроения для удаления в RemovingMoodid Переменная состояния при подключении кнопки удаления. Эрористический Компонент показан только тогда, когда RemovingMoodid Имеет номер в нем и содержит некоторое содержание, которое просит пользователя, если они уверены, что настроение должно быть удалено.

У него есть две кнопки: один для подтверждения и один для отмены. Отмена просто устанавливает RemovingMoodid к 0 , что скрывает поле оповещения. Нажатие Подтверждение запускает две вызовы функций: тот, который удаляет ввод настроения от Moodstore используя наши ранее созданные Удалить Метод действий, а другой сбрасывает RemovingMoodid Переменная состояния в 0 чтобы скрыть бдительную коробку.

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

Удалить действие настроения

Эпический! Не так ли?

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

Действие обратной связи

Вы когда-нибудь подключались к кнопке в приложении и задавались вопросом, что произошло, потому что это ничего не сделало, но у вас есть что подозрительное чувство, что он сделал и решил не сказать вам, что? …Нет? ОК, может быть, я просто немного параноик, но мне нравится, когда приложения говорят мне, когда это делает вещи – действие обратной связи, если вы будете. В нашем случае давайте добавим обратную связь, когда пользователь регистрирует запись настроения.

Давайте вернемся к SRC/страницы/home.tsx Файл и добавьте следующий код сразу после Сборщик составная часть:

//...previously written code

    const [showMoodLoggedToast, setShowMoodLoggedToast] = useState(false);
    const [showInputs, setShowInputs] = useState(false);

    //...previously written code

                

                 setShowMoodLoggedToast(false)}
                />

    //...previously written code

                        {
                            text: "Ok",
                            handler: data => {
                                moodStore.save(emoji, data.details, data.date);
                                setShowMoodLoggedToast(true);
                            }
                        }

Мы добавили Ионтоэст Компонент, который появляется, когда showmoodloggedtoast Переменная состояния верна, а затем через две секунды (2000 мс), она исчезает. Тогда все, что нам нужно сделать, это убедиться, что тост появится, когда новое настроение зарегистрировано, позвонив setshowmoodloggettoast (true); После сохранения входа настроения.

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

Настроение Сохранить тост

Намного лучше, верно? Смотрите, Ionic имеет эти очень удобные компоненты прямо из коробки, которые просто облегчают реализацию отличного UX.

Тост, по умолчанию, отображается в нижней части экрана, но именно здесь наши вкладки, и пока тост на дисплее, мы больше не сможем перемещаться между страницами. Это именно противоположность хорошего UX, не так ли?

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

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

Пустое состояние

Я пошел на Undraw , что является абсолютной золотой шахтой для не дизайнеров, таких как я для поиска удивительных иллюстраций для моих веб-сайтов и мобильных приложений. Я искал фитинговую иллюстрацию, которая представляет собой пустое состояние и личное настроение одновременно и загрузить файл SVG для него. Я положил файл в Публичные/активы/ папка с именем пустое состояние .svg Отказ

Прежде чем покажем изображение на странице истории, давайте добавим @computed Недвижимость в нашем магазине, чтобы легко определить, есть ли у нас запись в магазине. Открыть SRC/страницы/Moodservice.ts Файл и добавьте следующий код в Moodservice класс:

@computed get hasNoHistory(): boolean {
        return this.list.length < 1;
    };

Тогда в SRC/Pages/History.tsx Файл, мы добавляем тройное, если заявление, которое показывает иллюстрацию, используя Ionimg Компонент, если Hasnohistory это правда Отказ В противном случае он показывает список настроений. Ionimg Убедитесь, что изображение красиво масштабируется для размера экрана устройства пользователя:


                {moodStore.hasNoHistory ? (
                    
                ) : (
                    
                    //...previously written code
                    
                )}

Теперь вернитесь на страницу истории в вашем браузере и удалите все записи настроения, чтобы получить великолепный вид на иллюстрацию:

Пустое превью истории настроения

Это в значительной степени обертывает наш код приложения. У нас есть твердая особенность, которая работает без проблем и обеспечивает отличный пользовательский опыт. Тем не менее, это все еще веб-приложение, для всех, которые мы знаем. Одной из наиболее привлекательных особенностей IONIC является то, что она позволяет создавать веб-приложение Web и Mobile из одной кодовой базы. Давайте превратимся в мобильное приложение.

Конденсатор

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

Мы будем использовать конденсатор, чтобы повернуть наше веб-приложение в приложения Android и iOS. Прежде чем прочитать, пожалуйста, убедитесь, что у вас есть среда разработки настроен для Android и iOS в соответствии с Эта документация Отказ Затем, от вашего терминала в корне вашего проекта, запустите следующие команды:

ionic integrations enable capacitor
npx cap add android
ionic build
npx cap copy
npx cap open android

Вот и все. Это все, что вам нужно запустить приложение в виде мобильного приложения. Заменить Android с IOS В приведенных выше командах для создания для iOS. После выполнения последней команды в указанном выше списке IONIC откроет Xcode или Android-студию для вас с соответствующей папкой приложения.

Оттуда вы можете запустить ваше приложение в симуляторе или в подключенном устройстве, так же, как и для любого нативного приложения. Есть много подробных сообщений в блоге, где вы можете узнать о том, как перейти отсюда, чтобы выпустить приложение на App Store или Google Play, поэтому я не буду слишком подробно описан в этом посте.

Идти жить в Интернете

Возможность создать свое собственное приложение, чувствует себя волшебным, но окончательное удовлетворение возникает от возможности показать мир то, что вы построили – в противном случае это просто какой-то код, который сидит в вашем жестком диске, собирая пыль.

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

Мы будем использовать NetLify Развернуть наше приложение, которое является одним из моих абсолютных любимых услуг там. Это позволяет вам предоставить любое клиентское приложение в Интернете онлайн с HTTPS бесплатно и даже подключаться к вашему доменому имени бесплатно. Я могу честно продолжать идти, но я бы хотел, чтобы вы узнали. Итак, если вы еще этого не сделали, пожалуйста, продолжайте и Создайте учетную запись в NetLify Отказ

Отказ от ответственности: Я никоим образом не связан с ними или оплачиваемым NetLify. Я являюсь пользователем их свободного уровня, и я люблю их инструменты, что является единственной причиной, по которой я решил продемонстрировать, как развернуть на своей платформе. Есть много других платформ, которые предоставляют аналогичные услуги, и вы можете использовать любой из них.

Как только вы сделали это, мы сделаем быстрый объем и поставьте наш код на GitHub, потому что, во-первых, вы всегда должны поддерживать свой код, и я лично предпочитаю использовать GitHub для этого; И, во-вторых, потому что NetLify позволяет развертывать новые обновления в ваше приложение каждый раз, когда вы нажимаете новые коммиты в GitHub. Мы воспользуемся этим в немного.

Если вы не знакомы с Git/Github, есть много ресурсов, которые могут начать работу.

Я создал новый репозиторий на GitHub с именем Moodular-Ionic, и я добавлю свой репо Github в качестве отдаленного до моего местного Git Repo: Git Remote Add Orgine [Email Protected]: Foysalit/Moodular-Ionic.git Отказ Теперь мы можем синхронизировать наш код с GitHub, запустив Git Push -U Origin Master Отказ

Теперь давайте вернемся к NetLify. После входа в систему вы должны увидеть кнопку на домашней странице, которая говорит Новый сайт из Git Отказ Нажмите на это или вручную перейдите к этому URL: https://app.netlify.com/start Отказ

NetLify Home

Это должно ответить на страницу, которая выглядит как изображение ниже:

Подключение NetLify к Github

Нажмите на Github Кнопка на этой странице и аутентифицируйте с GitHub, чтобы дать NetLify доступ к вашим репозиториям GitHub. Он должен поднять список, содержащий все ваши репозитории из GitHub.

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

NetLify Deploy Config.

Подтвердите все выглядит хорошо и ударит Развертывание сайта Отказ Затем он отвечает на страницу, которая выглядит как изображение ниже, и сообщите вам, что NetLify приносит ваш код из GitHub и развертывает его на своих серверах. Держись…

Услоивающее состояние NetLify

Как только приложение будет запущено, желтый текст, который говорит Развертывание сайта в прогрессе уйдет, и ссылка появится. Нажмите на эту ссылку, и вуаля! Есть наше красивое приложение, загруженное на браузере, доступное кому-либо.

Обратите внимание, что URL-адрес является путаницей и не имеет ничего общего с нашим приложением. Это потому, что NetLify AutoGenate эти ссылки для вас. Хорошо, что вы можете изменить его на свое собственное доменное имя или, по крайней мере, вы можете указать конкретное имя поддомена под NetLify.com. Давайте сделаем это реально быстро.

Нажмите на Настройки сайта Кнопка, и с страницы настроек нажмите на Изменить имя сайта кнопка. В рамках всплывающего окна измените автогенерацию на что-то, что вам нравится, что-то значимое для нашего приложения. Следуйте от GIF ниже, чтобы увидеть, как я это сделал.

Изменение имени сайта в NetLify

К сожалению, поскольку я уже принял имя Moodular, вы не можете иметь это – но я уверен, что вы можете придумать имя более креативным, чем это.

Закрытие замечаний

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

Вот несколько идей, которые могут принять это приложение к следующему уровню:

  • Добавьте более постоянный и исполнительный слой хранения, такие как SQLite вместо использования LocalStorage
  • Добавьте пагинацию на странице истории, чтобы страница не должна загрузить каждую запись на нагрузку, которая может стать проблемой производительности со временем
  • Добавьте строку поиска на странице истории, чтобы пользователи могли найти записи настроения с нечетким текстом/Emoji Search
  • Добавьте графическую диаграмму, чтобы показать историю настроения карты более визуальным образом в течение определенного периода времени, которые пользователи могут определить

Если вы завершите любые или все вышеперечисленные задачи, Дай мне крик в Twitter И я был бы более чем в восторге сделать быстрый обзор вашего кода.