增加过滤条件

2018-12-18 21.14.21.gif | center | 747x311

这小节,我们会简单的使用antd的Card和Radio,还是一样的,你可以自己先尝试着,实现,如果你可以独立完成,那你就不需要阅读本节了。

实现步骤

step1 分析数据,获得过滤条件

通过分析herolist的数据,我们得出herotype的对应表

  1. const heroType = [
  2. { key: 0, value: '全部' },
  3. { key: 1, value: '战士' },
  4. { key: 2, value: '法师' },
  5. { key: 3, value: '坦克' },
  6. { key: 4, value: '刺客' },
  7. { key: 5, value: '射手' },
  8. { key: 6, value: '辅助' },
  9. ];

step2 添加Card布局

  1. - import { Row, Col } from 'antd';
  2. + import { Row, Col, Card } from 'antd';
  3. ...
  4. <div className={styles.normal}>
  5. + <Card className={styles.radioPanel}>
  6. + </Card>
  7. ...

WX20181218-212025@2x.png | center | 747x106

step3 增加单选框分组

  1. - import { Row, Col, Card } from 'antd';
  2. + import { Row, Col, Radio, Card } from 'antd';
  3. + const RadioGroup = Radio.Group;
  4. + const heroType = [
  5. + { key: 0, value: '全部' },
  6. + { key: 1, value: '战士' },
  7. + { key: 2, value: '法师' },
  8. + { key: 3, value: '坦克' },
  9. + { key: 4, value: '刺客' },
  10. + { key: 5, value: '射手' },
  11. + { key: 6, value: '辅助' },
  12. + ];
  13. function Hero({ hero,dispatch }) {
  14. ...
  15. <Card className={styles.radioPanel}>
  16. + <RadioGroup >
  17. + {heroType.map(data => (
  18. + <Radio value={data.key} key={`hero-rodio-${data.key}`}>
  19. + {data.value}
  20. + </Radio>
  21. + ))}
  22. + </RadioGroup>
  23. </Card>

step4 为单选框分组增加事件和值

  1. - const { heros = [] } = hero;
  2. + const { heros = [],filterKey=0 } = hero;
  3. + const onChange = e => {
  4. + console.log(e.target.value);
  5. + };
  6. ...
  7. - <RadioGroup>
  8. + <RadioGroup onChange={onChange} value={filterKey}>

./src/pages/hero/models/hero.js model中要增加filterKey值

  1. state: {
  2. heros: [],
  3. + filterKey:0
  4. },

step5 将事件同步到model中

从属性中取得dispatch方法

  1. - function Hero({ hero }) {
  2. + function Hero({ hero,dispatch }) {

使用dispatch,将数据更新到页面上。

  1. const onChange = e => {
  2. - console.log(e.target.value);
  3. + dispatch({type:"hero/save",payload:{
  4. + filterKey:e.target.value
  5. + }})
  6. };

dispatch可以把事件发布到reducers和effects,这里我们只需要更新filterKey就好,所以我们发起一个type为sava的事件,这是我们之前的代码了,可以再看一下,它只是把参数同步到state中

  1. reducers: {
  2. save(state, action) {
  3. return { ...state, ...action.payload };
  4. },
  5. },

step6 使用filterKey过滤数组

  1. <Row>
  2. -{heros.reverse().map(item => (
  3. +{heros.filter(item=>filterKey===0||item.hero_type === filterKey).reverse().map(item => (
  4. ...
  5. </Row>

第一个条件filterKey===0是因为我们把全部的key设置为0 第二个条件判断hero_type,过滤数组。

step7 保存,运行程序

2018-12-18 21.14.21.gif | center | 747x311

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

作业

参考上述操作,为局内布局增加过滤条件。 提示

  1. const itemType = [
  2. { key: 0, value: '全部' },
  3. { key: 1, value: '攻击' },
  4. { key: 2, value: '法术' },
  5. { key: 3, value: '防御' },
  6. { key: 4, value: '移动' },
  7. { key: 5, value: '打野' },
  8. { key: 7, value: '辅助' },
  9. ];

参考答案:代码

2018-12-18 21.51.26.gif | center | 747x306