UNPKG

wux-weapp

Version:

一套组件化、可复用、易扩展的微信小程序 UI 组件库

208 lines (199 loc) 5.65 kB
import baseComponent from '../helpers/baseComponent' import classNames from '../helpers/libs/classNames' import { fieldNamesProps } from '../helpers/mixins/fieldNamesBehavior' baseComponent({ externalClasses: ['wux-scroll-view-class'], properties: { prefixCls: { type: String, value: 'wux-cascader', }, defaultValue: { type: Array, value: [], }, value: { type: Array, value: [], observer(newVal) { if (this.data.controlled) { this.setActiveValue(newVal) this.setInnerValue(newVal) } }, }, controlled: { type: Boolean, value: false, }, title: { type: String, value: '', }, cancelText: { type: String, value: '取消', }, confirmText: { type: String, value: '确定', }, options: { type: Array, value: [], }, full: { type: Boolean, value: false, }, height: { type: [String, Number], value: 'auto', }, chooseTitle: { type: String, value: '请选择', }, visible: { type: Boolean, value: false, observer(shouldRender) { if (shouldRender) { this.setShouldRender(true) } }, }, skipAnimation: { type: Boolean, value: false, }, ...fieldNamesProps, }, data: { shouldRender: false, innerValue: [], activeValue: [], }, computed: { classes: ['prefixCls', function(prefixCls) { const wrap = classNames(prefixCls) const hd = `${prefixCls}__hd` const bd = `${prefixCls}__bd` const toolbar = `${prefixCls}__toolbar` const inner = `${prefixCls}__inner` const cancel = classNames(`${prefixCls}__button`, { [`${prefixCls}__button--cancel`]: true, }) const confirm = classNames(`${prefixCls}__button`, { [`${prefixCls}__button--confirm`]: true, }) const hover = `${prefixCls}__button--hover` const title = `${prefixCls}__title` return { wrap, hd, bd, toolbar, inner, cancel, confirm, hover, title, } }], }, methods: { setShouldRender(shouldRender) { if (this.data.shouldRender !== shouldRender) { this.setData({ shouldRender, }) } }, setActiveValue(activeValue, forceTrigger) { if (this.data.activeValue !== activeValue || forceTrigger) { this.setData({ activeValue, }) } }, setInnerValue(innerValue) { if (this.data.innerValue !== innerValue) { this.setData({ innerValue, }) } }, getValue(value = this.data.activeValue) { this.cascaderView = this.cascaderView || this.querySelector('#wux-cascader-view') return this.cascaderView && this.cascaderView.getValue(value) }, /** * 切换面板的回调 */ onTabsChange(e) { this.triggerEvent('tabsChange', e.detail) }, /** * 叶子节点加载的回调 */ onLoadOptions(e) { this.triggerEvent('load', e.detail) }, /** * 选项改变时触发 */ onChange(e) { const { visible } = this.data const props = e.detail const { value: innerValue } = props this.setInnerValue(innerValue) if (visible) { this.triggerEvent('change', props) } }, /** * 组件关闭时的回调函数 */ close() { this.triggerEvent('close') }, /** * 组件关闭时重置其内部数据 */ onClosed() { const { activeValue: innerValue } = this.data this.setInnerValue(innerValue) this.setShouldRender(false) }, /** * 点击确定按钮时的回调函数 */ onConfirm() { const { innerValue: activeValue } = this.data if (!this.data.controlled) { this.setActiveValue(activeValue, true) } this.triggerEvent('confirm', { ...this.getValue(activeValue) }) this.close() }, /** * 点击取消按钮时的回调函数 */ onCancel() { this.triggerEvent('cancel', { ...this.getValue() }) this.close() }, /** * 阻止移动触摸 */ noop() {}, }, attached() { const { defaultValue, value, controlled, visible: shouldRender } = this.data const activeValue = controlled ? value : defaultValue this.setActiveValue(activeValue) this.setInnerValue(activeValue) this.setShouldRender(shouldRender) }, })