Содержание ниже взято из книги «Практическое применение разработки приложений для операционной системы HarmonyOS», которую можно приобрести здесь: платформа JD, платформа Dangdang.
Для полной версии проекта скачайте сюда: ISRC_OHOS/OpenHarmony-JS-Demos
Откройте entry → src → main → js, структура рабочего каталога проекта показана на следующей картинке.
В частности,
Этот 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`.

Передача данных между родительским и дочерним компонентами является односторонней. Обычно данные передаются от родительского компонента к дочернему, а если дочерний компонент хочет отправить данные обратно вверх, он должен привязаться к событию и использовать метод `$emit`.
При получении данных от родительского компонента, дочерний компонент не может напрямую изменять эти данные. Вместо этого можно использовать `data`, чтобы принять значения из `props` как начальные значения, а затем работать с этими значениями.
Для наблюдения за изменениями свойств внутри компонента, можно использовать метод `$watch` для добавления обратного вызова при изменении свойства.
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )