天天看點

uniapp 打造自用元件庫 (二) 詳情頁

uniapp 打造自用元件庫 (二) 詳情頁

前言

本文将帶領讀者使用uniapp封裝一些常用元件,友善日後開發時重複使用,當然文中封裝的元件不可能适配所有應用場景,但是我希望讀者可以跟着我的思路實作出來,然後可以在此基礎上優化改進為自己合适的,本人一個前端小菜雞,希望大佬們可以不吝賜教,也是對我的技術水準的提升

詳情頁

需求

相信大家都遇到過如圖這種大量展示資料的詳情頁面,每次都重複去寫非常繁瑣且無意義,我們可以通過封裝元件的方式來處理這種詳情頁

uniapp 打造自用元件庫 (二) 詳情頁

效果展示

應用效果
uniapp 打造自用元件庫 (二) 詳情頁
應用代碼
<view>
        <Ytitle value='這是帶數字标題' pieceColor='#007AFF' num='333'></Ytitle>
        <YinfoList :config="config" :data="data"></YinfoList>
    </view>           
export default {
        data() {
            return {
                config: [{
                        title: '使用者名',
                        key: 'username'
                    },
                    {
                        title: '性别',
                        key: 'sex'
                    },
                    {
                        title: '手機号',
                        key: 'phone'
                    },
                    {
                        title:'位址',
                        key:'address'
                    },
                    {
                        title:'出生日期',
                        key:'birthday'
                    },
                ],
                data: {
                    username: '李大錘',
                    sex: '男',
                    phone: '15095111111',
                    address: '北京前門外前門大街',
                    birthday: '2000-10-01'
                }
            }
        }
    }           

實作思路

我們拿到後端資料一般是

{key:value,key1:value1}

這種格式的資料,而我們展示的隻有一個

标題

value

,而

value

需要使用

key

來擷取,是以我們寫一個寫一個配置

json

[
  {
      title:'使用者名',
      key:'username'
    },
  {
      title:'性别',
      key:'sex'
    },
]           

這樣,當我們去周遊這個

json

的時候,就可以展示出需要展示的所有字段

标題

了,同時每一個周遊項中都會拿到自己對應的

key

,此時我們把後端拿到的資料

data

傳入

{
  username:'Alex',
  sex:'男'
}           

這樣在周遊項上使用

data[item.key]

就可以取到每一項對應的

value

完整實作代碼

<template>
    <view>
        <view class="list">
            <view class="item" @tap="tapitem(i)"  :style="{marginTop:i.top?i.top:'1rpx'}" v-for="i in config">
                <view class="view">{{i.title}}</view>
                <view class="text" v-if="data[i.key]">{{data[i.key]}}</view>
                <view class="text" v-if="!(data[i.key])">空</view>
            </view>
        </view>
    </view>
</template>

<script>
    export default {
        props: {
            config: {
                type: Array,
                default: []
            },
            data: {
                type: Object,
                default: {}
            }
        },
        data() {
            return {
                tapitem(info){
                    console.log('info',info)
                    this.$emit('')
                },
            };
        }
    }
</script>

<style lang="scss" scoped>
    .list {
        display: flex;
        flex-direction: column;
        background-color: #f2f2f2;
    }

    .item {
        display: flex;
        align-items: center;
        background-color: #fff;
        justify-content: space-between;
        flex-wrap: wrap;
        padding: 0 30rpx;
        &:active{
            background-color: #f2f2f2;
        }
        
        .view {
            padding: 30rpx 0;
            font-size: 14px;
            flex: 1;
            color: #333333;
        }

        .text {
            display: -webkit-box;
            -webkit-box-orient: vertical;
            -webkit-line-clamp: 0;
            overflow: hidden;
            font-size: 14px;
            color: #999;
        }
    }
</style>