1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/isrc_ohos-ultimate-harmony-reference

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
OpenHarmony JS Demo开发讲解.md 23 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
Отправлено 15.03.2025 14:42 ec86a40

Содержание ниже взято из книги «Практическое применение разработки приложений для операционной системы HarmonyOS», которую можно приобрести здесь: платформа JD, платформа Dangdang.

Для полной версии проекта скачайте сюда: ISRC_OHOS/OpenHarmony-JS-Demos

Структура проекта

Откройте entry → src → main → js, структура рабочего каталога проекта показана на следующей картинке.

В частности,

  • папка i18n: используется для хранения конфигураций различных языковых сценариев, таких как текстовых строк приложения, путей к изображениям и других ресурсов. Файл en-US.json определяет значения переменных страниц в английском режиме, а файл zh-CN.json — в китайском режиме.
  • папка pages: используется для хранения нескольких страниц, каждая из которых состоит из файлов html, css и js.
    • файл index.html: определяет макет страницы index, компоненты, используемые на этой странице, а также их иерархическую структуру.
    • файл index.css: определяет стили страницы index.
    • файл index.js: определяет бизнес-логику страницы index, такие как привязку данных и обработку событий.
  • файл app.js: управляет глобальной логикой и жизненным циклом приложения.
  • папка resources: используется для хранения файлов ресурсов разработки, таких как изображения, аудио и видео.
  • файл config.json: файл конфигурации приложения. Используется для объявления информации Ability приложения и необходимых ему прав доступа.## JS FA

Этот FA можно разделить на три части: область изображений, область заголовков и область описаний. В соответствии с этим разделением, дочерние узлы корневого узла должны располагаться по столбцам. Область изображений и область описаний реализуются соответственно с помощью компонента swiper и компонента text. Область заголовков состоит из двух частей, расположенных по строкам. Первая часть состоит из двух компонентов text, представляющих название товара и слоган товара, расположенных по столбцам. Вторая часть состоит из компонента image и компонента text, представляющих звездочки для функции закладок и количество закладок, расположенные по строкам, как показано на следующем рисунке.

Сначала создайте базовое расположение FA. В этом случае реализация области с изображением обычно выполняется с помощью компонента image. Поскольку требуется возможность прокрутки изображений влево и вправо, внешний слой image покрывается контейнером прокрутки swiper, который предоставляет возможность переключаться между дочерними компонентами.Зона заголовка и описание используются наиболее распространенными базовыми компонентами текста, где компонент текста используется для отображения текста, а содержание текста должно быть указано внутри зоны содержимого метки. Чтобы собрать основные элементы страницы вместе, необходимо использовать контейнерные компоненты, такие как вышеупомянутый контейнер Swiper. На странице часто используются три типа контейнерных компонентов: div, список и вкладки. При относительно простой структуре страницы можно просто использовать div в качестве контейнера, поскольку div является чистым контейнером для размещения и удобен в использовании, поддерживая множество типов дочерних компонентов.В файле index.html реализуется базовая структура, конкретный код представлен ниже:

<div class="container">
    <swiper class="swiper-style">
        <img src="/common/Phone_00.jpg" class="image-mode"></img>
        <img src="/common/Phone_01.jpg" class="image-mode"></img>
        <img src="/common/Phone_02.jpg" class="image-mode"></img>
        <img src="/common/Phone_03.jpg" class="image-mode"></img>
    </swiper>
    <div class="title-section">
        <div class="phone-title">
            <span class="phone-name">HUAWEI</span>
            <span class="phone-definition">Thinking Possibilities</span>
        </div>
        <div class="favorite-image">
            <img src="{{unFavoriteImage}}" class="image-size" onclick="favorite"></img>
        </div>
        <div class="favorite-count">
            <span>{{number}}</span>
        </div>
    </div>
    <div class="description-first-paragraph">
        <span class="description">{{descriptionFirstParagraph}}</span>
    </div>
    <div class="description-second-paragraph">
        <span class="description">{{descriptionSecondParagraph}}</span>
    </div>
</div>

