uniapp项目 完成一个点击 展开 收起的效果

需求是: 即将解锁勋章模块   默认只展示三条数据,当数据大于3条时显示展开,点击展开显示全部数据,展开按钮变为收起,点击收起就只展示三条数据,且收起按钮变为展开.    小于或等于3条时显示所有数据,且不显示展开收起,

<view class="unlock">
                    <view style="color: #606266;">即将解锁的勋章</view>
                    <view class="marteial_desc">
                        <view class="marteial_content" style="display: flex;align-items: center;" v-for="(item, index) in arryList" :key="index" v-show="isFlod || index < 3">
                            <image style="width: 92rpx;height: 92rpx;" src="../../static/logo.png" mode=""></image>
                            <view class="marterial_link">
                                <view>{{item.text1}}</view>
                                <view>{{item.text2}}</view>
                            </view>
                        </view>
                    </view>
                    <view class="show_more" @click="showMoreMarterialContent" v-show="dataList.length>3">
                        {{isFlod ? "展开" : "收起" }}
                    </view>

</view>

<script>
    export default{
        data(){
            return {
            dataList: [
                    {
                        img:'图片',
                        text1:'健康生活方式LV.6',
                        text2:'在健康的生活方式维度达到3/5分'
                    },
                    {
                        img:'图片',
                        text1:'健康生活方式LV.6',
                        text2:'在健康的生活方式维度达到3/5分'
                    },
                    {
                        img:'图片',
                        text1:'健康生活方式LV.6',
                        text2:'在健康的生活方式维度达到3/5分'
                    },
                    {
                        img:'图片',
                        text1:'健康生活方式LV.6',
                        text2:'在健康的生活方式维度达到3/5分'
                    },
                ], // 后端返回的即将解锁勋章的数据
                arryList:[],
                isFlod:true,//是否展开数据
                hasMore: false // 是否有更多数据需要展示
    },

         mounted() {
             if(this.dataList && Array.isArray(this.dataList)){
                if (this.dataList.length > 3 ) {
                    
                    this.arryList=JSON.parse(JSON.stringify(this.dataList)).splice(0,3)
                   }else if(this.dataList.length <= 3){
                    this.arryList=this.dataList
                   }
                    this.isFlod=true
                  }
            }
    },
        
    methods:{
            // 即将解锁勋章展开与收起   
            showMoreMarterialContent(){
                // this.isFlod=!this.isFlod
                if(this.isFlod && this.dataList.length > 3){
                         this.isFlod = false
                         this.arryList=this.dataList
                }else if(!this.isFlod && this.dataList.length > 3){
                         this.isFlod = true
                         this.arryList=this.dataList.splice(0,3)       
                }
            },
        }

}

</script>


css:

  .unlock{
                 margin: 24rpx 0;
                 padding: 24rpx;
                 width: 694rpx;
                 height: 536rpx;
                 background: #FFFFFF;
                 border-radius: 16rpx 16rpx 16rpx 16rpx;
                 opacity: 1;
             }





### 实现 UniApp 下拉树组件 在 UniApp 中实现下拉树功能可以通过组合多个内置组件来完成。基于已有经验[^1],可以利用 `picker-view` 组件作为基础结构,并通过自定义数据源和事件监听器增强其功能性。 #### 数据准备与初始化 为了展示树形结构的数据,在页面加载时需先获取并设置好相应的选项列表: ```javascript // 假设这是从服务器端获得的分类信息数组 const treeData = ref([ { id: '001', name: '根节点一', children: [ {id: '001-1', name: '子节点A'}, {id: '001-2', name: '子节点B'} ] }, // 更多层级... ]); ``` #### 创建可交互视图 采用 `<template>` 定义 HTML 结构部分,其中嵌入了用于触发显示隐藏效果以及实际承载树状菜单的容器: ```html <view class="tree-picker"> <!-- 触发按钮 --> <button type="default" @click="toggleTree">点击展开/收起</button> <!-- 树形选择区域 --> <view v-if="isShowTree" style="margin-top: 10px;"> <picker-view indicator-style="height: 50px;" :value="selectedValue" @change="bindChange"> <picker-view-column> <div v-for="(item, index) in flatTreeData" :key="index">{{ item.name }}</div> </picker-view-column> </picker-view> <!-- 关闭按钮 --> <button type="warn" @click="closeTree">关闭</button> </view> </view> ``` 这里使用了一个简单的折叠逻辑控制树形界面显隐状态;而 `flatTreeData` 则是对原始 `treeData` 进行扁平化处理后的版本以便于渲染到单列滚动视图中。 #### 处理用户操作 对于用户的每一次互动都需要有对应的响应机制,比如当选择了某个项目之后更新当前选中的路径或者执行其他业务动作: ```javascript import { ref, computed } from 'vue'; export default { setup() { let isShowTree = ref(false); let selectedValue = ref([0]); // 默认选中第一个 function toggleTree(){ isShowTree.value = !isShowTree.value; } function closeTree(){ isShowTree.value = false; } const bindChange = e => { console.log('Picker changed:', e.detail.value); // 更新 selectedValue 或者做更多事情 // 如果需要的话还可以在这里调用 uni.$emit 来通知父级或其他地方发生了改变 uni.$emit('onTreeNodeSelected', {...}); }; return { isShowTree, selectedValue, toggleTree, closeTree, bindChange, // 将复杂层次转换成线性表便于 picker 显示 flatTreeData: computed(() => flatten(treeData)) }; } } ``` 上述代码片段展示了如何创建一个基本可用的下拉树控件原型。当然这只是一个简化版的例子,具体应用可能还需要根据实际情况调整样式、优化性能等方面的工作。 #### 扩展建议 考虑到用户体验,可以在现有基础上进一步改进: - 添加搜索过滤功能帮助快速定位目标项; - 支持多级联动即不同级别间存在依赖关系的情况; - 对大量数据集采取懒加载策略减少初次加载时间开销。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值