Blade: a pagination framework that simplifies the integration of pagination into the application

blade

License Swift Compatibility Platform Compatibility CI CodeCov

Number of GitHub contributors Number of GitHub issues that are open Number of GitHub closed issues Number of GitHub stars Number of GitHub pull requests that are open

GitHub release; latest by date

描述

Blade 是一个分页框架,旨在简化分页功能集成到应用中的过程。

用法

Blade 提供了两个库用于处理分页:BladeBladeTCABladeTCA 是一个为 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()

TCA 用法

如果你的应用使用了 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 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 文件。