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