uview ui 1.x ActonSheet项太多,设置滚动(亲测有效)

文章讲述了在使用uViewUI中的ActionSheet组件时,由于item过多导致内容超出屏幕,通过在模板中添加滚动视图解决了滚动问题。原先是阻止了触摸事件,移除`touchmove.stop.prevent`后,用户可以在手机上正常滚动。

问题:ActionSheet滚动不了。

使用uview ui :u-action-sheet, 但是item太多,超出屏幕了, 查了一下文档,并没有设置滚动的地方。

官方文档:ActionSheet 操作菜单 | uView - 多平台快速开发的UI框架 - uni-app UI框架

解决

只能修改源码了,在v-for遍历外面添加一个滚动视图,即可,其他不变

<template>
	<u-popup mode="bottom" :border-radius="borderRadius" :popup="false" v-model="value" :maskCloseAble="maskCloseAble"
	    length="auto" :safeAreaInsetBottom="safeAreaInsetBottom" @close="popupClose" :z-index="uZIndex">
		<view class="u-tips u-border-bottom" v-if="tips.text" :style="[tipsStyle]">
			{{tips.text}}
		</view>
    <scroll-view scroll-y style="min-height: 100rpx;max-height: 700rpx;">
		<block v-for="(item, index) in list" :key="index">
			<view
				@touchmove.stop.prevent
				@tap="itemClick(index)"
				:style="[itemStyle(index)]"
				class="u-action-sheet-item u-line-1"
				:class="[index < list.length - 1 ? 'u-border-bottom' : '']"
				:hover-stay-time="150"
			>
				<text>{{item.text}}</text>
				<text class="u-action-sheet-item__subtext u-line-1" v-if="item.subText">{{item.subText}}</text>
			</view>
		</block>
    </scroll-view>
		<view class="u-gab" v-if="cancelBtn">
		</view>
		<view @touchmove.stop.prevent class="u-actionsheet-cancel u-action-sheet-item" hover-class="u-hover-class"
		    :hover-stay-time="150" v-if="cancelBtn" @tap="close">{{cancelText}}</view>
	</u-popup>
</template>

 效果:控制差不多半屏显示了,不超屏幕了。 在电脑上用鼠标滚轮很正常。但是在手机滚动不了。

问题2: 手机上触摸滚动不了。

再去看源码,发现包裹着block里的view禁止触摸事件,导致滚动视图滚动不了。把@touchmove.stop.prevent删除即可

最终代码

<template>
	<u-popup mode="bottom" :border-radius="borderRadius" :popup="false" v-model="value" :maskCloseAble="maskCloseAble"
	    length="auto" :safeAreaInsetBottom="safeAreaInsetBottom" @close="popupClose" :z-index="uZIndex">
		<view class="u-tips u-border-bottom" v-if="tips.text" :style="[tipsStyle]">
			{{tips.text}}
		</view>
    <scroll-view scroll-y="true" style="min-height: 100rpx;max-height: 700rpx;">
		<block v-for="(item, index) in list" :key="index">
			<view
				@tap="itemClick(index)"
				:style="[itemStyle(index)]"
				class="u-action-sheet-item u-line-1"
				:class="[index < list.length - 1 ? 'u-border-bottom' : '']"
				:hover-stay-time="150"
			>
				<text>{{item.text}}</text>
				<text class="u-action-sheet-item__subtext u-line-1" v-if="item.subText">{{item.subText}}</text>
			</view>
		</block>
    </scroll-view>
		<view class="u-gab" v-if="cancelBtn">
		</view>
		<view @touchmove.stop.prevent class="u-actionsheet-cancel u-action-sheet-item" hover-class="u-hover-class"
		    :hover-stay-time="150" v-if="cancelBtn" @tap="close">{{cancelText}}</view>
	</u-popup>
</template>

 .vue

