我正在用React学习Redux,偶然发现了这段代码。我不确定它是否特定于Redux,但我在其中一个示例中看到了以下代码片段。
@connect((state) => {
return {
key: state.a.b
};
})
虽然功能connect
非常简单,但我不明白@
之前connect
。如果我没有记错的话,它甚至都不是JavaScript运算符。
有人可以解释一下这是什么,为什么使用它?
更新:
实际上,react-redux
它的一部分用于将React组件连接到Redux存储。
@
实际上,该符号是一个JavaScript表达式,用于表示
装饰器
:
装饰器使在设计时注释和修改类和属性成为可能。
这是在不使用装饰器的情况下设置Redux的示例:
没有装饰
import React from 'react';
import * as actionCreators from './actionCreators';
import { bindActionCreators } from 'redux';
import { connect } from 'react-redux';
function mapStateToProps(state) {
return { todos: state.todos };
}
function mapDispatchToProps(dispatch) {
return { actions: bindActionCreators(actionCreators, dispatch) };
}
class MyApp extends React.Component {
// ...define your main app here
}
export default connect(mapStateToProps, mapDispatchToProps)(MyApp);
使用装饰器
import React from 'react';
import * as actionCreators from './actionCreators';
import { bindActionCreators } from 'redux';
import { connect } from 'react-redux';
function mapStateToProps(state) {
return { todos: state.todos };
}
function mapDispatchToProps(dispatch) {
return { actions: bindActionCreators(actionCreators, dispatch) };
}
@connect(mapStateToProps, mapDispatchToProps)
export default class MyApp extends React.Component {
// ...define your main app here
}
上面的两个示例都是等效的,这只是一个优先事项。此外,装饰器语法尚未内置到任何Javascript运行时中,并且仍处于试验阶段,可能会发生变化。如果要使用它,可以使用Babel来使用。
它实际上是的一部分,用于将React组件连接到Redux存储。
问题内容: 我很好奇AngularJS中的装饰器到底是什么。除了AngularJS文档中的简短内容和youtube视频中的简短提及(尽管很有趣)之外,装饰者在线上没有太多信息。 正如Angular所说的那样,装饰器是: 装饰服务,允许装饰者截取服务实例的创建。返回的实例可以是原始实例,也可以是委派给原始实例的新实例。 我真的不知道这 意味着 什么,而且我不确定为什么要将这种逻辑与服务本身分开。例如
问题内容: 我想按照这个代码在 然后像这样在传奇中使用它: 该减速器(甚至是减速器)看起来与我通常期望的减速器看起来非常不同。 谁能解释选择器是什么,以及reduce-reducer以及reducer如何适合redux-saga? 问题答案: 不是缩减器,而是确实的选择器,即知道如何从存储中提取特定数据的函数。 选择器 提供了一个额外的层,这样,如果您更改了商店结构,突然之间您不再在该位置,而是在
问题内容: 假设我有一个名为的类,并且我想使用装饰器设计模式。如果我错了,请纠正我,但是要使其正常工作,我们需要创建一个装饰器类,例如,该类将保留对实例的引用,所有其他装饰器将对其进行扩展以添加功能。 我不明白为什么我们必须创建装饰器类而不是使用实例? 问题答案: 装饰器模式用于动态地(即在运行时)向对象添加功能。通常,在编写类时,对象将具有固定的功能。但是重要的一点是,对象的功能以对对象的客户端
问题内容: 我在与装饰器一起使用docstrings时遇到问题。给出以下示例: 现在,该帮助未像预期那样向我显示文档字符串,而是显示: 没有装饰器,帮助是正确的: 我知道,该函数由装饰器包装,因此该函数对象不再是该函数。但是,按预期方式获得文档字符串(和帮助)的最佳解决方案是什么? 问题答案: 使用更新装饰的属性: 另请参阅标准库文件的。
问题内容: 基本上,我想知道为什么必须创建一个抽象装饰器类来实现(或扩展)某些接口(或抽象类)。为什么所有新的“装饰类”都不能简单地实现(或扩展)基本抽象对象本身(而不是扩展抽象装饰器类)? 为了更具体一点,我将使用设计模式书中涉及咖啡饮料的示例: 有一个称为的抽象组件类 简单的饮料类型,例如简单扩展 为了装饰饮料,创建了一个抽象类,该类扩展并具有 假设我们要添加“牛奶”调味品,将创建一个扩展 我