1
0

page.js 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. import React from 'react';
  2. import './index.less';
  3. import { Tabs } from 'antd-mobile';
  4. import Page from '@src/containers/Page';
  5. import Money from '../../../components/Money';
  6. import Button from '../../../components/Button';
  7. import { FAQItem, CommentItem } from '../../../components/Item';
  8. import { Course } from '../../../stores/course';
  9. import { Order } from '../../../stores/order';
  10. import Icon from '../../../components/Icon';
  11. export default class extends Page {
  12. initState() {
  13. return { tab: 'serviceContent', number: 1 };
  14. }
  15. initData() {
  16. const { id } = this.params;
  17. Course.get(id).then(result => {
  18. this.setState({ data: result });
  19. this.changeNumber(1);
  20. });
  21. }
  22. changeNumber(number) {
  23. const { data } = this.state;
  24. const price = data.price * number;
  25. this.setState({ number, price });
  26. }
  27. buy() {
  28. const { number } = this.state;
  29. Order.speedPay({ productType: 'course', productId: this.params.id, number });
  30. }
  31. renderText() {
  32. const { tab, data } = this.state;
  33. let content;
  34. switch (tab) {
  35. case 'serviceContent':
  36. case 'crowdContent':
  37. case 'processContent':
  38. content = <div dangerouslySetInnerHTML={{ __html: data[tab] }} />;
  39. break;
  40. case 'faq':
  41. content = <div>{(data.faqs || []).map(row => <FAQItem data={row} />)}</div>;
  42. break;
  43. case 'comment':
  44. content = <div>{(data.comments || []).map(row => <CommentItem data={row} />)}</div>;
  45. break;
  46. default:
  47. break;
  48. }
  49. return content;
  50. }
  51. renderView() {
  52. const { data = {}, tab, number, price } = this.state;
  53. return (
  54. <div>
  55. <div className="b-g" style={{ backgroundImage: `url(${data.cover})` }}>
  56. <div className="title">{data.title}</div>
  57. </div>
  58. {/* <div className="tip">访问{PcUrl}/course/detail/{data.id},试听该课程</div> */}
  59. <div className="detail">
  60. <Tabs
  61. page={tab}
  62. tabs={[
  63. { title: '服务介绍', key: 'serviceContent' },
  64. { title: '适合人群', key: 'crowdContent' },
  65. { title: '授课流程', key: 'processContent' },
  66. { title: 'FAQs', key: 'faq' },
  67. { title: '用户评价', key: 'comment' },
  68. ]}
  69. onChange={(value) => {
  70. this.setState({ tab: value.key });
  71. }}
  72. />
  73. {this.renderText()}
  74. </div>
  75. <div className="fixed">
  76. <div className="action">
  77. <div className="minus" onClick={() => this.changeNumber(number === 1 ? number : number - 1)}>
  78. <Icon type="minus" />
  79. </div>
  80. <div className="num">{number}</div>
  81. <div className="add" onClick={() => this.changeNumber(number + 1)}>
  82. <Icon type="plus" />
  83. </div>
  84. </div>
  85. <div className="fee">
  86. 总额: <Money value={price} size="lager" />
  87. </div>
  88. <Button width={110} className="f-r" radius onClick={() => {
  89. this.buy();
  90. }}>
  91. 立即购买
  92. </Button>
  93. </div>
  94. </div>
  95. );
  96. }
  97. }