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
+
+ {this.props.value.length}/{this.props.maxlength}
+
+ }
+}
+AtTextarea.defaultProps = {
+ value: '',
+ maxlength: 200,
+ placeholder: '',
+ onChange: () => {}
+}
+AtTextarea.propTypes = {
+ value: PropTypes.string,
+ maxlength: PropTypes.oneOfType([
+ PropTypes.string,
+ PropTypes.number
+ ]),
+ placeholder: PropTypes.string,
+ onChange: PropTypes.func
+}
+export default AtTextarea
diff --git a/src/components/textarea/index.scss b/src/components/textarea/index.scss
new file mode 100644
index 000000000..e0d09f79b
--- /dev/null
+++ b/src/components/textarea/index.scss
@@ -0,0 +1,14 @@
+.at-textarea {
+ background-color: #fff;
+ font-size: 28px;
+ padding: 30px 25px;
+ .at-textarea__textarea {
+ height: 168px;
+ }
+ .at-textarea_bottom {
+ width: 100%;
+ text-align: right;
+ font-size: 24px;
+ color: #cccccc;
+ }
+}
diff --git a/src/pages/index/index.scss b/src/pages/index/index.scss
index 92ac8fb49..6188fb49d 100644
--- a/src/pages/index/index.scss
+++ b/src/pages/index/index.scss
@@ -1,77 +1,89 @@
-.index-page {
- background-color: #f8f8f8;
-}
+// .index-page {
+// background-color: #f8f8f8;
+// }
-.page-header {
- padding: 40px;
- padding-top: 80px;
- text-align: center;
-}
+// .page-header {
+// padding: 40px;
+// padding-top: 80px;
+// text-align: center;
+// }
-.page-body {
- padding: 40px;
-}
+// .page-body {
+// padding: 40px;
+// }
-.component-group {
- font-size: 32px;
-}
+// .component-group {
+// font-size: 32px;
+// }
-.group-item {
- padding: 0 30px;
- margin: 20px 0;
- background-color: #ffffff;
- border-radius: 4px;
- overflow: hidden;
- &:first-child {
- margin-top: 0;
- }
-}
+// .group-item {
+// padding: 0 30px;
+// margin: 20px 0;
+// background-color: #ffffff;
+// border-radius: 4px;
+// overflow: hidden;
+// &:first-child {
+// margin-top: 0;
+// }
+// }
-.group-info {
- padding: 30px 0;
- display: flex;
- align-items: center;
- transition: opacity 0.3s;
- &-title {
- opacity: 0.5;
- }
-}
+// .group-info {
+// padding: 30px 0;
+// display: flex;
+// align-items: center;
+// transition: opacity 0.3s;
+// &-title {
+// opacity: 0.5;
+// }
+// }
-.group-list {
- font-size: 28px;
- .list-component {
- padding: 20px 0;
- position: relative;
- align-items: center;
- &:before {
- content: " ";
- position: absolute;
- left: 0;
- top: 0;
- right: 0;
- height: 1px;
- border-top: 1px solid #d8d8d8;
- color: #d8d8d8;
- }
- &:first-child::before {
- display: none;
- }
+// .group-list {
+// font-size: 28px;
+// .list-component {
+// padding: 20px 0;
+// position: relative;
+// align-items: center;
+// &:before {
+// content: " ";
+// position: absolute;
+// left: 0;
+// top: 0;
+// right: 0;
+// height: 1px;
+// border-top: 1px solid #d8d8d8;
+// color: #d8d8d8;
+// }
+// &:first-child::before {
+// display: none;
+// }
- &-info {
- width: 100%;
- }
+// &-info {
+// width: 100%;
+// }
- &-arrow {
- display: inline-block;
- height: 18px;
- width: 18px;
- border-width: 2px 2px 0 0;
- border-color: #888888;
- border-style: solid;
- transform: matrix(0.71, 0.71, -0.71, 0.71, 0, 0) translate(-50%);
- position: absolute;
- top: 50%;
- right: 0;
- }
+// &-arrow {
+// display: inline-block;
+// height: 18px;
+// width: 18px;
+// border-width: 2px 2px 0 0;
+// border-color: #888888;
+// border-style: solid;
+// transform: matrix(0.71, 0.71, -0.71, 0.71, 0, 0) translate(-50%);
+// position: absolute;
+// top: 50%;
+// right: 0;
+// }
+// }
+// }
+.index-page {
+ background-color: #f8f8f8;
+ min-height: 100px;
+ padding: 30px 10px;
+ .single {
+ margin-bottom: 10px;
+ }
+ .single-input {
+ background-color: #fff;
+ padding: 10px;
}
}
diff --git a/src/pages/input/index.js b/src/pages/input/index.js
new file mode 100644
index 000000000..69cb6836c
--- /dev/null
+++ b/src/pages/input/index.js
@@ -0,0 +1,120 @@
+import Taro from '@tarojs/taro'
+import { View } from '@tarojs/components'
+
+import AtInput from '../../components/input/index'
+import AtActionInput from '../../components/actionInput/index'
+import AtTextarea from '../../components/textarea/index'
+import AtIcon from '../../components/icon/index'
+import AtInputNumber from '../../components/inputnumber/index'
+import AtRadio from '../../components/radio/index'
+import AtCheckbox from '../../components/checkbox/index'
+import AtSwitch from '../../components/switch/index'
+import AtRate from '../../components/rate/index'
+import './index.scss'
+
+export default class Index extends Taro.Component {
+ config = {
+ navigationBarTitleText: 'Taro UI'
+ }
+ constructor() {
+ super(...arguments)
+ this.state = {
+ inputValue: '初始值',
+ number: 1,
+ textareaValue: '',
+ rateValue: 3,
+ switchValue: false,
+ radioValue: '',
+ radioOptions: ['鸡', '鸭', '鹅'],
+ checkedList: ['鸡'],
+ checkboxOption: [{ value: '鸡', desc: '鸡肉好吃' }, { value: '鸭', desc: '鸭肉好吃' }, { value: '鹅' }]
+ }
+ }
+ handleRadioChange(detail) {
+ this.setState({
+ radioValue: detail.value
+ })
+ }
+ handleSwitchChange(detail) {
+ this.setState({
+ switchValue: detail.value
+ })
+ }
+ handleRateChange(detail) {
+ this.setState({
+ rateValue: detail.value
+ })
+ }
+ handleNumberChange(detail) {
+ this.setState({
+ number: detail.value
+ })
+ }
+ handleInput(e) {
+ this.setState({
+ inputValue: e.target.value
+ })
+ }
+ handleChange(detail) {
+ this.setState({
+ inputValue: detail.value
+ })
+ }
+ handleClick() {
+ Taro.showToast({
+ title: '已发送验证码',
+ icon: 'success',
+ duration: 2000
+ })
+ }
+ handleTextAreaChange(e) {
+ this.setState({
+ textareaValue: e.target.value
+ })
+ }
+ handleCheckboxChange(detail) {
+ this.setState({
+ checkedList: detail.value
+ })
+ }
+ render() {
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ sdf:
+
+
+
+
+
+
+
+
+
+
+
+ )
+ }
+}
diff --git a/src/pages/input/index.scss b/src/pages/input/index.scss
new file mode 100644
index 000000000..5a38f0940
--- /dev/null
+++ b/src/pages/input/index.scss
@@ -0,0 +1,12 @@
+.index-page {
+ background-color: #f8f8f8;
+ min-height: 100px;
+ padding: 30px 10px;
+ .single {
+ margin-bottom: 10px;
+ }
+ .single-input {
+ background-color: #fff;
+ padding: 10px;
+ }
+}
diff --git a/src/pages/toast/index.js b/src/pages/toast/index.js
index e93d80ff5..02b0af1d3 100644
--- a/src/pages/toast/index.js
+++ b/src/pages/toast/index.js
@@ -16,27 +16,19 @@ export default class Index extends Taro.Component {
render() {
return (
-
+
Toast
-
+
Modal
-
+
Start Loading
-
+
Cancle Loading
-
+
Action Sheet