【发布时间】:2018-07-25 07:57:34
【问题描述】:
我正在学习将 ESLint(Airbnb 配置)与 React / Redux 结合使用。
以下代码是一个标准类型的 React / Redux 类,我编写它是为了享受处理 Airbnb 的所有 linting 规则。
通过了解 Airbnb 的配置偏好,我解决了大部分 linting 错误,但是,我目前不了解一些领域。它们是:
- 整个方法 renderTableHeader() 用红色标出,ESLint 告诉我:
[eslint] 期望 'this' 被类方法使用 'renderTableHeader'。 (class-methods-use-this) (JSX 属性) 类名:字符串
其他方法都没有这种掉毛问题
- 我将一个对象从 Redux 状态连接到 props(包含许多我需要在此类中迭代的键/对象)。 ESLint 似乎不喜欢我将对象从状态连接到道具......给我的信息:
[eslint] Prop 类型
object被禁止 (react/forbid-prop-types) 导入道具类型
我的状态对象是一个包含许多引用用户对象的键的对象 - 所以我需要 users 成为一个对象。这是不好的做法吗?如果是这样,我将如何在不出现此 lint 消息的情况下连接对象进行映射?
提前谢谢...这是我的课程:
import React, { Component } from 'react';
import { bindActionCreators } from 'redux';
import { connect } from 'react-redux';
import PropTypes from 'prop-types';
import _ from 'lodash';
import { getUsers } from '../actions/getUsers';
import setUserMarketingPref from '../actions/setUserMarketingPref';
import { setFilter } from '../actions/setFilter';
import TableRow from '../components/TableRow';
import '../styles/styles.css';
class AppContainer extends Component {
componentDidMount() {
this.props.getUsers();
}
renderTableHeader() {
return (
<div className="table__header">
<div className="table__header--name">Name</div>
<div className="table__header--gender">Gender</div>
<div className="table__header--region">Region</div>
</div>
);
}
renderTable() {
const { users, filterMode } = this.props;
const usersView = filterMode ? _.omitBy(users, user => !user.checked) : users;
return _.map(usersView, user => (
<TableRow
user={user}
key={user.id}
setUserMarketingPref={_.debounce(() => this.props.setUserMarketingPref(user.id), 100)}
/>
));
}
renderFilters() {
return (
<div className="table__buttons">
<button
id="marketing-other"
className="table__other"
onClick={e => this.props.setFilter(e.target.id)}
>Other filter
</button>
<button
id="marketing-none"
className="table__no-marketing"
onClick={e => this.props.setFilter(e.target.id)}
>No marketing
</button>
</div>
);
}
render() {
if (!_.size(this.props.users)) {
return null;
}
return (
<div className="table__container">
{this.renderTableHeader()}
{this.renderTable()}
{this.renderFilters()}
</div>
);
}
}
const mapDispatchToProps = dispatch => bindActionCreators(
{
getUsers,
setUserMarketingPref,
setFilter,
},
dispatch,
);
const mapStateToProps = state => ({
users: state.users,
filter: state.filter,
filterMode: state.marketing.filterMode,
});
AppContainer.defaultProps = {
filterMode: false,
getUsers: null,
setUserMarketingPref: null,
setFilter: null,
};
AppContainer.propTypes = {
users: PropTypes.object,
filterMode: PropTypes.bool,
getUsers: PropTypes.func,
setUserMarketingPref: PropTypes.func,
setFilter: PropTypes.func,
};
export default connect(mapStateToProps, mapDispatchToProps)(AppContainer);
【问题讨论】:
-
看起来 eslint 只是在抱怨列表中的第一个函数。使用
this可能会导致它抱怨renderTable()。我认为他们想要定义对象的形状,或者您可以禁用该线。由你决定。 reactjs.org/docs/typechecking-with-proptypes.html
标签: reactjs redux react-redux eslint eslint-config-airbnb