其他分享
首页 > 其他分享> > 移动端复选框自定义样式及功能实现逻辑及代码

移动端复选框自定义样式及功能实现逻辑及代码

作者:互联网

首先我们来看一下最终的实现效果:

实现的功能有:

代码实现逻辑

1.初始化数据
constructor(props) {
	super(props);
	this.state = {
		dataSource: [],		// 你的数据
		selectedIds: [],	// 用来存放选中数据的id
	}
}
2.我们的每一行数据都是通过指定的数据来循环渲染出来的,所以我们需要造一个模板用来展示数据:

复选框样式文件:
index.less

.labelStyle {
  width: 40px;
  height: 40px;
  line-height: 40px;
  display: block;
  position: relative;
  padding-left:20px;
  box-sizing: border-box;
  color: #999;

  &::after{
    content: "";
    border:1px solid #999;
    width: 20px;
    height: 20px;
    display: block;
    position: absolute;
    top: 15px;
    left: 0px;
    border-radius: 50%;
  }
  &::before{
    content:"";
    //border-radius: 50%;
    display: block;
    position: absolute;
    top: 18px;
    left: 3px;
    opacity: 0;
  }
}

label input:checked + .labelStyle:after{
  border-color: #1BC0CB;
  background-color: #1BC0CB;
}

label input:checked + .labelStyle:before{
  opacity: 1;
  transition: opacity 0.2s ease;
  border-left: 2px solid white;
  border-bottom: 2px solid white;
  width: 13px;
  height: 9px;
  transform: rotate(-45deg) translateY(2px);
  z-index: 2;
}

label input:checked + .labelStyle{
  color: #28ced4;
  transition: color 0.6s ease;
}

.visibleInput {
  display: none;
}
// 引入样式
import listStyles from './index.less';

// 根据数据反复的return出此组件,比如我们是根据dataSource生成数据
{
	dataSource.forEach(obj => {
		return (
			<div>
			  // 复选框
			  <label>
				<input
				   name="checkInput"
				   type="checkbox"
				   className={listStyles.visibleInput}
				   checked={this.state.selectedIds.includes(obj.id)}
				   onChange={() => {	// 改变复选框状态
				     const newSelectedIds = this.state.selectedIds.slice();
				     const idIndex = this.state.selectedIds.indexOf(obj.id);
				     (idIndex === -1)
				       ? newSelectedIds.push(obj.id)
				       : newSelectedIds.splice(idIndex, 1)
				     this.setState({ selectedIds: newSelectedIds });
				   }}
				 />
				 <span className={listStyles.labelStyle} />
			   </label>
			   <div>
			       // 这里放你用来展示的数据结果
			   </div>
			 </div>
		)
	})
}
3.全选复选框的功能实现:
<label>
  <input
    name="checkInput"
    type="checkbox"
    checked={this.state.selectedIds.length === this.state.dataSource.length}
    onChange={e => this.setState({ selectedIds: (e.target.checked) ? this.state.dataSource.map(item => item.id) : [] })}
    className={listStyles.visibleInput}
  />
  <span
    className={listStyles.labelStyle}
    style={{
      width: '70px',
      lineHeight: '48px',
    }}
  ><span style={{ marginLeft: '8px', letterSpacing: '2px', color: '#878787' }}>全选</span>
  </span>
</label>
4.已选中数据的数量:
<div>
	合计:<span style={{ color: '#56c1ed' }}>{this.state.selectedIds.length}</span>件明细
</div>

这样功能就都实现了,如果遇到了什么问题请在下方评论。

标签:自定义,样式,复选框,state,全选,选中,selectedIds,border
来源: https://blog.51cto.com/u_15275953/2928448