uni-app入门和电商首页实现

完成入门案例

步骤1.下载编辑器

hbuilder

1.1 创建项目hello-uni-app

文档见快速上手-创建uni-app

1.2 清空pages/index/index.vue

<template>
    <view class="content">
    </view>
</template>
<script>
export default {
    data() {
        return {
        }
    },
    onLoad() {
    },
    methods: {
    }
}
</script>
<style>
</style>

步骤2.默认组件

2.1 修改index.vue

<view class="content">
    <view>块1</view>
    <view>块2</view>
    <view><text>字1</text><text>字2</text></view>
</view>

步骤3.运行程序

步骤4.打印日志

onLoad() {
    console.log('hello')
},

步骤5.使用扩展组件的插件

    <uni-icons type="contact" size="30"></uni-icons>
import uniIcons from "@/components/uni-icons/uni-icons.vue"
components: {uniIcons},

步骤6.自定义组件

6.1定义button-counter组件

组件注册

  • 新增button-counter.vue
<template>
    <view>
        <button @click="handleClick">{{num}}</button>
    </view>
</template>
<script>
    export default {
        data() {
            return {
                num: 1
            };
        },
        methods:{
            handleClick(){
                this.num++
            }
        }
    }
</script>
<style>
</style>
  • 修改index.vue
<template>
    <button-counter></button-counter>
</template>
<script>
    import buttonCounter from "@/components/button-counter.vue"
    components: {uniIcons, buttonCounter},
</script>

步骤7.API调用

    <image v-for="item in carouselList" :key="item.id" :src="item.goodsPic" mode="aspectFit" style="width: 100%;"></image>
data() {
    return {
        carouselList:[]
    }
},
onLoad() {
    this.getAdBanners()
},
methods: {
    async getAdBanners(){
        var [error, res] = await uni.request({
            url: 'https://a0e83064-1d70-4acb-8b07-43b6d3ef7b23.bspapp.com/http/adBanners'
        })
        this.carouselList = res.data.data.list
        console.log('this.carouselList', this.carouselList)
    }
}

完成shop案例

步骤1.整理页面

1.1 创建项目shop

1.2 清空pages/index/index.vue

  • template中删除多余的标签,和修改class为container
  • script data属性清空.添加onload生命周期
  • style 清空内容,添加lang="less" scoped属性
<template>
    <view class="container">
    </view>
</template>
<script>
    export default {
        data() {
            return {
            }
        },
        onLoad() {
        },
        methods: {

        }
    }
</script>

<style lang="less" scoped>
</style>

1.3 添加页面背景颜色

  • 打开文档
page {
    background: #f5f5f5;
}

步骤2 完成tabBar完成

2.1 打开参考网站

2.2 打开素材/图片拷贝本地图片到static文件夹

2.3 打开配置文档,并查看代码示例

2.4 修改page.json,新增tabBar属性

    "tabBar":{
        "color": "#C0C4CC",
        "selectedColor":"#FF713F",
        "list": [{
            "pagePath": "pages/index/index",
            "iconPath": "static/tab-home.png",
            "selectedIconPath": "static/tab-home-current.png",
            "text": "首页"
        },
        {
            "pagePath": "pages/category/category",
            "iconPath": "static/tab-cate.png",
            "selectedIconPath": "static/tab-cate-current.png",
            "text": "分类"
        },
        {
            "pagePath": "pages/cart/cart",
            "iconPath": "static/tab-cart.png",
            "selectedIconPath": "static/tab-cart-current.png",
            "text": "购物车"
        },
        {
            "pagePath": "pages/user/user",
            "iconPath": "static/tab-my.png",
            "selectedIconPath": "static/tab-my-current.png",
            "text": "我的"
        }]
    }

2.5 新建其他页面

页面名,填category,cart,user

步骤3 完成导航栏

3.1 打开配置文档 ,打开h5的配置文档,打开导航栏的配置文档

3.2 修改page.json,添加搜索框

"style": {
    "navigationBarTitleText": "首页",
    "h5": {
        "titleNView": {
            "searchInput": {
                
            }
        }
    }
}

3.3 修改page.json,美好搜索框

"searchInput": {
    "backgroundColor": "rgba(231, 231, 231,.7)",
    "borderRadius": "16px",
    "placeholder": "搜索",
    "align": "left",
    "fontSize": "12px",
    "placeholderColor": "#aaa"
}

