const Header = React.createClass({
contextTypes: {
router: React.PropTypes.object.isRequired,
},
render() {
return (
<li className={this.context.router.isActive('a') ? 'active' : ''}>
<Link to="/a/">A</Link>
</li>
<li className={this.context.router.isActive('b') ? 'active' : ''}>
<Link to="/b/">B</Link>
</li>
);
},
});
我使用eslint-config-airbnb来检查上面的代码,它显示了一个错误信息,比如Component应该写成一个纯函数。
那么如何将上面的组件改为纯函数呢?
感谢您的帮助。
答案 0 :(得分:4)
当你有一个&#34;哑巴&#34;组件(没有内部状态,生命周期方法等),您可以将其编写为简单的JavaScript函数,而不是使用React.CreateClass
或扩展React.Component
。
查看文档here,了解有关纯函数作为组件的一般信息,并here查看特定于context
的信息。
所以在你的情况下:
function Header(context) {
return (
<li className={context.router.isActive('a') ? 'active' : ''}>
<Link to="/a/">A</Link>
</li>
<li className={context.router.isActive('b') ? 'active' : ''}>
<Link to="/b/">B</Link>
</li>
);
}
Header.contextTypes = {
router: React.PropTypes.object.isRequired,
}
答案 1 :(得分:0)
你也可以尝试ES6方式:
const Header = (context) => (
<li className={context.router.isActive('a') ? 'active' : ''}>
<Link to="/a/">A</Link>
</li>
<li className={context.router.isActive('b') ? 'active' : ''}>
<Link to="/b/">B</Link>
</li>
);
Header.contextTypes = {
router: React.PropTypes.object.isRequired,
}
export default Header;
&#13;
答案 2 :(得分:-1)
我使用一些假道具来绕过这个错误:
export default class NavItem extends React.Component {
constructor(props) {
super(props);
this.state = { count: 0 };
}
render() {
const { router } = this.context;
const { index, onlyActiveOnIndex, to, children } = this.props;
const isActive = router.isActive(to, onlyActiveOnIndex);
const LinkComponent = index ? IndexLink : Link;
return (
<li className={isActive ? 'active' : ''}>
<LinkComponent to={to}>{children}</LinkComponent>
</li>
);
}
}
NavItem.propTypes = {
children: React.PropTypes.node.isRequired,
index: React.PropTypes.bool,
onlyActiveOnIndex: React.PropTypes.bool,
to: React.PropTypes.oneOfType([
React.PropTypes.string,
React.PropTypes.object,
]).isRequired,
};
NavItem.contextTypes = {
router: React.PropTypes.object,
};