在 SwiftUI 中实现 Redux

本文介绍了如何在 SwiftUI 中实现 Redux,通过 State、Store、Action 和 Reducer 的概念,展示了如何响应用户操作并更新视图。文中给出了一个简单的数字计数器应用的示例,演示了 Redux 工作流程,并提供了将实现封装为可复用库的思路。
摘要由CSDN通过智能技术生成

链接:https://juejin.cn/post/6912251186770870286

早些年在编写 React 项目时,就接触过 Redux。先来看看它到底是什么?

Redux 是什么?

Redux 是为 JavaScript 应用程序编写的可预测状态容器。它把所有程序相关的状态和逻辑中心化,帮助我们编写行为一致(可以理解为UI 显示的数据总是与State 保持一致)的应用。详细了解 Redux,可以访问 Redux

Redux 的基本原理

下面是一张 Redux 的工作流程图:

从图中可以看到,Redux 的整个模式由四个组件组成:Store、View、Action 和 Reducer。

  • Store:持有整个程序的数据(State),在整个程序中只有一个 Store。
  • View:程序展示给用户的所有 UI 组件,负责与用户交互。
  • Action:用户对某个 View 的操作而触发的一个行为。例如点击搜索按钮而触发搜索请求,这个搜索请求就是一个 Action。
  • Reducer:一个纯函数,它接收 Action 和当前 State 作为参数,通过一系列运算,返回一个新的 State。

Redux 的工作流程

  1. 用户和 View 交互,产生一个 Action
  2. Store 把 Action 派发给 Reducer
  3. Reducer 经过运算,返回新的 State 给 Store,通常来说,只在 Reducer 中修改 State
  4. Store 通知 View 刷新 UI

Redux 在 SwiftUI 中的简单实现

SwiftUI 的核心思想跟 React 一样,都是响应式编程。所以我们可以参考 React 的 Redux 实现 SwiftUI 的 Redux。

假设我们正在开发一个非常简单的应用:UI 上显示一个数字 0,每次用户点击按钮,数字就加 1。

State

首先需要一个 State 来描述应用的数据,定义如下:

struct AppState {
    var count: Int

    init(count: Int = 0) {
        self.count = count
    }
}

Store

final class Store: ObservableObject {
    @Published private(set) var state: AppState

    init(initialState: AppState = .init()) {
        self.state = initialState
    }
}

在上面的代码中,把 Store 定义为 class 类型,遵循 ObservableObject 协议,这样我们就可以通过 SwiftUI 的 Environment 特性把唯一的一个 Store 对象注入到根视图中,然后子视图也可以访问 Store 中的 State。state@Published 标记,它能在 state 发生变化时通知 SwiftUI 刷新 View。

这里有一个iOS交流圈:891 488 181 可以来了解,分享BAT,阿里面试题、面试经验,讨论技术,裙里资料直接下载就行, 大家

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Redux是一个用于JavaScript应用程序状态管理的开源库,它可以用于任何JavaScript应用程序,包括React、Angular和Vue等框架。Redux的核心概念是一个store,它是一个状态容器,用于存储整个应用程序的状态。 下面我们来实现一个简单的Redux示例: 首先,我们需要创建一个store,可以使用Redux提供的createStore函数: ```javascript import { createStore } from 'redux'; const initialState = { count: 0 }; function reducer(state = initialState, action) { switch (action.type) { case 'INCREMENT': return { ...state, count: state.count + 1 }; case 'DECREMENT': return { ...state, count: state.count - 1 }; default: return state; } } const store = createStore(reducer); ``` 在上面的代码,我们定义了一个初始状态(initialState)和一个reducer函数,这个函数接收当前状态和一个action,根据action的type来更新状态。最后,我们使用createStore函数创建了一个store,并将reducer函数传递给它。 接下来,我们可以使用store来获取状态并更新状态: ```javascript console.log(store.getState()); // { count: 0 } store.dispatch({ type: 'INCREMENT' }); console.log(store.getState()); // { count: 1 } store.dispatch({ type: 'DECREMENT' }); console.log(store.getState()); // { count: 0 } ``` 在上面的代码,我们使用getState函数获取当前状态,并使用dispatch函数分别发送了两个action来更新状态。 最后,我们可以通过subscribe函数来监听状态的变化: ```javascript store.subscribe(() => { console.log(store.getState()); }); store.dispatch({ type: 'INCREMENT' }); // { count: 1 } store.dispatch({ type: 'DECREMENT' }); // { count: 0 } ``` 在上面的代码,我们使用subscribe函数注册了一个回调函数,每当状态发生变化时,这个回调函数就会被调用并打印当前状态。 以上就是一个简单的Redux示例的实现过程,当然实际的应用会更加复杂,但是Redux的核心概念都是类似的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值