3.4 打开字体图标

拷贝字体图标到static文件夹

3.5 修改page.json,添加左侧图标

"titleNView": {
    "buttons": [{
        "float": "left",
        "fontSrc": "/static/iconfont/iconfont.ttf",
        "text": "&#xe618;"
    }]
}

3.6 修改page.json,添加右侧图标

    "buttons": [{
        "float": "left",
        "fontSrc": "/static/iconfont/iconfont.ttf",
        "text": "&#xe618;"
    },{ 
        "text": "登录",
        "fontSize": "12px",
        "redDot": true
    }]

3.7 导航栏兼容性,app端

  • 添加app-plus,复制h5的属性值
  • 打开模拟器,运行
"app-plus": {
    
}

3.8 导航栏兼容性,app端,修改图标内容

"buttons": [{
    "float": "left",
    "fontSrc": "/static/iconfont/iconfont.ttf",
    "text": "\e618;"
}]

3.9 导航栏兼容性,小程序端,引入第三方插件

  • 新建cart,user页面
  • 搜索插件NavBar 导航栏,并安装它
  • 修改index.vue
<template>
    <view class="container">
        <uni-nav-bar left-icon="back" left-text="返回" right-text="菜单" title="导航栏组件"></uni-nav-bar>
    </view>
</template>
<script>
    import uniNavBar from "@/components/uni-nav-bar/uni-nav-bar.vue"
    export default {
        components: {uniNavBar},
    }
</script>

3.10 导航栏兼容性,小程序端,美化导航栏

  • 导入navBar的案例
  • 修改index.vue

3.10.1 复制案例代码

<uni-nav-bar :fixed="false" color="#333333" background-color="#FFFFFF" right-icon="scan" @clickLeft="showCity" @clickRight="scan">
    <block slot="left">
        <view class="city">
            <view><text class="uni-nav-bar-text">{{ city }}</text></view>
            <uni-icons type="arrowdown" color="#333333" size="22" />
        </view>
    </block>
    <view class="input-view">
        <uni-icons class="input-uni-icon" type="search" size="22" color="#666666" />
        <input confirm-type="search" class="nav-bar-input" type="text" placeholder="输入搜索关键词" @confirm="confirm">
    </view>
</uni-nav-bar>
.input-view {
    /* #ifndef APP-PLUS-NVUE */
    display: flex;
    /* #endif */
    flex-direction: row;
    /* width: 500rpx;*/
    flex: 1;
    background-color: #f8f8f8;
    height: 30px;
    border-radius: 15px;
    padding: 0 15px;
    flex-wrap: nowrap;
    margin: 7px 0;
    line-height: 30px;
}

.input-uni-icon {
    line-height: 30px;
}
.nav-bar-input {
    height: 30px;
    line-height: 30px;
    /* #ifdef APP-PLUS-NVUE */
    width: 370rpx;
    /* #endif */
    padding: 0 5px;
    font-size: 28rpx;
    background-color: #f8f8f8;
}

3.10.2 修改成案例效果

<view class="input-view">
    <uni-icons class="input-uni-icon" type="search" size="22" color="#666666" />
    <input confirm-type="search" disabled class="nav-bar-input" type="text" placeholder="搜索">
</view>

3.11 导航栏兼容性,调节编译

<!-- #ifdef MP -->
<uni-nav-bar :fixed="false" color="#333333" background-color="#FFFFFF" left-icon="scan" right-text="登录">
</uni-nav-bar>
<!-- #endif -->

步骤4 完成轮播图

4.1获取轮播图的数据

data(){
    return {
        carouselList: []
    }
},
loadData() {
    this.getAdBanners()
},
methods: {
    async getAdBanners(){
        var [error, res] = await uni.request({
            url: 'https://a0e83064-1d70-4acb-8b07-43b6d3ef7b23.bspapp.com/http/adBanners'
        })
        console.log('res', res)
        this.carouselList = res.data.data.list
    }
}

4.2使用轮播组件

<view class="carousel-section">
    <swiper>
        <swiper-item v-for="(item, index) in carouselList" :key="index">
            <image :src="item.goodsPic" />
        </swiper-item>
    </swiper>
</view>

4.3完善轮播组件

  • circular增加循环
  • 增加.carousel样式
<view class="carousel-section">
    <swiper class="carousel" circular>
        <swiper-item v-for="(item, index) in carouselList" :key="index" class="carousel-item">
            <image :src="item.goodsPic"/>
        </swiper-item>
    </swiper>
