- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我只是想了解 react.js,也就是说,我刚刚完成了一些网络教程。
我对 redux 完全陌生,这是我观看的一些视频教程的一部分。我越深入研究它,就 redux 取代 react.js 的初始想法而言,它对我的意义越小。在 react 中,组件有自己的状态,可以通过 props 向下传递,以保持工作流程从上到下。
使用 redux,我们现在尝试使整个应用程序状态成为全局状态,并且我们必须定义操作来操纵该(全局)状态,那么除了“正常”的 javascript pub/sub 或观察者模式之外,这些操作是什么?或者也许我弄错了? - 澄清将不胜感激。
最佳答案
Redux 不应该“取代 react.js 的最初想法”,它更像是一个库,用于管理组件之间的共享状态并协调状态突变。
Redux 确实使用了 pub/sub 模式,请参阅此处的 store 方法:
http://redux.js.org/docs/api/Store.html#store-methods
您会找到 subscribe
组件用来订阅状态树变化的方法。通常你不会直接使用 store.subscribe,因为 Redux-React 绑定(bind)(基本上是 Redux connect
)会为你做到这一点。你可以在这里查看实际的实现,遵循起来并不复杂(事实上对我来说这是 Redux 相对于其他 Flux 实现的主要好处):https://github.com/reduxjs/react-redux/blob/4.x/src/components/connect.js#L199
该代码除了订阅商店发出的更改之外,还执行一些优化,例如仅在真正需要时将新 Prop 传递给组件(并因此触发重新渲染)。
还要考虑将组件内部状态与 Redux 一起使用是非常好的。您可以使用内部状态来存储您不需要/不想与其他组件共享的状态。
当你有一个更复杂的应用程序时,你会看到像 Redux 这样的需求,顶层组件需要相互通信(操作)并以某种方式共享一些状态。
Redux 中的操作默认只是 POJO(普通的旧 javascript 对象),您可以将它们视为您经常调度以响应用户触发的操作(例如用户单击按钮)的“事件”,但您不受限制为此,您可以从任何您想要的地方发送一个 Action 。 Redux 存储监听这些操作并调用 reducer(纯函数)传递您分派(dispatch)的操作对象。
Reducers 拦截所有分派(dispatch)的操作,它们可以为它们管理的状态切片返回一个新的、更新的状态。
从这个意义上说,reducer 是一个处理 Action 并根据需要更新状态的函数。
反过来,当 reducer 通过返回状态的新副本来更新状态时,连接的组件(订阅状态的更改)将被传递新的 props 并重新渲染以反射(reflect)更改。
有时,仅仅调度普通的 js 对象是不够的,你需要更多的控制。当您需要执行更复杂的逻辑时,这一点变得很清楚,例如,当您需要根据 AJAX 调用的响应更新状态中的计数器时。
使用 redux-thunk,您可以调度函数,而不仅仅是简单的对象。通过调度一个函数,您可以以一种非常简单的方式有效地实现控制模式的反转。你的 Action 变成了函数描述的“配方”,而不仅仅是一个简单的语句,就像 POJO Action 一样。
为什么只有 POJO 支持“开箱即用”,对于 Action ,为什么没有基本的 Action 类或其他东西?主要是因为没有必要。一个带有 type
的简单对象(基本上被认为是值的包)属性是你真正需要的,它基本上是最简单的接口(interface)。您可以认为这是针对接口(interface)(操作)而不是实现进行编程。
为什么全局状态更好,而不是每个组件管理自己的状态?主要是因为管理状态实际上是一个非平凡的 js 应用程序中最难的部分。通过使用 Redux,您可以从 UI 层提取所有逻辑,使其更易于测试。事实上,理想情况下,您应该能够测试 Redux 应用程序的所有真实“业务逻辑”,甚至无需渲染单个组件。
组件变得“笨拙”和“更纯粹”,因为它们只是呈现它们被告知要做的事情。这里的“更纯粹”意味着因为它们不持有任何状态,所以您看到的渲染仅取决于任何给定时间点的输入(读取“ Prop ”),而不是任何历史记录,因此是“无状态的”。
将状态作为单个 json 可序列化对象还可以轻松调试、对其进行快照以及从服务器或本地存储发送/恢复。
关于javascript - redux 可以被视为 pub/sub 或观察者模式吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39977540/
Rust 支持 pub和 pub(super) . pub使父模块可以访问项目...和pub(super)似乎也做同样的事情。我试过玩下面的例子,并交换 pub和 pub(super)似乎没有效果:
我正在尝试运行 this拖放 API。当我尝试运行 dart 文件(使用 dart 编辑器)时,出现以下错误: could not start pub serve or connect to pub
根据pub get docs pub get 和 pub Upgrade 之间的主要区别是: If a lockfile already exists, pub get uses the versio
我see函数的可见性可以在模块内声明为 pub(self)。这与没有 pub 属性的私有(private)函数有何不同?如果它们没有区别,为什么会存在这种语法? 最佳答案 pub(restricted
我正在运行 pub install 以便我可以使用作为 dart sdk 一部分的 intl 包(我需要使用 DateFormat 类)。我已经在我的项目中安装了其他包,例如 XML 解析器和演示文稿
假设我在 Rust 包中有这个文件层次结构: src/... src/m1/mod.rs src/m1/path/m2.rs 拥有以下行的实际区别是什么: pub mod path::m2; 在我的文
其中一个比另一个更安全吗? 最佳答案 id_rsa.pub 和 id_dsa.pub 是 id_rsa 和 id_dsa 的公钥。 如果您询问与 SSH 相关的问题,id_rsa 是 RSA key
pub 是 Dart 的包管理器。 Flutter 是一个使用 Dart 的移动应用 SDK。如何创建依赖于或以 Flutter 为目标的包? 最佳答案 要从 pub 包中声明对 Flutter 的依
id_rsa.pub 文件基本上是 Linux 主文件夹下 .ssh 文件夹中的一些加密文本,用于公钥加密。它使用 .pub 文件格式。但为什么这种文件格式也恰好是 Microsoft Publish
使用当前版本的angular.dart.tutorial , 使用 Chapter_04 对于“pub serve”,main.dart.js 是一个 42337 行的文件,示例运行良好。 对于“pu
假设我正在运行我自己的 pub-dartlang 实例对于私有(private)酒吧供稿;如何在 pubspec.yaml 中注明哪些软件包来自私有(private)提要与 pub.dartlang.
我们通过运行脚本来实现DART自动化,该脚本导航到项目文件夹(.yaml文件所在的位置)并运行“pub get”和“pub build”。它工作了一段时间,但现在(两种情况下)我们都得到了: Unha
我刚刚安装了 Dart Editor 并创建了一个简单的 Web 应用程序,当我单击运行时它显示此错误并且没有任何 react 。 “无法启动 pub 服务或连接到 pub” dart editor
当我尝试在 android studio 中打开大部分已下载的 flutter 应用程序时,它一直告诉我“Pub get”尚未运行,当我按下“获取依赖项”或升级依赖项时,它会向我显示该错误。我已经把a
在哪里可以找到用于搜索和列出已安装的打包版本和可用升级版本的命令行工具? 我想不出任何其他的软件包管理工具,它们不包含列出已安装版本或查找可用升级的命令,而无需实际升级。 例如,如果我的pubspec
前两天升级到 Flutter 2.0 开始面对 Execution failed for task ':app:compileFlutterBuildDebug'由于一些包裹。 然后我降级了,但错误仍
下面提供了相关的程序代码。我经常在开源项目中看到这样的代码,可以在Linux和Windows上运行。有人告诉我,这是为了避免编译警告。真的是这样吗? class Base { public:
我有一个带有简单测试代码的函数,例如: exports.helloPubSub = (event, context) => { const message = event.data
无法解析 URL“https://pub.dartlang.org”。错误 (69):无法“发布升级”flutter 工具。五秒后重试...(还剩 9 次尝试) 这是我创建或升级flutter时flu
我正在尝试制作一个脚本来控制农场中的 Android 设备,adb connect 通过 OpenSTF 建立连接。 .设备接受来自客户端的连接的要求之一是在 OpenSTF 中提供 adbkey.p
我是一名优秀的程序员,十分优秀!