React实战(6)——复选框多选组件

2020-03-13  本文已影响0人  wayne1125

1、需求描述

image.png

2、父组件 UserList.js

import CheckboxMulti from '@/components/CheckboxMulti';
const ownerList = [
  {
    value: 0,
    label: '性别',
  },
  {
    value: 0,
    label: '年龄',
  },
  {
    value: 0,
    label: '身高',
  },
  {
    value: 0,
    label: '体重',
  },
  {
    value: 0,
    label: '体质',
  },
  {
    value: 0,
    label: '心理测试',
  },
  {
    value: 0,
    label: '体检信息',
  },
];
const remindList = [
  {
    value: 0,
    label: '体质测试',
  },
  {
    value: 0,
    label: '生活习惯',
  },
  {
    value: 0,
    label: '心理测试',
  },
  {
    value: 0,
    label: '体检',
  },
  {
    value: 0,
    label: '体重',
  },
  {
    value: 0,
    label: '血压值',
  },
];
class UseList extends PureComponent {
  state = {
    checkboxOwnerList: ownerList,
    checkboxRemindList: remindList,
    checkboxCheckArry: [0, 0, 0, 0, 0, 0, 0, 0],
    healthyServiceType: undefined,
  }
  componentDidMount() {
    const {
      location: {
        query: {
          healthType,
          subType,
          checkArry,
        },
      },
    } = this.props;
    const {
      checkboxOwnerList,
      checkboxRemindList,
    } = this.state;
    if (healthType && healthType === '1') {
      const tempList = deepClone(checkboxOwnerList);
      if (subType === '1') {
        tempList.forEach((item, index) => {
          if (index < 4) {
            item.value = 2;
          }
        });
      } else if (subType > 1 && subType < 6) {
        tempList[Number(subType) + 2].value = 1;
      }
      this.setState(
        {
          healthyServiceType: '1',
          checkboxOwnerList: tempList,
          checkboxCheckArry: JSON.parse(checkArry),
        },
        () => {
          this.initData();
        },
      );
    } else if (healthType && healthType === '2') {
      const tempList = deepClone(checkboxRemindList);
      tempList[subType - 1].value = 1;
      this.setState(
        {
          healthyServiceType: '2',
          checkboxRemindList: tempList,
          checkboxCheckArry: JSON.parse(checkArry),
        },
        () => {
          // 表格列表查询
          this.initData();
        },
      );
    } else {
      this.initData();
    }
  }

  changeOwnerCheck = list => {
    // deepClone是深拷贝方法,防止数据改变render不执行
    const tempList = deepClone(list);
    this.setState(
      {
        checkboxOwnerList: tempList,
      },
      () => {
        this.state.checkboxCheckArry = [];
        this.state.checkboxOwnerList.forEach(item => {
          this.state.checkboxCheckArry.push(item.value);
        });
      },
    );
  };

  changeRemindCheck = list => {
    const tempList = deepClone(list);
    this.setState(
      {
        checkboxRemindList: tempList,
      },
      () => {
        this.state.checkboxCheckArry = [];
        this.state.checkboxRemindList.forEach(item => {
          this.state.checkboxCheckArry.push(item.value);
        });
      },
    );
  };

  render() {
    const {
      checkboxOwnerList,
      checkboxRemindList,
      healthyServiceType,
    } = this.state;
    return (
      <div>
        <FormItem label="健康服务类型">
          {getFieldDecorator('healthyServiceType', {
            initialValue: healthyServiceType,
          })(
            <Select
              placeholder="请选择"
              style={{ width: '100%' }}
              showSearch
              onChange={this.healthOnChange}
            >
              <Option value="1">补充业主信息</Option>
              <Option value="2">提醒更新信息</Option>
            </Select>,
          )}
        </FormItem>
        <div></div>
        <FormItem style={{ display: healthyServiceType === '1' ? '' : 'none' }} label="缺失信息">
          <CheckboxMulti
            checkboxList={checkboxOwnerList}
            changeCheck={this.changeOwnerCheck}
          ></CheckboxMulti>
        </FormItem>
        <FormItem style={{ display: healthyServiceType === '2' ? '' : 'none' }} label="过期信息">
          <CheckboxMulti
            checkboxList={checkboxRemindList}
            changeCheck={this.changeRemindCheck}
          ></CheckboxMulti>
        </FormItem>
      </div>
    )
  }
}

3、子组件CheckboxMulti.js

import React, { PureComponent } from 'react';
import select0 from '@/assets/select_0.png';
import select1 from '@/assets/select_1.png';
import select2 from '@/assets/select_2.png';
import styles from './index.less';

import { deepClone } from '@/utils/utils';

class CheckboxMulti extends PureComponent {
  changeStatus = index => {
    const { checkboxList, changeCheck } = this.props;
    const tempList = deepClone(checkboxList);
    let tempIndex = 0;
    // 0 - 未选中, 1 - 且选中, 2 - 或选中
    if (checkboxList[index].value === 0) {
      tempIndex = 1;
    } else if (checkboxList[index].value === 1) {
      tempIndex = 2;
    } else if (checkboxList[index].value === 2) {
      tempIndex = 0;
    }
    tempList[index].value = tempIndex;
    changeCheck(tempList);
  };

  imgFilter = value => {
    let src = select2;
    if (value === 0) {
      src = select0;
    } else if (value === 1) {
      src = select1;
    }
    return src;
  };

  render() {
    const { checkboxList } = this.props;
    return (
      <div className={styles.list}>
        {checkboxList.map((item, index) => (
          <span className={styles.item} key={item.label}>
            <img src={this.imgFilter(item.value)} onClick={() => this.changeStatus(index)} alt="" />
            <i>{item.label}</i>
          </span>
        ))}
      </div>
    );
  }
}

export default CheckboxMulti;

.list {
  display: flex;
  align-items: center;
  .item {
    margin-right: 8px;
    color: rgba(0, 0, 0, 0.65);
    line-height: 40px;
    img {
      width: 16px;
      height: 16px;
    }
    i {
      margin: 0 8px 0 5px;
      font-style: normal;
    }
  }
}
上一篇下一篇

猜你喜欢

热点阅读