Blade
是一个分页框架,旨在简化分页功能集成到应用中的过程。
Blade 提供了两个库用于处理分页:Blade
和 BladeTCA
。BladeTCA
是一个为 Composable Architecture 设计的扩展。两者都支持使用基于偏移量和游标的分页。
首先,你需要为基于游标或偏移量的分页实现页面加载器
import Blade
/// Offset pagination loader
final class OffsetPageLoader<Element: Equatable & Decodable>: IOffsetPageLoader {
func loadPage(request: OffsetPaginationRequest) async throws -> Page<Element> {
// Implementation here
}
}
/// Cursor pagination loader
final class CursorPageLoader<Element: Equatable & Decodable & Identifiable>: ICursorPageLoader {
func loadPage(request: CursorPaginationRequest<Element>) async throws -> Page<Element> {
// Implementation here
}
}
其次,创建一个 Paginator
实例
import Blade
/// Offset-based pagination
let paginator = Paginator(configuration: PaginationLimitOffset(firstPage: .zero, limit: 20), offsetPageLoader: OffsetPageLoader())
/// Cursor-based pagination
let paginator = Paginator(configuration: PaginationCursorSeek(id: #id_here), offsetPageLoader: CursorPageLoader())
第三,分页器能够请求第一页、下一页以及重置其状态,就像这样
/// Request an initial page
let page = try await paginator.refresh()
/// Request next page
let nextPage = try await paginator.nextPage()
/// Reset state
await paginator.reset()
如果你的应用使用了 Composable Architecture,则可以轻松集成 Blade
。
import BladeTCA
// MARK: Reducer
@Reducer
struct SomeFeature {
// MARK: Types
struct State: Equatable {
var paginator: PaginatorState<ArticleView.ViewModel>
}
enum Action {
case child(PaginatorAction<ArticleView.ViewModel, Never>)
}
// MARK: Reducer
var body: some ReducerOf<Self> {
Reduce { state, action in
switch state {
case .clild:
return .none
}
}
.paginator(
state: \SomeFeature.State.paginator,
action: /SomeFeature.Action.child,
loadPage: { request, state in
// Load page here
}
)
}
}
// MARK: View
import ComposableArchitecture
import SwiftUI
// MARK: - SomeView
struct SomeView: View {
// MARK: Properties
private let store: StoreOf<SomeFeature>
// MARK: Initialization
init(store: StoreOf<SomeFeature>) {
self.store = store
}
// MARK: View
var body: some View {
PaginatorListView(
store: store.scope(state: \.paginator, action: { .child($0) })
) { state in
// Implement UI here
}
}
Swift Package Manager 是一个用于自动化 Swift 代码分发的工具,并已集成到 swift
编译器中。它还处于早期开发阶段,但 blade
确实支持在受支持的平台上使用它。
一旦你设置好你的 Swift 包,添加 blade
作为依赖项就像将其添加到你的 Package.swift
文件的 dependencies
值中一样简单。
dependencies: [
.package(url: "https://github.com/space-code/blade.git", .upToNextMajor(from: "1.0.0"))
]
引导开发环境
make bootstrap
请随时帮助改进这个项目!如果你发现任何可以改进的地方或想要新功能,请提交 issue 或发送 Pull Request!
Nikita Vasilev, nv3212@gmail.com
blade 在 MIT 许可证下可用。有关更多信息,请参阅 LICENSE 文件。