diff --git a/.gitignore b/.gitignore index 2128669e1..490e6f14e 100644 --- a/.gitignore +++ b/.gitignore @@ -5,5 +5,5 @@ yarn.lock package-lock.json .temp - -.vscode \ No newline at end of file +.DS_Store +.vscode diff --git a/package.json b/package.json index 9d1968926..aeeeebeeb 100644 --- a/package.json +++ b/package.json @@ -1,49 +1,50 @@ { - "name": "taro-ui-examples", - "version": "1.0.0", - "private": true, - "description": "", - "main": "index.js", - "scripts": { - "build:weapp": "taro build --type weapp", - "build:h5": "taro build --type h5", - "dev:weapp": "npm run build:weapp -- --watch", - "dev:h5": "npm run build:h5 -- --watch", - "test": "echo \"Error: no test specified\" && exit 1" - }, - "author": "", - "license": "MIT", - "dependencies": { - "@tarojs/components": "latest", - "@tarojs/router": "latest", - "@tarojs/taro": "latest", - "@tarojs/taro-h5": "latest", - "@tarojs/taro-weapp": "latest", - "lodash": "^4.17.10", - "nervjs": "^1.3.0" - }, - "devDependencies": { - "@tarojs/cli": "latest", - "@tarojs/plugin-babel": "latest", - "@tarojs/plugin-csso": "latest", - "@tarojs/plugin-sass": "latest", - "@tarojs/plugin-uglifyjs": "latest", - "@tarojs/webpack-runner": "latest", - "babel-eslint": "^8.2.3", - "babel-plugin-transform-class-properties": "^6.24.1", - "babel-plugin-transform-decorators-legacy": "^1.3.4", - "babel-plugin-transform-object-rest-spread": "^6.26.0", - "babel-preset-env": "^1.6.1", - "eslint": "^4.19.1", - "eslint-config-taro": "latest", - "eslint-plugin-import": "^2.12.0", - "eslint-plugin-react": "^7.8.2", - "eslint-plugin-taro": "latest", - "glob": "^7.1.2", - "gulp": "^3.9.1", - "gulp-clean": "^0.4.0", - "gulp-concat": "^2.6.1", - "gulp-sass": "^4.0.1", - "node-fs-extra": "^0.8.2" - } + "name": "taro-ui-examples", + "version": "1.0.0", + "private": true, + "description": "", + "main": "index.js", + "scripts": { + "build:weapp": "taro build --type weapp", + "build:h5": "taro build --type h5", + "dev:weapp": "npm run build:weapp -- --watch", + "dev:h5": "npm run build:h5 -- --watch", + "test": "echo \"Error: no test specified\" && exit 1" + }, + "author": "", + "license": "MIT", + "dependencies": { + "@tarojs/components": "0.0.70", + "@tarojs/router": "0.0.70", + "@tarojs/taro": "0.0.70", + "@tarojs/taro-h5": "0.0.70", + "@tarojs/taro-weapp": "0.0.70", + "lodash": "^4.17.10", + "nervjs": "^1.3.0", + "prop-types": "^15.6.2" + }, + "devDependencies": { + "@tarojs/cli": "0.0.70", + "@tarojs/plugin-babel": "0.0.70", + "@tarojs/plugin-csso": "0.0.70", + "@tarojs/plugin-sass": "0.0.70", + "@tarojs/plugin-uglifyjs": "0.0.70", + "@tarojs/webpack-runner": "0.0.70", + "babel-eslint": "^8.2.3", + "babel-plugin-transform-class-properties": "^6.24.1", + "babel-plugin-transform-decorators-legacy": "^1.3.4", + "babel-plugin-transform-object-rest-spread": "^6.26.0", + "babel-preset-env": "^1.6.1", + "eslint": "^4.19.1", + "eslint-config-taro": "0.0.70", + "eslint-plugin-import": "^2.12.0", + "eslint-plugin-react": "^7.8.2", + "eslint-plugin-taro": "0.0.70", + "glob": "^7.1.2", + "gulp": "^3.9.1", + "gulp-clean": "^0.4.0", + "gulp-concat": "^2.6.1", + "gulp-sass": "^4.0.1", + "node-fs-extra": "^0.8.2" + } } diff --git a/src/app.js b/src/app.js index bbfa355df..2cae57ab9 100644 --- a/src/app.js +++ b/src/app.js @@ -5,7 +5,7 @@ import './app.scss' class App extends Component { config = { - pages: ['pages/index/index', 'pages/toast/index'], + pages: ['pages/index/index', 'pages/toast/index', 'pages/input/index'], window: { backgroundTextStyle: 'light', navigationBarBackgroundColor: '#fff', diff --git a/src/components/Inputnumber/index.js b/src/components/Inputnumber/index.js new file mode 100644 index 000000000..1886e2c89 --- /dev/null +++ b/src/components/Inputnumber/index.js @@ -0,0 +1,67 @@ +import Taro from '@tarojs/taro' +import { View, Input } from '@tarojs/components' +import PropTypes from 'prop-types' +import './index.scss' + +/** + * @author:chenzeji + * @description 数字输入框 + * @prop value {Number} 当前输入框值 default: 1 + * @prop min {Number} 最小值 default: 0 + * @prop max {Number} 最大值 default:100 + * @prop step {Number} 每次点击改变的间隔大小 default:1 + * @prop onChange {Function} 监听事件改变函数 + */ +class AtInputNumber extends Taro.Component { + static addNum(num1, num2) { + let sq1, sq2, m; + try { + sq1 = num1.toString().split('.')[1].length; + } + catch (e) { + sq1 = 0; + } + try { + sq2 = num2.toString().split('.')[1].length; + } + catch (e) { + sq2 = 0; + } + m = Math.pow(10, Math.max(sq1, sq2)); + return (Math.round(num1 * m) + Math.round(num2 * m)) / m; + } + handleMinus(){ + let value = AtInputNumber.addNum(this.props.value, - this.props.step) + value = value > this.props.min ? value : this.props.min + this.props.onChange({ value: value }) + } + handlePlus() { + let value = AtInputNumber.addNum(this.props.value, this.props.step) + value = value < this.props.max ? value : this.props.max + this.props.onChange({ value: value }) + } + render() { + return + - + + = this.props.max ? 'at-inputnumber__btn at-inputnumber__btn--disabled' : 'at-inputnumber__btn'} onClick={this.handlePlus.bind(this)}>+ + + } +} +AtInputNumber.defaultProps = { + value: 1, + min: 0, + max: 100, + step: 1, + onChange: () => {} +} +AtInputNumber.propTypes = { + value: PropTypes.number, + min: PropTypes.number, + max: PropTypes.number, + step: PropTypes.number, + onChange: PropTypes.func +} +export default AtInputNumber diff --git a/src/components/Inputnumber/index.scss b/src/components/Inputnumber/index.scss new file mode 100644 index 000000000..8e3ed2e7e --- /dev/null +++ b/src/components/Inputnumber/index.scss @@ -0,0 +1,28 @@ +.at-inputnumber { + display: flex; + justify-content: center; + align-items: center; + border: #e5e5e5 solid 1px; + border-radius: 8px; + width: 300px; + background-color: #fff; + .at-inputnumber__btn,.at-inputnumber-text { + padding: 13px; + } + .at-inputnumber__btn { + flex:1; + text-align: center; + color: #6190e8; + cursor: pointer; + &--disabled { + color: #e5e5e5; + } + } + .at-inputnumber__input { + font-size: 30px; + flex:2; + text-align: center; + border-left: #e5e5e5 solid 1px; + border-right: #e5e5e5 solid 1px; + } +} diff --git a/src/components/actionInput/index.js b/src/components/actionInput/index.js new file mode 100644 index 000000000..63be8f7f1 --- /dev/null +++ b/src/components/actionInput/index.js @@ -0,0 +1,98 @@ +import Taro from '@tarojs/taro' +import { View, Input, Icon } from '@tarojs/components' +import PropTypes from 'prop-types' +import './index.scss' + +/** + * @author: chenzeji + * @description 带有点击动作的input输入框 + * @prop second {Number} 倒计时,单位:秒 default:60 + * @prop maxlength {Number} 输入长度最大值 default:200 + * @prop placeholder {String} 提示字符 + * @prop actionName {String} 点击操作的文案 + * @prop onChange {Function} input数据改变触发事件 + * @prop onClick {Function} 点击右边按钮触发的事件 + */ +class AtActionInput extends Taro.Component { + constructor() { + super(...arguments) + this.state = { + second: this.props.second ? parseInt(this.props.second): 60, + disabled: false + } + } + handleClick() { + if (this.state.disabled) return + + this.props.onClick() + // 使用setState 数值更新有延迟 + this.state.disabled = true + // 倒计时 + const timer = setInterval(() => { + if (this.state.second>0) { + // 使用setState 数值更新有延迟 + this.state.second-- + this.setState({ + second: this.state.second + }) + } else { + // 使用setState 数值更新有延迟 + this.state.disabled = false + this.setState({ + second: this.props.second ? parseInt(this.props.second) : 60, + disabled: false + }) + clearInterval(timer) + } + },1000) + } + clearValue() { + this.props.onChange({value:''}) + } + handleChange(e) { + this.props.onChange({ value: e.target.value }) + } + showTipText() { + return this.state.disabled ? this.state.second + 's后重试' : this.props.actionName + } + render() { + return + + + {this.props.value && this.props.value.length + ? + : null + } + {this.props.actionName + ? + {this.showTipText()} + + : null + } + + + } +} +AtActionInput.defaultProps = { + second: 60, + maxlength: 200, + placeholder: '', + actionName: '', + onClick: () => {}, + onChange: () => {} +} +AtActionInput.propTypes = { + second: PropTypes.number, + maxlength: PropTypes.number, + placeholder: PropTypes.string, + actionName: PropTypes.string, + selectedList: PropTypes.array, + onClick: PropTypes.func, + onChange: PropTypes.func +} +export default AtActionInput diff --git a/src/components/actionInput/index.scss b/src/components/actionInput/index.scss new file mode 100644 index 000000000..0e490f9c5 --- /dev/null +++ b/src/components/actionInput/index.scss @@ -0,0 +1,35 @@ +.at-actioninput { + margin:10px; + padding: 22px 0 22px 20px; + border-radius: 8px; + background-color: #f8f8f8; + display: flex; + align-items: center; + justify-content: space-between; + .at-actioninput__input { + display: inline-flex; + font-size: 28px; + min-width: 50%; + &--withoutaction { + width: 90%; + } + } + .at-actioninput__action { + display: inline-flex; + align-items: center; + justify-content: flex-end; + .at-actioninput__icon { + padding: 0 20px; + } + .at-actioninput__tip { + font-size: 24px; + display: inline-flex; + border-left: #e7e7e7 solid 1px; + padding: 0 20px; + color:#e93b3d; + &--disabled { + opacity: 0.5; + } + } + } +} diff --git a/src/components/checkbox/index.js b/src/components/checkbox/index.js new file mode 100644 index 000000000..4d39bd89a --- /dev/null +++ b/src/components/checkbox/index.js @@ -0,0 +1,52 @@ +import Taro from '@tarojs/taro' +import { View } from '@tarojs/components' +import PropTypes from 'prop-types' +import AtIcon from '../../components/icon/index' +import './index.scss' + +/** + * @author: chenzeji + * @description 多选框组件 + * @prop onChange {Function} 监听数据改变事件 + * @prop selectedList {Array} 被选中的选项列表 eg: ['苹果'] + * @prop options {Array} 选项列表 eg: [{value:'苹果',desc:'这个苹果又大又甜'}] + */ +class AtCheckbox extends Taro.Component { + handleClick(value) { + const selectedList = new Set(this.props.selectedList) + if (!selectedList.has(value)) { + selectedList.add(value) + } else { + selectedList.delete(value) + } + this.props.onChange({ value: Array.from(selectedList)}) + } + render() { + return + { + this.props.options.map(option => { + return + + + + + {option.value} + + {option.desc ? {option.desc} : null} + + }) + } + + } +} +AtCheckbox.defaultProps = { + options: [], + selectedList: [], + onChange: () => {} +} +AtCheckbox.propTypes = { + options: PropTypes.array, + selectedList: PropTypes.array, + onChange: PropTypes.func, +} +export default AtCheckbox diff --git a/src/components/checkbox/index.scss b/src/components/checkbox/index.scss new file mode 100644 index 000000000..3401f9f04 --- /dev/null +++ b/src/components/checkbox/index.scss @@ -0,0 +1,46 @@ +.at-checkbox { + background-color: #fff; + .at-checkbox__option { + padding: 13px 13px 13px 0; + margin-left: 13px; + .at-checkbox__top { + display: flex; + align-items: center; + .at-checkbox__icon { + display: inline-flex; + justify-content: center; + align-items: center; + width:36px; + height: 36px; + border-radius: 50%; + border: #6190e8 solid 3px; + background-color: #fff; + margin-right: 20px; + overflow: hidden; + &--selected { + background-color: #6190e8; + } + } + .at-checkbox__title { + display: inline-flex; + font-size: 30px; + text-align: left; + } + } + .at-checkbox__desc { + display: block; + padding-left:60px; + text-align: left; + font-size: 24px; + color: #999999; + letter-spacing: 0; + line-height: 36px; + } + } + + .at-checkbox__option + .at-checkbox__option { + border-top: #e5e5e5 solid 1px; + } +} + + diff --git a/src/components/icon/index.js b/src/components/icon/index.js new file mode 100644 index 000000000..bde00a37b --- /dev/null +++ b/src/components/icon/index.js @@ -0,0 +1,41 @@ +import Taro from '@tarojs/taro' +import { View } from '@tarojs/components' +import PropTypes from 'prop-types' +import './index.scss' +/** + * @author:chenzeji + * @description iview 图标组件,暂时为了其他组件的开发方便,临时封装 + * @prop type {String} 图标类型 eg:'collection_fill' 图标列表详细请看文档:https://weapp.iviewui.com/components/icon + * @prop size {Number|String} 图标大小 default: 30 + * @prop color {String} 图标颜色 default:#6190e8 + */ +class AtIcon extends Taro.Component { + handleClick() { + this.props.onClick(...arguments) + } + render() { + let style = `font-size: ${this.props.size}px;` + if (this.props.color) { + style += `color:${this.props.color}` + } + return + + } +} +AtIcon.defaultProps = { + color: '#6190e8', + size: '30', + onClick: () => { } +} +AtIcon.propTypes = { + color: PropTypes.string, + size: PropTypes.oneOfType([ + PropTypes.string, + PropTypes.number, + ]), + onClick: PropTypes.func +} +export default AtIcon diff --git a/src/components/icon/index.scss b/src/components/icon/index.scss new file mode 100644 index 000000000..5817bc017 --- /dev/null +++ b/src/components/icon/index.scss @@ -0,0 +1,154 @@ +@font-face { + font-family:iconfont;src:url('data:application/x-font-woff;charset=utf-8;base64,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') format('woff') + } + .at-icon { + display:inline-block; + font-family:iconfont; + speak:none; + font-style:normal; + font-weight:400; + font-variant:normal; + text-transform:none; + text-rendering:auto; + line-height:1; + -webkit-font-smoothing:antialiased; + -moz-osx-font-smoothing:grayscale; + vertical-align:middle +} +.at-icon-accessory:before{content:"\e6dd"} +.at-icon-activity:before{content:"\e6de"} +.at-icon-activity_fill:before{content:"\e6df"} +.at-icon-add:before{content:"\e6e0"} +.at-icon-addressbook_fill:before{content:"\e6e2"} +.at-icon-addressbook:before{content:"\e6e3"} +.at-icon-barrage_fill:before{content:"\e6e4"} +.at-icon-barrage:before{content:"\e6e5"} +.at-icon-browse_fill:before{content:"\e6e6"} +.at-icon-browse:before{content:"\e6e7"} +.at-icon-brush:before{content:"\e6e8"} +.at-icon-brush_fill:before{content:"\e6e9"} +.at-icon-businesscard_fill:before{content:"\e6ea"} +.at-icon-businesscard:before{content:"\e6eb"} +.at-icon-camera_fill:before{content:"\e6ec"} +.at-icon-camera:before{content:"\e6ed"} +.at-icon-clock_fill:before{content:"\e6ee"} +.at-icon-clock:before{content:"\e6ef"} +.at-icon-close:before{content:"\e6f0"} +.at-icon-collection_fill:before{content:"\e6f1"} +.at-icon-collection:before{content:"\e6f2"} +.at-icon-computer_fill:before{content:"\e6f3"} +.at-icon-computer:before{content:"\e6f4"} +.at-icon-coordinates_fill:before{content:"\e6f5"} +.at-icon-coordinates:before{content:"\e6f6"} +.at-icon-coupons_fill:before{content:"\e6f7"} +.at-icon-coupons:before{content:"\e6f8"} +.at-icon-createtask_fill:before{content:"\e6f9"} +.at-icon-createtask:before{content:"\e6fa"} +.at-icon-customerservice_fill:before{content:"\e6fb"} +.at-icon-customerservice:before{content:"\e6fc"} +.at-icon-delete_fill:before{content:"\e6fd"} +.at-icon-delete:before{content:"\e6fe"} +.at-icon-document:before{content:"\e6ff"} +.at-icon-document_fill:before{content:"\e700"} +.at-icon-dynamic_fill:before{content:"\e701"} +.at-icon-dynamic:before{content:"\e702"} +.at-icon-editor:before{content:"\e703"} +.at-icon-eit:before{content:"\e704"} +.at-icon-emoji_fill:before{content:"\e705"} +.at-icon-emoji:before{content:"\e706"} +.at-icon-enter:before{content:"\e707"} +.at-icon-enterinto:before{content:"\e708"} +.at-icon-enterinto_fill:before{content:"\e709"} +.at-icon-feedback_fill:before{content:"\e70a"} +.at-icon-feedback:before{content:"\e70b"} +.at-icon-flag_fill:before{content:"\e70c"} +.at-icon-flag:before{content:"\e70d"} +.at-icon-flashlight:before{content:"\e70e"} +.at-icon-flashlight_fill:before{content:"\e70f"} +.at-icon-fullscreen:before{content:"\e710"} +.at-icon-group:before{content:"\e711"} +.at-icon-group_fill:before{content:"\e712"} +.at-icon-homepage_fill:before{content:"\e713"} +.at-icon-homepage:before{content:"\e714"} +.at-icon-integral_fill:before{content:"\e715"} +.at-icon-integral:before{content:"\e716"} +.at-icon-interactive_fill:before{content:"\e717"} +.at-icon-interactive:before{content:"\e718"} +.at-icon-keyboard:before{content:"\e719"} +.at-icon-label:before{content:"\e71a"} +.at-icon-label_fill:before{content:"\e71b"} +.at-icon-like_fill:before{content:"\e71c"} +.at-icon-like:before{content:"\e71d"} +.at-icon-live_fill:before{content:"\e71e"} +.at-icon-live:before{content:"\e71f"} +.at-icon-lock_fill:before{content:"\e720"} +.at-icon-lock:before{content:"\e721"} +.at-icon-mail:before{content:"\e722"} +.at-icon-mail_fill:before{content:"\e723"} +.at-icon-message:before{content:"\e724"} +.at-icon-message_fill:before{content:"\e725"} +.at-icon-mine:before{content:"\e726"} +.at-icon-mine_fill:before{content:"\e727"} +.at-icon-mobilephone_fill:before{content:"\e728"} +.at-icon-mobilephone:before{content:"\e729"} +.at-icon-more:before{content:"\e72a"} +.at-icon-narrow:before{content:"\e72b"} +.at-icon-offline_fill:before{content:"\e72c"} +.at-icon-offline:before{content:"\e72d"} +.at-icon-other:before{content:"\e72e"} +.at-icon-picture_fill:before{content:"\e72f"} +.at-icon-picture:before{content:"\e730"} +.at-icon-play:before{content:"\e731"} +.at-icon-play_fill:before{content:"\e732"} +.at-icon-playon_fill:before{content:"\e733"} +.at-icon-playon:before{content:"\e734"} +.at-icon-praise_fill:before{content:"\e735"} +.at-icon-praise:before{content:"\e736"} +.at-icon-prompt_fill:before{content:"\e737"} +.at-icon-prompt:before{content:"\e738"} +.at-icon-redpacket_fill:before{content:"\e739"} +.at-icon-redpacket:before{content:"\e73a"} +.at-icon-refresh:before{content:"\e73b"} +.at-icon-remind_fill:before{content:"\e73c"} +.at-icon-remind:before{content:"\e73d"} +.at-icon-return:before{content:"\e73e"} +.at-icon-right:before{content:"\e73f"} +.at-icon-scan:before{content:"\e740"} +.at-icon-send:before{content:"\e741"} +.at-icon-service_fill:before{content:"\e742"} +.at-icon-service:before{content:"\e743"} +.at-icon-setup_fill:before{content:"\e744"} +.at-icon-setup:before{content:"\e745"} +.at-icon-share_fill:before{content:"\e746"} +.at-icon-share:before{content:"\e747"} +.at-icon-success_fill:before{content:"\e748"} +.at-icon-success:before{content:"\e749"} +.at-icon-suspend:before{content:"\e74a"} +.at-icon-switch:before{content:"\e74b"} +.at-icon-systemprompt_fill:before{content:"\e74c"} +.at-icon-systemprompt:before{content:"\e74d"} +.at-icon-tailor:before{content:"\e74e"} +.at-icon-task:before{content:"\e74f"} +.at-icon-task_fill:before{content:"\e750"} +.at-icon-tasklist_fill:before{content:"\e751"} +.at-icon-tasklist:before{content:"\e752"} +.at-icon-time_fill:before{content:"\e753"} +.at-icon-time:before{content:"\e754"} +.at-icon-translation_fill:before{content:"\e755"} +.at-icon-translation:before{content:"\e756"} +.at-icon-trash:before{content:"\e757"} +.at-icon-trash_fill:before{content:"\e758"} +.at-icon-undo:before{content:"\e759"} +.at-icon-video:before{content:"\e75a"} +.at-icon-video_fill:before{content:"\e75b"} +.at-icon-warning_fill:before{content:"\e75c"} +.at-icon-warning:before{content:"\e75d"} +.at-icon-search:before{content:"\e75e"} +.at-icon-searchfill:before{content:"\e75f"} +.at-icon-publishgoods_fill:before{content:"\e760"} +.at-icon-shop_fill:before{content:"\e761"} +.at-icon-transaction_fill:before{content:"\e762"} +.at-icon-packup:before{content:"\e763"} +.at-icon-unfold:before{content:"\e764"} +.at-icon-financial_fill:before{content:"\e765"} +.at-icon-commodity:before{content:"\e766"} diff --git a/src/components/input/index.js b/src/components/input/index.js new file mode 100644 index 000000000..9a9032ebe --- /dev/null +++ b/src/components/input/index.js @@ -0,0 +1,51 @@ +import Taro from '@tarojs/taro' +import { View, Input, Label } from '@tarojs/components' +import './index.scss' +import PropTypes from 'prop-types' +import AtIcon from '../../components/icon/index' + +/** + * @author:chenzeji + * @description 单行输入框 + * @prop placeholder {String} 提示字符 + * @prop maxlength {Number} 最大长度 + * @prop type {String} 图标类型 eg:'collection_fill' 图标列表详细请看文档:https://weapp.iviewui.com/components/icon + * @prop size {Number|String} 图标大小 default: 30 + * @prop color {String} 图标颜色 default:#6190e8 + */ +class AtInput extends Taro.Component { + handleInput(e) { + this.props.onChange(e) + } + handleFocus(e) { + this.props.onFocus(e) + } + render() { + return + + + + + + + } +} +AtInput.defaultProps = { + color: '#6190e8', + size: '30', + onClick: () => { } +} +AtInput.propTypes = { + color: PropTypes.string, + + onChange: PropTypes.func, + onFocus: PropTypes.func +} +export default AtInput diff --git a/src/components/input/index.scss b/src/components/input/index.scss new file mode 100644 index 000000000..56262c329 --- /dev/null +++ b/src/components/input/index.scss @@ -0,0 +1,36 @@ +.at-input { + background-color: #fff; + + .at-input .at-input_border { + border-top: #e9eaec solid 1px; + } + .at-input_border { + padding: 22px 0; + margin-left:22px; + display: flex; + align-items: center; + } + .at-input__label { + flex:2; + margin-right:20px; + font-size: 28px; + vertical-align: middle; + text-align: left; + } + .at-input__input { + flex:5; + font-size: 24px; + display: inline-block; + vertical-align: middle; + } + .at-input__icon { + flex:1; + text-align: center; + visibility: hidden; + } + &--error { + color:#e93b3d; + .at-input__icon { + visibility: visible; + } + } +} diff --git a/src/components/input2/index.js b/src/components/input2/index.js new file mode 100644 index 000000000..733cc4791 --- /dev/null +++ b/src/components/input2/index.js @@ -0,0 +1,89 @@ +import Taro from '@tarojs/taro' +import { View, Input, Icon } from '@tarojs/components' +import './index.scss' +/** + * second 倒计时秒 + * onChange 函数,处理value 值的变化 + * onClick 函数,处理点击事件的变化 + * maxlength 输入长度最大值 + * type ? + * placeholder 提示字符 + * actionName 操作名称 点击触发 onClick 函数 + */ +export default class AtSingleInput extends Taro.Component { + constructor() { + super(...arguments) + this.state = { + second: this.props.second ? parseInt(this.props.second): 60, + disabled: false + } + } + handleClick() { + if (this.state.disabled) { + return + } + if (this.props.onClick) { + this.props.onClick() + // 使用setState 数值更新有延迟 + this.state.disabled = true + const timer = setInterval(()=>{ + if (this.state.second>0) { + // 使用setState 数值更新有延迟 + this.state.second-- + this.setState({ + second: this.state.second + }) + } else { + // 使用setState 数值更新有延迟 + this.state.disabled = false + this.setState({ + second: this.props.second ? parseInt(this.props.second) : 60, + disabled: false + }) + clearInterval(timer) + } + },1000) + } else { + throw Error('请传入 onClick 函数') + } + } + clearValue() { + if (this.props.onChange) { + this.props.onChange({value:''}) + } else { + throw Error('请传入 onChange 函数') + } + } + handleChange(e) { + if (this.props.onChange) { + this.props.onChange({ value: e.target.value }) + } else { + throw Error('请传入 onChange 函数') + } + } + showTipText() { + return this.state.disabled ? this.state.second + 's后重试' : this.props.actionName + } + render() { + return + + + {this.props.value && this.props.value.length + ? + : null + } + {this.props.actionName + ? + {this.showTipText()} + + : null + } + + + } +} diff --git a/src/components/input2/index.scss b/src/components/input2/index.scss new file mode 100644 index 000000000..cb6ce59f0 --- /dev/null +++ b/src/components/input2/index.scss @@ -0,0 +1,36 @@ +.at-singleinput { + margin:10px; + padding: 22px 0 22px 20px; + border-radius: 8px; + background-color: #f8f8f8; + display: flex; + align-items: center; + justify-content: space-between; + .at-singleinput__input { + display: inline-flex; + font-size: 28px; + min-width: 50%; + } + .at-singleinput__input.at-singleinput__input--withoutaction { + width: 90%; + } + .at-singleinput_action { + display: inline-flex; + align-items: center; + justify-content: flex-end; + .at-singleinput__icon { + padding: 0 20px; + } + .at-singleinput_tip { + font-size: 24px; + display: inline-flex; + border-left: #e7e7e7 solid 1px; + padding: 0 20px; + color:#e93b3d; + } + .at-singleinput_tip-disabled { + opacity: 0.5; + } + } + +} diff --git a/src/components/radio/index.js b/src/components/radio/index.js new file mode 100644 index 000000000..cf5583181 --- /dev/null +++ b/src/components/radio/index.js @@ -0,0 +1,43 @@ +import Taro from '@tarojs/taro' +import { View } from '@tarojs/components' +import PropTypes from 'prop-types' +import AtIcon from '../../components/icon/index' +import './index.scss' + +/** + * @author:chenzeji + * @description 单选框 + * @prop value {String} 当前单选框值 + * @prop options {Array} 选项列表 eg:['苹果'] + * @prop onChange {Function} 监听事件改变函数 + */ +class AtRadio extends Taro.Component { + handleClick(option) { + this.props.onClick && this.props.onClick({ value: option}) + } + render() { + return + { + this.props.options.map(option => { + return + {option.toString()} + + + + + }) + } + + } +} +AtRadio.defaultProps = { + value: '', + options: [], + onChange: () => {} +} +AtRadio.propTypes = { + value: PropTypes.string, + options: PropTypes.array, + onChange: PropTypes.func, +} +export default AtRadio diff --git a/src/components/radio/index.scss b/src/components/radio/index.scss new file mode 100644 index 000000000..c5d64068c --- /dev/null +++ b/src/components/radio/index.scss @@ -0,0 +1,27 @@ +.at-radio { + background-color: #fff; + .at-radio__option { + display: flex; + padding: 13px 13px 13px 0; + margin-left: 13px; + align-items: center; + &--selected { + .at-radio__icon { + visibility: visible!important; + } + } + .at-radio__icon { + flex:1; + text-align: right; + visibility: hidden; + } + .at-radio__title { + flex:6; + font-size: 30px; + text-align: left; + } + } + .at-radio__option + .at-radio__option { + border-top: #e5e5e5 solid 1px; + } +} diff --git a/src/components/rate/index.js b/src/components/rate/index.js new file mode 100644 index 000000000..46de6b1b2 --- /dev/null +++ b/src/components/rate/index.js @@ -0,0 +1,52 @@ +import Taro from '@tarojs/taro' +import { View } from '@tarojs/components' +import PropTypes from 'prop-types' +import AtIcon from '../../components/icon/index' +import './index.scss' + +/** + * @author: chenzeji + * @description 评分组件 + * @prop size {Number|String} 评分星星大小 default:30 + * @prop value {Number} 当前评分 default:0 + * @prop max {Number} 最大评分 default:5 + * @prop onChange {Function} 监听函数,数值改变时触发 + */ +class AtRate extends Taro.Component { + handleClick(i) { + this.props.onChange && this.props.onChange({value:i+1}) + } + // 暂不实现touchmove,等taro新版本 + // handleTouchMove(e) { + // } + render() { + // 生成星星颜色数组,方便在jsx中直接map + const rateArr = [] + for(let i=0;i < this.props.max;i++) { + if (this.props.value > i) { + rateArr.push('#ffca3e') + } else { + rateArr.push('#ececec') + } + } + return + {rateArr.map((color, i) => )} + + } +} +AtRate.defaultProps = { + size: 30, + value: 0, + max: 5, + onChange: () => {} +} +AtRate.propTypes = { + size: PropTypes.oneOfType([ + PropTypes.string, + PropTypes.number, + ]), + value: PropTypes.number, + max: PropTypes.number, + onChange: PropTypes.func +} +export default AtRate diff --git a/src/components/rate/index.scss b/src/components/rate/index.scss new file mode 100644 index 000000000..5ec0b0346 --- /dev/null +++ b/src/components/rate/index.scss @@ -0,0 +1,3 @@ +.at-rate,.at-rate__icon{ + display: inline-block; +} diff --git a/src/components/switch/index.js b/src/components/switch/index.js new file mode 100644 index 000000000..ec705b9dc --- /dev/null +++ b/src/components/switch/index.js @@ -0,0 +1,38 @@ +import Taro from '@tarojs/taro' +import { View, Switch } from '@tarojs/components' +import PropTypes from 'prop-types' +import './index.scss' + +/** + * @author: chenzeji + * @description 开关组件 + * @prop title {String} 选项名 + * @prop checked {Boolean} 是否显示开启 default:false + * @prop onChange {Function} 监听函数,数值改变时触发 + */ +class AtSwitch extends Taro.Component { + handleChange(e) { + this.props.onChange({value:e.detail.value}) + } + render() { + return + {this.props.title} + { + this.props.checked + ? + : + } + + } +} +AtSwitch.defaultProps = { + title: '', + checked: false, + onChange: () => {} +} +AtSwitch.propTypes = { + title: PropTypes.string, + checked: PropTypes.bool, + onChange: PropTypes.func +} +export default AtSwitch diff --git a/src/components/switch/index.scss b/src/components/switch/index.scss new file mode 100644 index 000000000..198c8e47b --- /dev/null +++ b/src/components/switch/index.scss @@ -0,0 +1,20 @@ +.at-switch { + display: flex; + justify-content: center; + align-items: center; + background-color: #fff; + padding: 22px 22px 22px 0; + .at-switch__title { + flex:6; + font-size: 30px; + margin-left:22px; + } + .at-switch__switch { + flex:2; + text-align: right; + background-color: #fff; + } +} +.at-switch + .at-switch { + border-top: #e5e5e5 solid 1px; +} diff --git a/src/components/textarea/index.js b/src/components/textarea/index.js new file mode 100644 index 000000000..32662287b --- /dev/null +++ b/src/components/textarea/index.js @@ -0,0 +1,45 @@ +import Taro from '@tarojs/taro' +import { View, Textarea } from '@tarojs/components' +import PropTypes from 'prop-types' +import './index.scss' + +/** + * @author: chenzeji + * @description 多行文本输入框组件 + * @prop value {String} 输入框当前值 + * @prop maxlength {Number|String} 最大长度 default:200 + * @prop placeholder {String} 提示 + * @prop onChange {Function} 监听函数,数值改变时触发 + */ +class AtTextarea extends Taro.Component { + handleInput(e) { + this.props.onChange(e) + } + render() { + return +