//...
<view class="submenu">
      <u-action-sheet :list="subList" v-model="showSub" :tips="menuTitle" @click="selectSubMenu"></u-action-sheet>
    </view>

//...


export default {
  components: {
    HeadNavBar
  },
  data() {
    return {
      menuTitle: {text: "运营管理"},
      subList: [{text: 'item1'}, {text: 'item2'}, {text: 'item3'}, {text: 'item4'}, {text: 'item5'},
        {text: 'item6'}, {text: 'item7'},{text: 'item8'}, {text: 'item9'},{text: 'item10'}, {text: 'item11'},{text: 'item12'}, {text: 'item13'}],
      showSub: false,}}
}

//...

手机上效果:

<think>根据用户需求,需要在uView 1.x版本中实现下拉多选功能。结合引用内容,我们可以使用uView 1.x提供的`u-select`组件(注意:uView 1.x中该组件名称为`u-select`,而2.x中为`u-select`,但1.x中同样支持多选)。 ### 解决方案:使用uView 1.x的u-select组件实现下拉多选 #### 步骤1:安装uView UI 1.x 确保目已安装uView 1.x版本(注意:1.x和2.x的组件用法有差异,这里以1.x为准): ```bash npm install uview-ui@1.8.7 # 指定1.x的最新版本 ``` #### 步骤2:配置uView 在`main.js`中引入并配置uView: ```javascript import Vue from 'vue' import uView from 'uview-ui' Vue.use(uView) ``` #### 步骤3:在页面中使用u-select组件 在页面中添加以下代码: ```html <template> <view> <!-- 触发按钮 --> <u-button @click="showSelect = true">打开下拉多选</u-button> <!-- 下拉多选组件 --> <u-select v-model="showSelect" :list="list" mode="mutil-column" :multiple="true" @confirm="confirm" ></u-select> <!-- 显示已选内容 --> <view>已选择:{{ selectedLabels.join(', ') }}</view> </view> </template> <script> export default { data() { return { showSelect: false, // 控制下拉框显示 list: [ // 选列表 { value: '1', label: '选1' }, { value: '2', label: '选2' }, { value: '3', label: '选3' }, { value: '4', label: '选4' } ], selectedLabels: [] // 存储选中的label } }, methods: { // 确认选择回调 confirm(e) { // e为选中的数组,包含value和label this.selectedLabels = e.map(item => item.label) } } } </script> ``` ### 关键参数说明 1. **mode**:设置列数,`mutil-column`表示多列(单列则设为`single-column`),但多选时通常使用单列。 2. **multiple**:是否多选,设置为`true`。 3. **list**:选数组,每个元素包含`value`和`label`。 4. **v-model**:双向绑定控制显示。 ### 设置默认选中 引用[2]中提到封装复选框组件时使用`v-model`绑定值,同样地,`u-select`组件也支持默认选中。在`list`数组中设置`checked: true`即可: ```javascript list: [ { value: '1', label: '选1', checked: true }, { value: '2', label: '选2' }, // ... ] ``` ### 限制最大选择数量 通过`max-count`属性设置: ```html <u-select :max-count="2" ... ></u-select> ``` ### 添加搜索功能 uView 1.x的`u-select`组件内置搜索功能,通过`searchable`属性开启: ```html <u-select searchable ...></u-select> ``` ### 注意事 1. **组件兼容性**:uView 1.x的`u-select`组件在H5和小程序中表现一致,但需注意小程序中需在`pages.json`中配置: ```json { "path": "pages/index/index", "style": { "usingComponents": { "u-select": "/uview-ui/components/u-select/u-select" } } } ``` 2. **样式调整**:若需要自定义样式,可通过组件的`style`参数或覆盖uView的样式实现。 ### 自定义封装(参考引用[3]) 若需要多级联动,可参考引用[3]中的`RegionTreeSelect`组件思路,通过组合uView组件实现复杂下拉多选。 > 通过uView 1.x的`u-select`组件,我们可以快速实现美观且功能完善的下拉多选功能[^1][^2]。 §§相关问题§§ 1. uView 1.x的下拉多选如何实现级联选择? 2. 如何修改uView下拉多选组件的样式? 3. uView 1.x下拉多选在微信小程序中无法显示怎么办? 4. 如何实现下拉多选数据的动态加载(分页)?</think>在 uView 1.x 中实现下拉多选功能,可以使用 `<u-select>` 组件并设置 `multiple` 属性。以下是完整实现方案: ### 基础实现代码 ```html <template> <view class="container"> <!-- 触发按钮 --> <u-button @click="showSelect = true">选择城市</u-button> <!-- 下拉多选组件 --> <u-select v-model="showSelect" mode="single-column" :list="cityList" :multiple="true" :default-value="defaultSelected" @confirm="handleConfirm" ></u-select> <!-- 显示已选内容 --> <view class="selected-items"> <text v-for="(item, index) in selectedItems" :key="index"> {{ item.label }}<text v-if="index < selectedItems.length - 1">, </text> </text> <text v-if="selectedItems.length === 0">请选择城市</text> </view> </view> </template> <script> export default { data() { return { showSelect: false, // 控制下拉框显示 cityList: [ // 选数据 { value: 'bj', label: '北京' }, { value: 'sh', label: '上海' }, { value: 'gz', label: '广州' }, { value: 'sz', label: '深圳' }, { value: 'hz', label: '杭州' } ], selectedItems: [], // 存储选中 defaultSelected: [] // 默认选中 }; }, mounted() { // 设置默认选中(可选) this.defaultSelected = ['sh', 'gz']; // 默认选中上海和广州 }, methods: { // 确认选择回调 handleConfirm(e) { this.selectedItems = e; console.log('已选择:', e.map(item => item.label)); } } }; </script> <style scoped> .container { padding: 30rpx; } .selected-items { margin-top: 30rpx; padding: 20rpx; background-color: #f8f8f8; border-radius: 8rpx; min-height: 40rpx; } </style> ``` ### 关键功能说明 1. **多选模式**: ```html <u-select :multiple="true" ... ></u-select> ``` 2. **设置默认选中**: ```javascript defaultSelected: ['sh', 'gz'] // 通过value值设置默认选中 ``` 3. **限制最大选择数量**: ```html <u-select :max-count="3" ... ></u-select> ``` 4. **添加搜索功能**: ```html <u-select searchable placeholder="搜索城市..." ... ></u-select> ``` 5. **自定义确认按钮**: ```html <u-select confirm-text="完成选择" ... ></u-select> ``` ### 完整功能示例(带搜索和限制) ```html <u-select v-model="showSelect" :list="cityList" :multiple="true" :max-count="3" searchable placeholder="搜索城市..." confirm-text="完成选择" :default-value="['sh']" @confirm="handleConfirm" ></u-select> ``` ### 注意事 1. **小程序配置**: 在 `pages.json` 中添加组件声明: ```json { "path": "pages/index/index", "style": { "usingComponents": { "u-select": "/uview-ui/components/u-select/u-select" } } } ``` 2. **数据格式要求**: -数组必须是对象数组,包含 `value` 和 `label` 字段 - 确认回调返回选中的对象数组 3. **性能优化**: ```html <!-- 当数据量较大时 --> <u-select :list="bigDataList" searchable :show="showSelect" @open="loadData" <!-- 动态加载数据 --> ></u-select> ``` 4. **自定义样式**: ```css /* 在App.vue中覆盖样式 */ .u-select__body__scroll-view { max-height: 60vh !important; } .u-select__action__button { color: #2979ff !important; } ``` > 通过合理配置 `u-select` 组件的属性,可以实现满足各种业务需求的下拉多选功能[^1][^2]。对于复杂场景(如多级联动),可参考引用[3]中的 `RegionTreeSelect` 组件封装思路。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值