Redux @connect装饰器中的“@”(at符号)是什么?

2022-08-30 00:47:25

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

@connect((state) => {
  return {
    key: state.a.b
  };
})

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

有人可以解释一下这是什么,为什么使用它吗?

更新:

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


答案 1

该符号实际上是目前提出的用于表示装饰器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


答案 2

非常重要!

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

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

  1. 最后一条消息
  2. 用户名

别这样

@connect(state => ({ 
   user: state.user,
   messages: state.messages
}))

这样做

@connect(state => ({ 
   user_name: state.user.name,
   last_message: state.messages[state.messages.length-1]
}))