CartItem.jsx 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238
  1. import React, { Component } from 'react';
  2. import { Checkbox, WhiteSpace } from 'antd-mobile';
  3. import classNames from 'classnames';
  4. import './index.css'
  5. class CartItem extends Component {
  6. constructor(props){
  7. super(props);
  8. this.state={
  9. cartList:[],
  10. totalPrice:0,
  11. isSelectAll:true,
  12. selectedCount:0
  13. };
  14. }
  15. //获取数据
  16. componentWillMount(){
  17. const cartList = [
  18. {id:'1',name:'test1',count:1,img:'',price:10},
  19. {id:'2',name:'test2',count:2,img:'',price:20}
  20. ];
  21. this.setState({
  22. cartList
  23. },()=>{
  24. this.checkedAll('',true);
  25. });
  26. }
  27. //获取输入框的值
  28. getInputValue=(e,i)=>{
  29. this.setState({
  30. cartList:this.state.cartList.map((ele,index)=>{
  31. if(index===i){
  32. ele.count=e.target.value;
  33. return ele
  34. }else {
  35. return ele
  36. }
  37. })
  38. });
  39. this.sumPrice();
  40. };
  41. // 增加
  42. augment=(e,i)=>{
  43. this.setState({
  44. cartList:this.state.cartList.map((ele,index)=>{
  45. if(index===i){
  46. ele.count=ele.count*1+1;
  47. return ele
  48. }else {
  49. return ele
  50. }
  51. })
  52. });
  53. this.sumPrice()
  54. };
  55. // 减少
  56. reduce=(e,i)=> {
  57. this.setState({
  58. cartList:this.state.cartList.map((ele,index)=>{
  59. if(index===i){
  60. ele.count=ele.count*1-1;
  61. return ele
  62. }else {
  63. return ele
  64. }
  65. })
  66. });
  67. this.sumPrice();
  68. };
  69. //删除
  70. del=(e,i)=> {
  71. this.setState({
  72. cartList:this.state.cartList.filter((ele,index)=>{
  73. if(index!==i){
  74. return true
  75. }else {
  76. return false
  77. }
  78. })
  79. });
  80. setTimeout(()=>{
  81. this.sumPrice()
  82. },1)
  83. };
  84. // 改变选择
  85. changeCheckedStatus=(e,i)=>{
  86. this.setState({
  87. cartList:this.state.cartList.map((ele,index)=>{
  88. if(index===i){
  89. ele.checked=!ele.checked
  90. }
  91. return ele
  92. })
  93. });
  94. this.sumPrice();
  95. };
  96. //全选或全不选,判断全选状态
  97. checkedAll=(e,check)=>{
  98. let checked = e.target ? e.target.checked : check;
  99. if(checked===true){
  100. this.setState({
  101. cartList:this.state.cartList.map((ele,index)=>{
  102. ele.checked=true;
  103. return ele
  104. }),
  105. isSelectAll:true
  106. });
  107. }else if(checked===false){
  108. this.setState({
  109. cartList:this.state.cartList.map((ele,index)=>{
  110. ele.checked=false;
  111. return ele
  112. }),
  113. isSelectAll:false
  114. });
  115. }
  116. this.sumPrice();
  117. };
  118. //计算总合计
  119. sumPrice=()=>{
  120. let totalPrice=0,selectedCount=0;
  121. this.state.cartList.forEach((ele,index)=>{
  122. if(ele.checked===true){
  123. totalPrice+=ele.count*ele.price;
  124. selectedCount+=ele.count;
  125. }
  126. });
  127. this.setState({
  128. totalPrice,
  129. selectedCount
  130. });
  131. };
  132. //结算传值
  133. settleAccounts=()=>{
  134. let shopping=[];
  135. this.state.cartList.forEach((ele,index)=>{
  136. if(ele.checked===true){
  137. shopping.push(ele)
  138. }
  139. });
  140. console.log('shopping',shopping);
  141. window.localStorage.setItem("shopping",JSON.stringify(shopping));
  142. window.localStorage.setItem("sumprice",JSON.stringify(this.state.totalPrice));
  143. this.props.history.push('/jiesuan')
  144. };
  145. render() {
  146. return (
  147. <div className="Cart">
  148. <div className='section'>
  149. {
  150. this.state.cartList.map((ele,index)=>{
  151. return(
  152. <div key={index}>
  153. <div className="cart-list">
  154. <div className="cart-list-checkbox">
  155. <Checkbox
  156. style={{marginLeft:15}}
  157. checked={ele.checked}
  158. onChange={(e)=>{this.changeCheckedStatus(e,index)}}
  159. />
  160. </div>
  161. <div className="cart-list-image">
  162. <img src={ele.img || "https://gw.alipayobjects.com/zos/rmsportal/nywPmnTAvTmLusPxHPSu.png"} alt=""/>
  163. </div>
  164. <div className="cart-list-intro">
  165. <div>{ele.name}</div>
  166. <div>颜色尺码等</div>
  167. <div>¥ {ele.price}</div>
  168. </div>
  169. <div className="cart-list-count">
  170. <div className="selected">
  171. <button
  172. className={classNames({
  173. 'selected_button': true,
  174. 'selected_button-disabled': ele.count <= 1
  175. })}
  176. disabled={ele.count <= 1}
  177. onClick={(e)=>{this.reduce(e,index)}}
  178. >-</button>
  179. <input className="selected_input" type="text" value={ele.count} onChange={(e)=>{this.getInputValue(e,index)}}/>
  180. <button className="selected_button" onClick={(e)=>{this.augment(e,index)}}>+</button>
  181. </div>
  182. </div>
  183. </div>
  184. <WhiteSpace size="md" />
  185. </div>
  186. )
  187. })
  188. }
  189. </div>
  190. <div className="footer">
  191. <div className="jiesuan">
  192. <div className="jiesuan-checkbox">
  193. <Checkbox
  194. checked={this.state.isSelectAll}
  195. onChange={(e)=>{this.checkedAll(e,'')}}
  196. style={{marginLeft:15}}
  197. />,
  198. <span className="jiesuan-checkbox_label">全选</span>
  199. </div>
  200. <div className={classNames({
  201. 'jiesuan-total': true,
  202. 'jiesuan-disabled': !this.state.isSelectAll
  203. })}>
  204. <span>合计:</span>
  205. <span className="jiesuan-total_price">¥ {this.state.totalPrice}</span>
  206. </div>
  207. <button
  208. className={classNames({
  209. 'jiesuan-button': true,
  210. 'jiesuan-disabled': !this.state.isSelectAll
  211. })}
  212. disabled={!this.state.isSelectAll}
  213. onClick={()=>{this.settleAccounts()}}
  214. >
  215. <span>去结算({this.state.selectedCount})</span>
  216. </button>
  217. </div>
  218. </div>
  219. </div>
  220. );
  221. }
  222. }
  223. export default CartItem;