之前我们的代码,每次搜索框聚焦的时候,都会发送ajax 请求。这是很没有必要的。
代码如下
const mapDispatchToProps = (dispatch) => {
return {
handleFocus () {
dispatch(actionCreators.getList());
dispatch(actionCreators.searchFocus());
},
...
}
}
我们可以根据redux 中的list ,判断是否会发送获取list 的 ajax 请求。如下
import React, { Component } from 'react';
import {connect} from 'react-redux';
import {
HeaderWrapper,
Logo,
Nav,
NavItem,
NavSearch,
Addition,
Button,
SearchWrapper,
SearchInfo,
SearchInfoTitle,
SearchInfoSwitch,
SearchInfoItem
} from './style';
import '../../statics/iconfont/iconfont.css';
import { CSSTransition } from 'react-transition-group';
import { actionCreators } from './store';
class Header extends Component {
render() {
let { focused, handleFocus, handleBlur, list} = this.props;
return (
<HeaderWrapper>
<Logo href='/'/>
<Nav>
<NavItem className='left active'>首页</NavItem>
<NavItem className='left'>下载</NavItem>
<NavItem className='right'>登录</NavItem>
<NavItem className='right'>
<span className="iconfont"></span>
</NavItem>
<SearchWrapper>
<CSSTransition
in={focused}
timeout={200}
classNames="slide"
>
<NavSearch
placeholder="搜索"
className={focused ? "focused" : ""}
onFocus={() => { handleFocus(list) } }
onBlur={handleBlur}
></NavSearch>
</CSSTransition>
<span
className={focused ? "focused iconfont zoom" : "iconfont zoom"}
></span>
{this.getListArea()}
</SearchWrapper>
</Nav>
<Addition>
<Button className='writting'>
<span className="iconfont"></span>
写文章
</Button>
<Button className='reg'>注册</Button>
</Addition>
</HeaderWrapper>
)
}
getListArea = () => {
const {focused, list, page, handleMouseEnter,
mouseEnter, handleMouseLeave, handleChangeKeyWord, totalPage
} = this.props;
const jsList = list.toJS();
const pageList = [];
if (jsList.length) {
for (let i = (page-1) * 10; i< page * 10; i++) {
if (i >= jsList.length) {
break;
}
pageList.push(<SearchInfoItem key={jsList[i]}>{jsList[i]}</SearchInfoItem>)
}
}
if (focused || mouseEnter) {
return (
<SearchInfo
onMouseEnter={handleMouseEnter}
onMouseLeave={handleMouseLeave}
>
<SearchInfoTitle>
热门搜索
<SearchInfoSwitch onClick={() => handleChangeKeyWord(page, totalPage,this.spinIcon)}>
<i ref={(icon) => {this.spinIcon = icon}} className="iconfont spin"></i>
换一批
</SearchInfoSwitch>
</SearchInfoTitle>
<div>
{pageList}
</div>
</SearchInfo>
)
} else {
return null;
}
};
}
const mapStateToProps = (state) => {
return {
focused: state.get("header").get("focused"),
list: state.get("header").get("list"),
page: state.get("header").get("page"),
totalPage: state.get("header").get("totalPage"),
mouseEnter: state.get("header").get("mouseIn")
}
}
const mapDispatchToProps = (dispatch) => {
return {
handleFocus (list) {
if (list.size === 0) {
dispatch(actionCreators.getList());
}
dispatch(actionCreators.searchFocus());
},
handleBlur () {
dispatch(actionCreators.searchBlur());
},
handleMouseEnter () {
dispatch(actionCreators.mouseEnter());
},
handleMouseLeave () {
dispatch(actionCreators.mouseLeave());
},
handleChangeKeyWord (page, totalPage, spin) {
let originAngle = spin.style.transform.replace(/[^0-9]/ig, '');
if (originAngle) {
originAngle = parseInt(originAngle, 10);
} else {
originAngle = 0;
}
spin.style.transform = "rotate(" + (originAngle + 360 ) + "deg)";
let newPage = (page) % totalPage + 1;
dispatch(actionCreators.changekeyword(newPage));
}
}
}
export default connect(mapStateToProps, mapDispatchToProps)(Header);
下面,我们改一个小样式:鼠标放到 换一批的时候,会是一个手型。如下。
export const SearchInfoSwitch = styled.span`
float: right;
font-size: 13px;
cursor: pointer;
.spin {
display: block;
float: left;
font-size: 12px;
transition: all .2s ease-in;
transform-origin: center center;
}
`;