В файле index.html каждому компоненту и контейнеру определены стили через class="***". Для каждого стиля необходимо последовательно строить его в CSS-файле. Например, в данном примере, стиль необходимо построить в файле styles.css. В CSS-файле определяются основные стили:css .container { flex-direction: column; } .swiper-style { height: 700px; indicator-color: #4682b4; indicator-selected-color: #ffffff; indicator-size: 20px; } .title-section { flex-direction: row; height: 150px; } .phone-title { align-items: flex-start; flex-direction: column; padding-left: 60px; padding-right: 160px; padding-top: 50px; } .phone-name { font-size: 50px; color: #000000; } .phone-definition { font-size: 30px; color: #7A787D; } .favorite-image { padding-left: 70px; padding-top: 50px; } .favorite-count { padding-top: 60px; padding-left: 10px; } .image-size { object-fit: contain; height: 60px; width: 60px; } .description-first-paragraph { padding-left: 60px; padding-top: 50px; padding-right: 60px; } .description-second-paragraph { padding-left: 60px; padding-top: 30px; padding-right: 60px; } .description { color: #7A787D; } .image-mode { object-fit: contain; } Файл index.js используется для создания логики страницы, присваивания значений изображениям и реализации функционала добавления в закладки через взаимодействие с кнопками. Кнопка добавления в закладки связана с событием click, которое реализовано как функция внутри файла index.js. Эта функция может менять состояние isFavorite, что позволяет обновлять компоненты изображения и текста.

Код в index.js выглядит следующим образом:

export default {
    data: {
        unFavoriteImage: "/common/unfavorite.png",
        isFavorite: false,
        number: 20,
        descriptionFirstParagraph: "Перелом границ визуального восприятия, исследование фотографии и видеографии, освобождение мощности и скорости, а также инновация взаимодействия теперь готовы к открытию. Принимайте будущее со всеми новыми возможностями.",
        descriptionSecondParagraph: "Освещая бесконечные возможности. Четвертая камера HUAWEI окружена световым кольцом. Это идеальное сочетание отражения и преломления."
    },
    methods: {
        toggleFavorite() {
            this.isFavorite = !this.isFavorite;
        }
    }
};

Часто используемые компоненты

В зависимости от функциональности можно разделить компоненты на следующие четыре основные категории:| Тип компонента | Основные компоненты | | :------------- | :------------------ | | Базовые компоненты | text, image, progress, rating, span, marquee, image-animator, divider, search, menu, chart | | Контейнерные компоненты | div, list, list-item, stack, swiper, tabs, tab-bar, tab-content, popup, list-item-group, refresh, dialog | | Медиа-компоненты | video | | Компоненты холста | canvas |### Базовый компонент — Button Кнопка является наиболее часто используемым компонентом для взаимодействия с пользователем и может использоваться для вызова функций JavaScript. Можно использовать различные типы кнопок, предоставляемых JavaScript (включая капсульные, круглые, текстовые, дуговые и загрузочные кнопки), чтобы реализовать множество интересных функций.

<!-- index.html определяет несколько видов кнопок -->
<div class="div-button">
    <button class="button" type="capsule" value="Капсульная кнопка"></button>
    <button class="button circle" type="circle" icon="common/logo.png"></button>
    <button class="button text" type="text">Текстовая кнопка</button>
    <button class="button download" type="download" id="download-btn"
            onClick="setProgress">{{downloadText}}</button>
    <button class="button" type="capsule" waiting="true">Загрузка... </button>
    <button class="button" type="arc">Дуговая кнопка</button>
</div>

Вышеуказанная загрузочная кнопка связана с функцией setProgress в файле JavaScript, который выглядит следующим образом:

export default {
    data: {
        progress: 5,
        downloadText: "Загрузка"
    },
    setProgress(e) {
        this.progress += 10;    // Увеличиваем прогресс на 10% при каждом нажатии
        this.downloadText = this.progress + "%";
        if (this.progress >= 100) {
            this.downloadText = "Завершено";   // Отображаем завершение при достижении 100%
        }
    }
}

Реализация выглядит следующим образом:Введите описание изображения### Компонент List Компонент List часто используется для отображения множества последовательных данных одного типа. Компонент списка List состоит из двух типов подкомпонентов — это list-item (элемент списка) и list-item-group (группа элементов списка). В этом разделе подробно рассмотрим компонент list-item-group.

Компонент list-item-group представляет собой сворачиваемый список, который используется вместе с list-item. Первый элемент list-item в группе list-item-group служит категорией, а все остальные элементы сворачиваются в эту категорию. При нажатии на элемент происходит раскрытие или сворачивание содержимого. Код представлен ниже:

<!-- index.html -->
<div class="container">
    <list>
        <list-item-group>
            <list-item class="item_style"><text class="big_size">Фрукты</text></list-item>
            <list-item><text class="font_size">Яблоко</text></list-item>
            <list-item><text class="font_size">Банан</text></list-item>
        </list-item-group>
        <list-item-group>
            <list-item class="item_style"><text class="big_size">Напитки</text></list-item>
            <list-item><text class="font_size">Кока-кола</text></list-item>
            <list-item><text class="font_size">Кофе</text></list-item>
        </list-item-group>
        <list-item-group>
            <list-item class="item_style"><text class="big_size">Снеки</text></list-item>
            <list-item><text class="font_size">Чипсы</text></list-item>
            <list-item><text class="font_size">Потрошенка</text></list-item>
        </list-item-group>
    </list>
</div>
.item_style {
    background-color: pink;
}
.big_size {
    font-size: 50px;
}

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

Пользовательские компоненты

Пользовательские компоненты создаются пользователями в соответствии с бизнес-требованиями путём объединения существующих компонентов, их упаковки в новые компоненты и последующего многократного использования этих новых компонентов в проектах. Это повышает читаемость и расширяемость кода.

Пользовательские компоненты импортируются в основной документ через элемент <element>. Пример кода использования:

<element name="comp" src="./comp.html"></element>
<div>
    <comp prop1='xxxx' @child1="bindParentVmMethod"></comp>
</div>
```* Атрибут `name` указывает имя пользовательского компонента (необязательный атрибут; если имя не указано, то используется имя файла HML). Атрибут `src` указывает путь к файлу HML пользовательского компонента. Для точного указания пути этот атрибут обязательно должен быть заполнен. Обратите внимание, что `"../"` указывает на родительскую директорию.
* Атрибуты `prop` используются для связи между компонентами и могут передаваться в компонент через `<tag prop='значение'>`; названия должны быть записаны строчными буквами.
* Взаимодействие событий: события внутри пользовательских компонентов привязываются к событиям дочерних компонентов с помощью синтаксиса `(on или @)child1`, где события дочернего компонента вызываются через `this.$emit('child1', {params: 'передаваемые параметры'})`, а метод `bindParentVmMethod` в родительском компоненте получает эти параметры.Следующий пример демонстрирует создание пользовательского компонента и его использование в родительском компоненте. Создайте новую директорию `comp` в папке `pages`, а также создайте базовый файл HTML, CSS и JS для этого компонента. Код представлен ниже:

```html
<div class="item">
    <text class="title_style">{{title}}</text>
    <text class="text-style" onclick="childClicked">Нажмите здесь, чтобы показать скрытый текст</text>
    <text class="text-style" if="{{showword}}">Hello World</text>
</div>
.item {
    width: 700px;
    flex-direction: column;
    height: 300px;
    align-items: center;
    margin-top: 100px;
}
.text-style {
    font-weight: 500;
    font-family: Courier;
    font-size: 40px;
}
export default {
    props: {
        title: {
            default: 'title'
        }
    },
    data: {
        showword: false
    },
    methods: {
        childClicked() {
            this.$emit('eventType1', { text: "полученные параметры от дочернего компонента" });
            this.showword = !this.showword;
        }
    }
};

Вышеуказанный код представляет собой новый пользовательский компонент comp, содержащий текстовое поле с возможностью клика, которое при активации передаёт данные из дочернего компонента в родительский и меняет значение showword с false на true, тем самым показывая текст "Hello World".

В родительском компоненте пользовательский компонент импортируется через элемент <element> следующим образом:```html

<element name="comp" src="./comp/comp.hml"></element>
<div class="container">
    <text>Родительский компонент: {{text}}</text>
    <comp title="Пользовательский компонент" @event-type1="textClicked"></comp>
</div>
```
```css
.container {
    background-color: #f8f8ff;
    flex: 1;
    flex-direction: column;
    align-content: center;
}
```
```javascript
export default {
    data: {
        text: "начало"
    },
    textClicked(clicked) {
        this.text = clicked.detail.text;
    }
}
```
В данном примере родительский компонент передает параметр с названием `title` в пользовательский компонент через свойство. Пользовательский компонент принимает этот параметр через `props`. Установленные свойства могут быть объявлены как атрибуты в пользовательском компоненте. Внешний родительский компонент передает параметры используя конвенцию kebab-case (например, `event-type1`).
```Пользовательский компонент также может отправлять данные обратно в родительский компонент через события. Например, событие `textClicked`, которое родительский компонент получает через `clicked.detail`.

![Изображение](https://images.gitee.com/uploads/images/2021/0722/182031_dece65e7_8496150.png "%Просмотр 1.png")

Передача данных между родительским и дочерним компонентами является односторонней. Обычно данные передаются от родительского компонента к дочернему, а если дочерний компонент хочет отправить данные обратно вверх, он должен привязаться к событию и использовать метод `$emit`.

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

Для наблюдения за изменениями свойств внутри компонента, можно использовать метод `$watch` для добавления обратного вызова при изменении свойства.

Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/isrc_ohos-ultimate-harmony-reference.git
git@api.gitlife.ru:oschina-mirror/isrc_ohos-ultimate-harmony-reference.git
oschina-mirror
isrc_ohos-ultimate-harmony-reference
isrc_ohos-ultimate-harmony-reference
master