State
consistent across Stores
by type safe pub/sub
pattern with Reducers
of RootStore
.Action
propagation flow from root to State
subtree.RootStore/Dispatcher: Propagates domained actions
Reducer: Subscribes to RootStore
and reduces Action
to generate new state
Action: Action driven - more loosely coupled pattern than Delegation
pattern
State:
Action
and outputs new State
Action
to children nodes via State
treeFeedListView
struct FeedListView: View {
@ObservedObject var state = FeedListState()
var body: some View {
List {
ForEach(state.feeds, id: \.diffId) { feed in
FeedCell(feed: feed)
}
}
}
}
FeedListState
public class FeedListState: ReduxReducer, ObservableObject {
@Published var feeds: [Feed] = []
public override func reduce(action: ReduxActionProtocol) {
// Propagates `action` to the substate tree.
// Setting `self.feeds` with new feeds triggers list UI reloading
// and SwiftUI will diff efficiently based on list identifier.
feeds = feeds.map { $0.reduce(action: action) }
}
Dispatch FeedLikeAction
dispatch(action: FeedLikeAction(feed: feed))
Reduce FeedLikeAction
public struct Feed {
public var diffId = UUID()
public let feedId: Int
public let title: String
public var isLiked: Bool { didSet { diffId = UUID() } }
}
extension Feed: ReduxStateProtocol {
@discardableResult
public func reduce(action: ReduxActionProtocol) -> Self {
// Makes the deep copy of self.
var feedCopy = self
switch action {
case let action as FeedLikeAction:
// Reduces the `FeedLikeAction`.
if feedId == action.feed.feedId {
feedCopy.isLiked = !action.feed.isLiked
}
default: break
}
return feedCopy
}
}
link |
Stars: 21 |
Last commit: 47 weeks ago |
Swiftpack is being maintained by Petr Pavlik | @ptrpavlik | @swiftpackco | API | Analytics