Files
meida_front/uni_modules/uv-radio/components/uv-radio-group/uv-radio-group.vue
T
guigongli 8f68f9b0c8 feat(fittingRoom): 新增衣服长度选择功能在上传衣服页面增加分类和长度选择功能,支持用户选择衣服类型和具体长度部位。新增 pattern 常量定义各种长度选项,并在 store 中添加相应的状态管理。同时更新了相关样式和组件依赖。
fix(uploadClothes): 修复上传页面分类选择逻辑

调整上传衣服页面的分类选择逻辑,使用 uv-radio-group 实现单选功能,支持衣服类型和长度部位的选择。引入 fittingRoom store 中的 tabs 和 pattern 数据,优化用户交互体验。

chore(deps): 更新 uv-icon 和 uv-radio 组件版本更新 uv-icon 和 uv-radio 组件的 package.json 配置文件,设置版本号为1.0.13。更新 changelog 文档,记录组件的优化和 bug 修复历史。完善组件的平台兼容性配置和依赖关系。

style(components): 调整上传页面样式布局优化上传衣服页面的样式布局,新增 warp、title、container 等样式类,改善分类和长度选择区域的显示效果。调整单选框的间距和对齐方式,提升用户界面的美观性和可用性。
2025-09-22 22:35:30 +08:00

116 lines
4.2 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<template>
<view
class="uv-radio-group"
:class="bemClass"
:style="[$uv.addStyle(this.customStyle)]"
>
<slot></slot>
</view>
</template>
<script>
import mpMixin from '@/uni_modules/uv-ui-tools/libs/mixin/mpMixin.js'
import mixin from '@/uni_modules/uv-ui-tools/libs/mixin/mixin.js'
import props from './props.js';
/**
* radioRroup 单选框父组件
* @description 单选框用于有一个选择,用户只能选择其中一个的场景。搭配uv-radio使用
* @tutorial https://www.uvui.cn/components/radio.html
* @property {String | Number | Boolean} value 绑定的值
* @property {Boolean} disabled 是否禁用所有radio(默认 false
* @property {String} shape 外观形状,shape-方形,circle-圆形(默认 circle )
* @property {String} activeColor 选中时的颜色,应用到所有子Radio组件(默认 '#2979ff'
* @property {String} inactiveColor 未选中的颜色 (默认 '#c8c9cc' )
* @property {String} name 标识符
* @property {String | Number} size 组件整体的大小,单位px(默认 18 )
* @property {String} placement 布局方式,row-横向,column-纵向 (默认 'row'
* @property {String} label 文本
* @property {String} labelColor label的颜色 (默认 '#303133'
* @property {String | Number} labelSize label的字体大小,px单位 (默认 14 )
* @property {Boolean} labelDisabled 是否禁止点击文本操作checkbox(默认 false )
* @property {String} iconColor 图标颜色 (默认 '#ffffff'
* @property {String | Number} iconSize 图标的大小,单位px (默认 12 )
* @property {Boolean} borderBottom placement为row时,是否显示下边框 (默认 false )
* @property {String} iconPlacement 图标与文字的对齐方式 (默认 'left'
* @property {Object} customStyle 组件的样式,对象形式
* @event {Function} change 任一个radio状态发生变化时触发
* @example <uv-radio-group v-model="value"></uv-radio-group>
*/
export default {
name: 'uv-radio-group',
mixins: [mpMixin, mixin, props],
computed: {
// 这里computed的变量,都是子组件uv-radio需要用到的,由于头条小程序的兼容性差异,子组件无法实时监听父组件参数的变化
// 所以需要手动通知子组件,这里返回一个parentData变量,供watch监听,在其中去通知每一个子组件重新从父组件(uv-radio-group)
// 拉取父组件新的变化后的参数
parentData() {
const value = this.value || this.modelValue;
return [value, this.disabled, this.inactiveColor, this.activeColor, this.size, this.labelDisabled, this.shape,
this.iconSize, this.borderBottom, this.placement]
},
bemClass() {
// this.bem为一个computed变量,在mixin中
return this.bem('radio-group', ['placement'])
},
},
watch: {
// 当父组件需要子组件需要共享的参数发生了变化,手动通知子组件
parentData() {
if (this.children.length) {
this.children.map(child => {
// 判断子组件(uv-radio)如果有init方法的话,就就执行(执行的结果是子组件重新从父组件拉取了最新的值)
typeof(child.init) === 'function' && child.init()
})
}
},
},
data() {
return {
}
},
created() {
this.children = []
},
methods: {
// 将其他的radio设置为未选中的状态
unCheckedOther(childInstance) {
this.children.map(child => {
// 所有子radio中,被操作组件实例的checked的值无需修改
if (childInstance !== child) {
child.checked = false
}
})
const {
name
} = childInstance
// 通过emit事件,设置父组件通过v-model双向绑定的值
// #ifdef VUE2
this.$emit('input', name)
// #endif
// #ifdef VUE3
this.$emit('update:modelValue',name)
// #endif
// 发出事件
this.$emit('change', name)
},
}
}
</script>
<style lang="scss" scoped>
@import '@/uni_modules/uv-ui-tools/libs/css/components.scss';
.uv-radio-group {
flex: 1;
&--row {
@include flex;
flex-wrap: wrap;
}
&--column {
@include flex(column);
}
}
</style>