首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Redux @connect装饰器中的'@‘(at符号)是什么?

Redux @connect装饰器中的'@‘(at符号)是什么?
EN

Stack Overflow用户
提问于 2015-09-18 16:07:09
回答 2查看 65.4K关注 0票数 236

我正在学习Redux with React,偶然发现了这段代码。我不确定它是否是特定于Redux的,但我在其中一个示例中看到了以下代码片段。

代码语言:javascript
复制
@connect((state) => {
  return {
    key: state.a.b
  };
})

虽然connect的功能非常简单,但我不理解connect之前的@。如果我没记错的话,它甚至不是JavaScript运算符。

有人能解释一下这是什么吗?为什么要用它?

更新:

它实际上是react-redux的一部分,用于将React组件连接到Redux存储。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-09-20 12:56:50

@符号实际上是一个JavaScript表达式currently proposed to signify

装饰器使得在设计时注释和修改类和属性成为可能。

下面是在没有装饰器的情况下和使用装饰器的情况下设置Redux的示例:

不带装饰器的

代码语言:javascript
复制
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);

使用装饰器的

代码语言:javascript
复制
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

票数 384
EN

Stack Overflow用户

发布于 2017-04-10 00:53:14

非常重要!

这些道具被称为状态道具,它们与普通道具不同,组件状态道具的任何更改都会一次又一次地触发组件呈现方法,即使您不使用这些道具,因此出于性能的原因,尝试仅绑定组件中所需的状态道具,如果您使用子道具,则仅绑定这些道具。

例如:假设在你的组件中,你只需要两个道具:

user name的最后一条消息

不这样做

代码语言:javascript
复制
@connect(state => ({ 
   user: state.user,
   messages: state.messages
}))

执行此操作

代码语言:javascript
复制
@connect(state => ({ 
   user_name: state.user.name,
   last_message: state.messages[state.messages.length-1]
}))
票数 52
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32646920

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档