</view>
.carousel {
    width: 100%;
    height: 373rpx;

    image {
        width: 100%;
        height: 100%;
    }
}

4.4添加自定义轮播指示器,基础样式

  • 修改index.vue
<view class="carousel-section">
    <swiper class="carousel" circular>
        <swiper-item v-for="(item, index) in carouselList" :key="index" class="carousel-item">
            <image :src="item.goodsPic"/>
        </swiper-item>
    </swiper>
    <view class="swiper-dots">
        <text class="num">{{ swiperCurrent + 1 }}</text>
        <text class="sign">/</text>
        <text class="num">{{ swiperLength }}</text>
    </view>
</view>
data() {
    return {
        swiperCurrent: 0,
        swiperLength: 0,
    }
},
methods: {
    async getAdBanners(){
        var [error, res] = await uni.request({
            url: 'https://a0e83064-1d70-4acb-8b07-43b6d3ef7b23.bspapp.com/http/adBanners'
        })
        console.log('res', res)
        this.carouselList = res.data.data.list
        this.swiperLength = this.carouselList.length
    }
}
.carousel-section{
    position: relative;
}   
.swiper-dots {
    display: flex;
    position: absolute;
    left: 45rpx;
    bottom: 40rpx;
    width: 72rpx;
    height: 36rpx;
    background-image: url(https://itcast-1255651667.cos.ap-chengdu.myqcloud.com/20200421213325.png);
    background-size: 100% 100%;

    .num {
        width: 36rpx;
        height: 36rpx;
        border-radius: 50px;
        font-size: 24rpx;
        color: #fff;
        text-align: center;
        line-height: 36rpx;
    }

    .sign {
        position: absolute;
        top: 0;
        left: 50%;
        line-height: 36rpx;
        font-size: 12rpx;
        color: #fff;
        transform: translateX(-50%);
    }
}

4.5轮播事件添加

  • 切换轮播,改变指示器的数字显示
<swiper class="carousel" circular @change="swiperChange">
</swiper>
methods: {
    swiperChange(e) {
        const index = e.detail.current;
        this.swiperCurrent = index;
    },
}

步骤5 玩分类栏目

5.1基本布局

  • 使用emmet写标签
    view.cate-section>(view.cate-item>image[src=""]+text)*10
  • 打开素材/图片/图片.md
<view class="cate-section">
    <view class="cate-item">
        <image src="https://itcast-1255651667.cos.ap-chengdu.myqcloud.com/20200409224144.png"></image>
        <text></text>
    </view>
    <view class="cate-item">
        <image src="https://itcast-1255651667.cos.ap-chengdu.myqcloud.com/20200409224613.png"></image>
        <text></text>
    </view>
    <view class="cate-item">
        <image src="https://itcast-1255651667.cos.ap-chengdu.myqcloud.com/20200409224724.png"></image>
        <text></text>
    </view>
    <view class="cate-item">
        <image src="https://itcast-1255651667.cos.ap-chengdu.myqcloud.com/20200409224803.png"></image>
        <text></text>
    </view>
    <view class="cate-item">
        <image src="https://itcast-1255651667.cos.ap-chengdu.myqcloud.com/20200409224954.png"></image>
        <text></text>
    </view>
    <!-- 第二行 -->
    <view class="cate-item">
        <image src="https://itcast-1255651667.cos.ap-chengdu.myqcloud.com/20200409225107.png"></image>
        <text></text>
    </view>
    <view class="cate-item">
        <image src="https://itcast-1255651667.cos.ap-chengdu.myqcloud.com/20200409225233.png"></image>
        <text></text>
    </view>
    <view class="cate-item">
        <image src="https://itcast-1255651667.cos.ap-chengdu.myqcloud.com/20200409225318.png"></image>
        <text></text>
    </view>
    <view class="cate-item">
        <image src="https://itcast-1255651667.cos.ap-chengdu.myqcloud.com/20200409225348.png"></image>
        <text></text>
    </view>
    <view class="cate-item">
        <image src="https://itcast-1255651667.cos.ap-chengdu.myqcloud.com/20200409225437.png"></image>
        <text></text>
    </view>
</view>
/* 分类 */
.cate-section {
    display: flex;
    justify-content: space-around;
    align-items: center;
    flex-wrap: wrap;

    .cate-item {
        width: 20%;
    }

    image {
        width: 85rpx;
        height: 85rpx;
        border-radius: 50%;
    }
}

5.2 美化图标样式

  • 添加图标文字,美好
<text>服饰</text>
<text>数码</text>
<text>美妆</text>
<text>手机</text>
<text>旅行</text>
<text>生鲜</text>
<text>超市</text>
<text>物流</text>
<text>进口</text>
<text>缴费</text>
.cate-section {
    margin: 18rpx 17rpx;
    padding-top: 30rpx;
    background: #fff;
    border-radius: 10rpx;   
    .cate-item {
        display: flex;
        flex-direction: column;
        align-items: center;
        font-size: 26rpx;
        margin-bottom: 30rpx;
    }
    image {
        margin-bottom: 10rpx;
    }
}

步骤6 实现猜你喜欢

6.1创建guess-like-goods.vue

6.2引入组件guess-like-goods

修改index.vue

<guess-like-goods></guess-like-goods>

6.3发送请求

    import guessLikeGoods from '@/components/guess-like-goods.vue'
export default {    
    components: {
        guessLikeGoods
    },
    data() {
        return {
            guessLikeGoodsList: []
        };
    },
    created(){
        this.getGuessLikeGoods()
    },
    methods: {
        async getGuessLikeGoods(){
            var [error, res] = await uni.request({
                url:'https://a0e83064-1d70-4acb-8b07-43b6d3ef7b23.bspapp.com/http/guessLike'
            })
            this.guessLikeGoodsList = res.data.data
        }
    }
}

6.4写的标签,主要布局

  • 编辑guess-like-goods.vue
<!-- 猜你喜欢 -->
<view class="f-header">
    <h3>─<span>猜你喜欢</span>─</h3>
    <view class="guess-section">
        <view v-for="(item, index) in guessLikeGoodsList" :key="index" class="guess-item">
            <view class="image-wrapper">
                <image :src="item.goodsPic" mode="aspectFill"></image>
            </view>
        </view>
    </view>
</view>
/* 猜你喜欢 */
.f-header {
    margin: 18rpx 17rpx;
    h3 {
        font-weight: bold;
        padding: 6rpx 0 24rpx;
        font-size: 30rpx;
        text-align: center;
        span {
            color: #FF7443;
        }
    }
}
.guess-section {
    display: flex;
    flex-wrap: wrap;
    .guess-item {
        display: flex;
        position: relative;
        flex-direction: column;
        width: 48%;
        margin-bottom: 20rpx;
        background-color: #fff;
        border-radius: 10rpx;
        padding-bottom: 20rpx;
        &:nth-child(2n + 1) {
            margin-right: 4%;
        }
    }
    .image-wrapper {
        width: 100%;
        height: 330rpx;
        border-radius: 3px;
        image {
            width: 100%;
            height: 100%;
        }
    }
}

6.5写的标签,其他布局

  • 编辑guess-like-goods.vue
<view v-for="(item, index) in guessLikeGoodsList" :key="index" class="guess-item" @click="navToDetailPage(item)">
    <view class="image-wrapper">
        <image :src="item.goodsPic" mode="aspectFill"></image>
    </view>
    <text class="title">{{item.goodsTitle}}</text>
    <text class="price">¥{{item.goodsPrice}}</text>
    
    <!-- <image class="cart" src="../static/tab-cart.png"></image> -->
</view>
.guess-section {
    .title {
        padding-left: 10rpx;
        margin: 20rpx 0;
        font-size: 25rpx;
        color: #262626;
        
        overflow: hidden;
        text-overflow: ellipsis;
        white-space: nowrap;
        display: block;
    }
    .price {
        padding-left: 10rpx;
        font-size: 24rpx;
        color: #DC332A;
        line-height: 1;
    }   
}

6.6写标签,加入购物车图标

  • 编辑App.vue
<style>
    @import url("static/iconfont/iconfont.css");
</style>
  • 编辑guess-like-goods.vue
<view v-for="(item, index) in guessLikeGoodsList" :key="index" class="guess-item" @click="navToDetailPage(item)">
    <view class="cart iconfont icon-gouwuche"></view>
</view>
.guess-section {
    .guess-item {
        .cart {
            position: absolute;
            bottom: 10rpx;
            right: 10rpx;
            font-size: 40rpx
        }   
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容