diff --git a/src/app.js b/src/app.js index 5d4cdad7f..cda30cafb 100644 --- a/src/app.js +++ b/src/app.js @@ -29,7 +29,8 @@ class App extends Component { 'pages/navigation/timeline/index', 'pages/navigation/drawer/index', 'pages/navigation/tabs/index', - 'pages/navigation/tab-bar/index' + 'pages/navigation/tab-bar/index', + 'pages/navigation/segmented-control/index' // 'pages/layout/flex/index' // 'pages/layout/grid/index', // 'pages/layout/float-layout/index', diff --git a/src/components/segmented-control/index.js b/src/components/segmented-control/index.js new file mode 100644 index 000000000..157315cd7 --- /dev/null +++ b/src/components/segmented-control/index.js @@ -0,0 +1,64 @@ +import Taro from '@tarojs/taro' +import { View } from '@tarojs/components' +import PropTypes from 'prop-types' +import './index.scss' + +/** + * @author:chenzeji + * @description segmented control 分段器组件 + * @prop current {Number} 当前选中的tab index值,从0计数,default:0 + * @prop color {String} 背景颜色与选中标签字体的颜色,default:#fff + * @prop selectedColor {String} 选中的标签背景色与边框颜色,default:#6190E8 + * @prop tabList {Array} tab 列表 eg: [{ title: '标签页1' }, { title: '标签页2' }] + * @prop disabled {Boolean} 是否禁止点击 default:false + * @prop fontSize {String|Number} 字体大小,目前单位是px,等taro支持单位转化再修改 default:'14' + * @prop onClick {Function} 点击时触发事件,回调参数 {value: 1} + */ +class AtSegmentedControl extends Taro.Component { + handleClick (i, disable) { + if (disable) return + this.props.onClick({ value: i }) + } + + render () { + const { disabled, tabList, selectedColor, current, color, fontSize } = this.props + const rootStyle = `border-color: ${selectedColor};` + const itemStyle = ` + color: ${selectedColor}; + background-color:${color}; + border-color: ${selectedColor}; + font-size: ${fontSize}px; + ` + const selectedItemStyle = ` + color: ${color}; + background-color:${selectedColor}; + border-color: ${selectedColor}; + font-size: ${fontSize}px; + ` + return + { + tabList.map((item, i) => + {item.title} + ) + } + + } +} +AtSegmentedControl.defaultProps = { + current: 0, + color: '#fff', + fontSize: '14', + disabled: false, + selectedColor: '#6190E8', + tabList: [], + onClick: () => { } +} +AtSegmentedControl.propTypes = { + current: PropTypes.number, + color: PropTypes.string, + fontSize: PropTypes.oneOfType([PropTypes.string, PropTypes.number]), + disabled: PropTypes.bool, + tabList: PropTypes.array, + onClick: PropTypes.func +} +export default AtSegmentedControl diff --git a/src/components/segmented-control/index.scss b/src/components/segmented-control/index.scss new file mode 100644 index 000000000..037904184 --- /dev/null +++ b/src/components/segmented-control/index.scss @@ -0,0 +1,28 @@ +@import '../../style/mixins/index.scss'; +@import '../../style/theme/default.scss'; + +.at-segmented-control { + display: flex; + text-align: center; + width: 100%; + border-radius: 15px; + border: 2px solid #6190E8; + box-sizing: border-box; + white-space: nowrap; + overflow: hidden; + + &__item { + flex: 1; + font-size: 30px; + padding: 10px; + color: $color-text-base; + + + .at-segmented-control__item { + border-left: 2px solid #6190E8; + } + } + + &--disabled { + opacity: $opacity-disabled; + } +} diff --git a/src/pages/index/index.js b/src/pages/index/index.js index a141ae9d3..5d0782f79 100644 --- a/src/pages/index/index.js +++ b/src/pages/index/index.js @@ -175,6 +175,10 @@ export default class Index extends Taro.Component { { title: '标签栏', name: 'Tab-Bar' + }, + { + title: '分段器', + name: 'Segmented-Control' } ] } diff --git a/src/pages/navigation/segmented-control/index.js b/src/pages/navigation/segmented-control/index.js new file mode 100644 index 000000000..9d8245579 --- /dev/null +++ b/src/pages/navigation/segmented-control/index.js @@ -0,0 +1,40 @@ +import Taro from '@tarojs/taro' +import { View } from '@tarojs/components' +import AtSegmentedControl from '../../../components/segmented-control/index' +import './index.scss' + +export default class Index extends Taro.Component { + config = { + navigationBarTitleText: 'segmented-control 分段器示例' + } + constructor () { + super(...arguments) + this.state = { + current: 0, + } + } + handleClick (detail) { + this.setState({ + current: detail.value + }) + } + render () { + const { current } = this.state + return ( + + + + + + + {current === 0 ? 标签1的内容 : null} + {current === 1 ? 标签2的内容 : null} + {current === 2 ? 标签3的内容 : null} + + + + + + ) + } +} diff --git a/src/pages/navigation/segmented-control/index.scss b/src/pages/navigation/segmented-control/index.scss new file mode 100644 index 000000000..721ac58c0 --- /dev/null +++ b/src/pages/navigation/segmented-control/index.scss @@ -0,0 +1,17 @@ +.example__body { + background-color: #f8f8f8; + min-height: 100px; + padding: 30px 10px; + + .item { + margin-bottom: 10px; + } + + .tab-content { + font-size: 25px; + padding: 20px; + text-align: center; + border-top: 2px solid #f8f8f8; + background-color: #fff; + } +}