Написанное на основе ArkUI приложение для HarmonyOS, использующее открытые API играйте в Android, реализует простое навигационное меню страниц, вход, сохранение состояния входа, отображение данных и загрузку страниц H5.
Нижняя панель навигации реализована с помощью компонента Tabs, который состоит из двух частей: TabContent и TabBar. TabContent — это страница с содержимым, а TabBar — это панель навигации. Каждая TabContent должна иметь соответствующий таб, который можно настроить через свойство tabBar.
Tabs({ barPosition: BarPosition.End }) {
TabContent() {
HomeComponent()
}.align(Alignment.Top)
.tabBar(this.tabBuilder("Главная", 0, $r("app.media.main_index_select_icon"), $r("app.media.main_index_icon")))
TabContent() {
SystemComponent()
}.align(Alignment.Top)
.tabBar(this.tabBuilder("Система", 1, $r("app.media.main_house_select_icon"), $r("app.media.main_house_icon")))
TabContent() {
ProjectComponent()
}.tabBar(this.tabBuilder("Проекты", 2, $r("app.media.main_message_select_icon"), $r("app.media.main_message_icon")))
TabContent() {
MyComponent()
}.align(Alignment.Top)
.tabBar(this.tabBuilder("Мои", 3, $r("app.media.main_me_select_icon"), $r("app.media.main_me_icon")))
}.scrollable(false)
.divider({strokeWidth: 0.3})
.animationDuration(0)
.onChange((index) => {
this.currentIndex = index
})
```barPosition управляет положением панели навигации, BarPosition.Start указывает на верхнюю панель навигации, а BarPosition.End — на нижнюю; divider определяет стиль разделительной линии панели навигации; animationDuration устанавливает время анимации при переходе между страницами; onChange — это обработчик события при смене страницы.HomeComponent, SystemComponent, ProjectComponent, MyComponent — это пользовательские компоненты страниц. При смене панели навигации происходит переход на соответствующую страницу.
### Пользовательский компонент главной страницы (HomeComponent)
Главная страница HomeComponent состоит из компонента слайдера Swiper и компонента списка, который используется для отображения списка статей. Внешне это обёрнуто в компонент PullToRefresh для поддержки функции обновления при прокрутке вверх. Структура примерно такая:```ts
```Пусть страница будет обновлена при свайпе вниз/вверх
PullToRefresh({
data: this.articleList,
scroller: this.scroller,
onRefresh: () => {
//Обновление данных при свайпе вниз
},
onLoadMore: () => {
//Загрузка дополнительных данных при свайпе вверх
},
customList: () => {
//Обновление содержимого страницы
Scroll(this.scroller) {
Column() {
//Слайдер
Swiper() {}
//Список статей
ForEach(this.articleList, (item: ArticleData) => {
ArticleListItem({ article: item })
})
}
}
}
})
Компонент обновления страницы использует стороннюю библиотеку @ohos/pulltorefresh. Компонент обновления страницы должен содержать скроллинг, поскольку страница состоит из слайдера и списка статей, поэтому вокруг него добавлен компонент Scroll, чтобы обеспечить корректную работу страницы. SystemComponent - это пользовательский компонент, созданный с помощью конструктора @Builder, который позволяет абстрагировать повторяющиеся элементы интерфейса в метод, используемый для отображения каждого элемента списка.
### Системный пользовательский компонент (SystemComponent)
Системная страница состоит из верхней панели Tabs, содержащей Grid и компонента PullToRefresh для списка. Компонент Grid — это системный компонент для отображения плиток. Структура страницы следующая:
```ts
// Верхняя панель навигации
Tabs({ barPosition: BarPosition.Start }) {
TabContent() {
Column() {
// Верхняя панель плиток
Grid() {}
// Компонент PullToRefresh
PullToRefresh({
customList: () => {
// Компонент скроллинга
Scroll() {
Column() {
// Элементы списка статей
ArticleListItem()
}
}
}
})
}
}
}
На этой странице панель навигации содержит панель плиток, а под ней — компонент PullToRefresh для отображения списка. При переключении панели навигации вызывается интерфейс для обновления плиток и списка. При выборе плитки обновляется список.### Проектный пользовательский компонент (ProjectComponent) Проектная страница состоит из верхней панели навигации, содержащей компонент PullToRefresh, который в свою очередь содержит компонент Grid для отображения плиток. Структура страницы следующая:
// Верхняя панель навигации
Tabs({ barPosition: BarPosition.Start }) {
TabContent() {
// Компонент PullToRefresh
PullToRefresh({
customList: () => {
Grid(this.scroller) {
ForEach(this.projectList, (item: ArticleData) => {
GridItem() {
// Стили элемента плитки
}
})
}
}
})
}
}
.columnsTemplate("1fr 1fr")
.width("95%")
.columnsGap(10)
.scrollBar(BarState.Off)
.padding(1)
Запросы к сети используются с помощью библиотеки [@ohos/axios](https://ohpm.openharmony.cn/#/cn/detail/@ohos%2Faxios). Библиотека была немного переопределена.```ts
export class HttpUtils {
private static instance: HttpUtils = new HttpUtils();
private axiosInstance: AxiosInstance;
private constructor() {
this.axiosInstance = axios.create({
baseURL: 'https://www.wanandroid.com/',
timeout: 10 * 1000,
// Установка глобальных заголовков запроса
headers: { "Content-Type": "application/x-www-form-urlencoded" },
// Установка прокси
// proxy: { host: "192.168.10.229", port: 8888, exclusionList: [] }
});
// Обработка запросов, добавление cookie в заголовок запроса
this.axiosInstance.interceptors.request.use(async (config: InternalAxiosRequestConfig) => {
if (config.url != WanAndroidUrl.Login) {
// Если это не запрос на вход, добавляем cookie в заголовок
const cookies = await PFUtils.get<string>("cookies").then();
config.headers["Cookie"] = cookies;
}
console.log("Запрос: ", JSON.stringify(config.headers));
return config;
});
// Обработка ответов, сохранение cookie
this.axiosInstance.interceptors.response.use((response: AxiosResponse) => {
console.log("Ответ: ", response.config.url);
console.log("Ответ: ", JSON.stringify(response.data));
if (response.config.url == WanAndroidUrl.Login) {
// Если это запрос на вход, сохраняем cookie
const cookies = response.headers["set-cookie"] as string[];
// Сохраняем cookie в кэше
PFUtils.put<string>("cookies", cookies.toString());
// Сохраняем состояние входа
PFUtils.put<boolean>("LoginState", true);
// Уведомляем другие страницы о успешном входе пользователя
emitter.emit({ eventId: Constant.USER_LOGIN });
}
return response;
}, (error: AxiosError) => {
// Обработка ошибок ответа
console.log("Ошибка: ", JSON.stringify(error));
});
}
}
``````markdown
log("Запрос ошибочных данных:", JSON.stringify(error))
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )