完成英雄页banner

2018-12-24 21.12.07.gif | center | 747x427

这是一篇纯写样式的代码,旨在让你再次熟悉umi的数据流,和页面渲染。如果你能够独立完成上面的效果,那你就不用继续阅读这篇文章了。

1.添加mock数据

./mock/api.js

  1. 'POST /api/freeheros.json':(req,res)=>{
  2. const { number } = req.body;
  3. function getRandomArrayElements(arr, count) {
  4. var shuffled = arr.slice(0),
  5. i = arr.length,
  6. min = i - count,
  7. temp,
  8. index;
  9. while (i-- > min) {
  10. index = Math.floor((i + 1) * Math.random());
  11. temp = shuffled[index];
  12. shuffled[index] = shuffled[i];
  13. shuffled[i] = temp;
  14. }
  15. return shuffled.slice(min);
  16. }
  17. const freeheros = getRandomArrayElements(herolist, number);
  18. res.send(freeheros);
  19. }

这里我们增加了周免英雄的接口,从英雄池里面随机取出了几个对象,这个方法是我找来的,旨在做一个简单的演示,不要太在意,如果你有更好的方法,完全可以用你自己的。

2.增加请求服务

./src/services/api.js

  1. export async function getFreeHeros(params) {
  2. return request('/api/freeheros.json', {
  3. method: 'POST',
  4. body: params,
  5. });
  6. }

3.在model中请求数据

./src/pages/hero/models/hero.js

  1. - import { queryHeroList, getHeroDetails } from 'services/api';
  2. + import { queryHeroList, getHeroDetails, getFreeHeros } from 'services/api';
  3. export default {
  4. state: {
  5. heros: [],
  6. + freeheros: [],
  7. filterKey: 0,
  8. + itemHover:0 //因为周免英雄列表里面有一个一直是详情图,所以这里给一个标记
  9. },
  10. subscriptions: {
  11. ...
  12. },
  13. reducers: {
  14. ...
  15. },
  16. effects: {
  17. *fetch({ type, payload }, { put, call, select }) {
  18. const herolist = yield call(queryHeroList);
  19. const herodetails = yield call(getHeroDetails, { ename: 110 });
  20. + const freeheros = yield call(getFreeHeros,{number:13});
  21. yield put({
  22. type: 'save',
  23. payload: {
  24. heros: herolist,
  25. + freeheros: freeheros
  26. },
  27. });
  28. },
  29. },
  30. };

4.编写FreeHeroItem组件

./src/pages/hero/components/FreeHeroItem.js

  1. function FreeHeroItem({ data, thisIndex, onItemHover, itemHover }) {
  2. if (!data || !data.ename) return null;
  3. return (
  4. <img
  5. onMouseEnter={() => {
  6. itemHover !== thisIndex && onItemHover(thisIndex);
  7. }} //步骤7 需要
  8. style={{
  9. borderRadius: '5px',
  10. height: '69px',
  11. margin: '5px',
  12. width: itemHover === thisIndex ? '224px' : '69px',
  13. }}
  14. src={`https://game.gtimg.cn/images/yxzj/img201606/heroimg/${data.ename}/${data.ename}${
  15. itemHover === thisIndex ? '-freehover.png' : '.jpg'
  16. }`}
  17. />
  18. );
  19. }
  20. export default FreeHeroItem

因为这个组件的样式很少,所以我们把样式写在style中,这样可以减少一个less文件。

5.在页面中渲染数据

./src/pages/hero/index.js

  1. import FreeHeroItem from './components/FreeHeroItem';
  2. ... ...
  3. const { heros = [], filterKey = 0, freeheros = [] ,itemHover=0} = hero;
  4. ... ...
  5. return (
  6. <div className={styles.normal}>
  7. <div className={styles.info}>
  8. <Row className={styles.freehero}>
  9. <Col span={24}>
  10. <p>周免英雄</p>
  11. <div>
  12. {freeheros.map((data,index) => {
  13. return <FreeHeroItem data={data} itemHover={itemHover} onItemHover={onItemHover} thisIndex={index} key={index}/>
  14. })}
  15. </div>
  16. </Col>
  17. </Row>
  18. </div>
  19. ... ...
  20. </div>
  21. )

6.为页面添加样式

./src/pages/hero/index.less

  1. .normal {
  2. background: url(//game.gtimg.cn/images/yxzj/web201605/top_banner/bg_wrapper2.jpg) no-repeat center
  3. top;
  4. padding-top: 500px;
  5. }
  6. .info {
  7. padding: 8px 20px 0;
  8. margin-bottom: 20px;
  9. .freehero {
  10. overflow: hidden;
  11. width: 100%;
  12. border-radius: 5px;
  13. height: 115px;
  14. padding: 0 15px;
  15. background-color: #123564;
  16. p {
  17. color: #a6afbc;
  18. margin: 5px;
  19. }
  20. }
  21. }

7.为页面增加响应事件

./src/pages/hero/components/FreeHeroItem.js

  1. // 详细代码见步骤4
  2. + onMouseEnter={() => {
  3. + itemHover !== thisIndex && onItemHover(thisIndex);
  4. + }}

./src/pages/hero/index.js

  1. const onChange = e => {
  2. ...
  3. };
  4. + const onItemHover=e=>{
  5. + dispatch({
  6. + type: 'hero/save',
  7. + payload: {
  8. + itemHover: e
  9. + },
  10. + });
  11. + }
  12. return (
  13. //这里面的详细代码见步骤5
  14. )

代码回顾:这节课的全部代码