Vue webAPP首頁開發(一)

来源:https://www.cnblogs.com/chenyingying0/archive/2020/04/01/12612393.html
-Advertisement-
Play Games

接上篇 https://www.cnblogs.com/chenyingying0/p/12609330.html 首先說下格式化的問題: vscode可以安裝Vetur插件 安裝之後重啟編輯器,滑鼠右鍵,有一個格式化代碼選項,點擊即可 首先放出文件路徑,先讓小伙伴們熟悉下結構 Navbar 組件: ...


接上篇 https://www.cnblogs.com/chenyingying0/p/12609330.html

 

首先說下格式化的問題:

vscode可以安裝Vetur插件

 

 安裝之後重啟編輯器,滑鼠右鍵,有一個格式化代碼選項,點擊即可

 

首先放出文件路徑,先讓小伙伴們熟悉下結構

 

 

Navbar 組件:

在base目錄下創建navbar目錄,裡面創建index.vue

<template>
    <div class="mine-navbar">
        <!-- v-if作用:插槽存在內容則顯示,不存在則隱藏 -->
        <div class="mine-navbar-left" v-if="$slots.left">
            <slot name="left"></slot>
        </div>
        <div class="mine-navbar-center" v-if="$slots.center">
            <slot name="center"></slot>
        </div>
        <div class="mine-navbar-right" v-if="$slots.right">
            <slot name="right"></slot>
        </div>
        <h1 class="mine-navbar-title" v-if="title">
            <!-- 解決flex佈局和ellipsis佈局衝突的問題 -->
            <!-- 外面控制flex佈局,裡面控制ellipsis隱藏 -->
            <span class="mine-navbar-text" v-text="title"></span>
        </h1>
    </div>
</template>

<script>
export default {
   name:"MeNavbar",
   props:{//過濾器
       title:{
           type:String,
           default:''
       }
   }
}
</script>

<style lang="scss" scoped>
    @import '~assets/scss/mixins';
    .mine-navbar{
        @include flex-between();
        height:50px;
        background:#fff;
        position:relative;

        // &指代父元素
        &-left{
            margin-left:10px;
            // 當left和center都不存在,設置right為絕對定位,避免它跑到左邊
            // ~代表該元素之後的兄弟元素
            ~.mine-navbar-right{
                position:static;
            }
        }

        &-center{
            flex:1;
            margin:0 10px;
            ~.mine-navbar-right{
                position:static;
            }
        }

        &-right{
            margin-right:10px;
            position:absolute;
            right:0;
        }

        &-title{
            position:absolute;
            top:0;
            left:0;
            left:20%;
            right:20%;
            @include flex-center();    
            text-align:center;
                   
        }

        &-text{
            width:100%;
            line-height:1.5;// 因為設置了溢出隱藏,當英文字母過高時會顯示不全 
            font-size:18px;
            @include ellipsis();
        }
    }
</style>

首頁home目錄下的header.vue

<template>
    <div>
        <MeNavbar class="header">
            <i class="iconfont icon-scan" slot="left"></i>
            <div slot="center">搜索框</div>
            <i class="iconfont icon-msg" slot="right"></i>
        </MeNavbar>
    </div>
</template>

<script>
import MeNavbar from 'base/navbar';
export default {
   name:"HomeHeader",
   components:{
       MeNavbar
   }
}
</script>

<style lang="scss" scoped>
    // 引入前面需要加波浪線,否則會報錯
    @import "~assets/scss/mixins";
    .header{
        &.mine-navbar{
            background:transparent;
        }

        .iconfont{
            font-size:$icon-font-size;
            color:$icon-color-default;
        }
    }
    
</style>

在_mixins.scss中新增flex-between

 

 現在的效果:

 

 

幻燈片組件--swiper:https://www.npmjs.com/package/vue-awesome-swiper

首先下載 cnpm install swiper vue-awesome-swiper --save

 

 

模擬伺服器端提供的數據 http://www.imooc.com/api/home/slider

 

 

因為要使用ajax發送請求,因此需要安裝axios  

cnpm install --save axios

 

 

在api目錄下創建config.js,用來存放常量

export const SUCC_CODE=0;
export const TIMEOUT=10000;

 

在api目錄下創建home.js,用來使用axios模擬從伺服器獲取slider數據

import axios from 'axios';
import {SUCC_CODE,TIMEOUT} from './config';

//獲取幻燈片數據 ajax
export const getHomeSliders=()=>{
    // es6使用promise代替回調
    // axios返回的就是一個promise
    // return axios.get('http://www.imooc.com/api/home/slider').then(res=>{
    //     console.log(res);
    //     if(res.data.code===SUCC_CODE){
    //         return res.data.slider;
    //     }

    //     throw new Error('沒有成功獲取到數據');
    // }).catch(err=>{
    //     console.log(err);
    //     //錯誤處理
    //     return [{       
    //         linkUrl:'www.baidu.com',
    //         picUrl:require('assets/img/404.png')
    //     }]
    // });

    //演示超時錯誤
    return axios.get('http://www.imooc.com/api/home/slider',{
        timeout:TIMEOUT
    }).then(res=>{
        console.log(res);
        if(res.data.code===SUCC_CODE){
            return res.data.slider;
        }

        throw new Error('沒有成功獲取到數據');
    }).catch(err=>{
        console.log(err);
        //錯誤處理
        return [{       
            linkUrl:'www.baidu.com',
            picUrl:require('assets/img/404.png')
        }]
    });
}

 

在base目錄下創建slider目錄,裡面創建index.vue,這是基礎的slider組件樣式(可多個項目通用)

<template>
    <div class="mine-slider">
        <!-- 動態的屬性前面加冒號 -->
        <swiper :options="swiperOption" class="swiper-container">
            <slot></slot>
            <div class="swiper-pagination" v-if="pagination" slot="pagination"></div>
        </swiper>
    </div>
</template>

<script>
import { Swiper } from 'vue-awesome-swiper';

export default {
    name:"MeSlider",
    components: {
        Swiper
    },
    props:{
        direction:{
            type:String,
            default:'horizontal',
            validator(value){
                // 返回true則驗證通過
                return [
                    'horizontal',
                    'vertical'
                ].indexOf(value)>-1;
            }
        },
        interval:{//自動輪播
            type:Number,
            default:3000,
            validator(value){
                return value>=0;
            }
        },
        loop:{//無縫滾動
            type:Boolean,
            default:true
        },
        pagination:{//分液器
            type:Boolean,
            default:true
        }
    },
    data(){
        return{
            swiperOption:{
                watchOverflow:true,//只有一張圖片時不設置滾動效果
                direction:this.direction,//滾動方向
                autoplay:this.interval?{
                    delay:this.interval,
                    disableOnInteraction:false//手指滑動時是否停止自動輪播
                }:false,
                slidesPerView:1,//同時顯示幾張圖片
                loop:this.loop,//是否開啟無縫滾動
                pagination:{//分頁器
                    el:this.pagination?'.swiper-pagination':null
                }

            }
        }
    }
}
</script>

<style lang="scss" scoped>
    @import '~assets/scss/mixins';
    .swiper-container{
        width:100%;
        height:100%;
    }
</style>

 

在main.js中引入swiper的css文件

 

 

把圖片複製到home目錄下,然後創建slider.vue,這是首頁中的slider組件

<template>
    <div class="slider-wrapper">
        <!-- 分開傳才能分開校驗,因此不直接傳入對象 -->
        <MeSlider 
            :direction="direction"
            :loop="loop"
            :interval="interval"
            :pagination="pagination"
            v-if="sliders.length"
        >
            <swiper-slide v-for="(item,index) in sliders" :key="index">
                <a :href="item.linkUrl" class="slider-link">
                    <img :src="item.picUrl" class="slider-img">
                </a>
            </swiper-slide>
        </MeSlider>
    </div>
</template>

<script>
import MeSlider from 'base/slider';
import { SwiperSlide } from 'vue-awesome-swiper';
import { sliderOptions } from './config';
import { getHomeSliders } from 'api/home';

export default {
   name:"HomeSlider",
   components:{
       MeSlider,
       SwiperSlide
   },
    data(){
        return{
            direction:sliderOptions.direction,
            loop:sliderOptions.loop,
            interval:sliderOptions.interval,
            pagination:sliderOptions.pagination,
            sliders:[],//這是從伺服器讀取
            //這是靜態寫入
            // sliders:[
            //     {
            //        linkUrl:'www.baidu.com',
            //        picUrl:require('./1.jpg') //js中本地圖片引入必須加require
            //     },
            //     {
            //        linkUrl:'www.baidu.com',
            //        picUrl:require('./2.jpg') 
            //     },
            //     {
            //        linkUrl:'www.baidu.com',
            //        picUrl:require('./3.jpg') 
            //     },
            //     {
            //        linkUrl:'www.baidu.com',
            //        picUrl:require('./4.jpg') 
            //     }
            // ]
        }
    },
    created(){
        //一般在created里獲取遠程數據
        this.getSliders();
        
        
    },
    methods:{
        getSliders(){
            getHomeSliders().then(data=>{
                console.log(data);
                this.sliders=data;
            });
        }
    }
}
</script>

<style lang="scss" scoped>
    // 引入前面需要加波浪線,否則會報錯
    @import "~assets/scss/mixins";
    .slider-wrapper{
        width:100%;
        height:183px;
    }
    .slider-link{
        display:block;
    }
    .slider-link,
    .slider-img{
        width:100%;
        height:100%;
    }
    
</style>

 

修改home目錄下的index.vue,現在首頁已經引入了頭部,輪播圖,底部,返回箭頭

<template>
    <div class="home">
        <header class="g-header-container">
            <!-- 沒有內容自閉合即可-->
            <HomeHeader/>
        </header> 
        <div>
            <HomeSlider></HomeSlider>
        </div>
        <div class="g-backup-container"></div>
        <!-- 當前頁面存在二級頁面時需要使用router-view -->
        <router-view></router-view>
    </div>
</template>

<script>
import HomeHeader from './header';
import HomeSlider from './slider';

export default {
    name:"Home",
    components:{
        HomeHeader,
        HomeSlider
    }
}
</script>

<style lang="scss" scoped>
    // 引入前面需要加波浪線,否則會報錯
    @import "~assets/scss/mixins";
    .home{
        overflow:hidden;
        width:100%;
        height:100%;
        background:$bgc-theme;
    }
</style>

 

在home目錄下新建config.js,配置首頁中的輪播圖的配置參數

//暴露一個常量
export const sliderOptions={
    direction:"horizontal",
    loop:"loop",
    interval:1000,
    pagination:"pagination"
}

 

修改下_container.scss,增加一些樣式

@import "mixins";

.g-container{
    position: relative;
    width:100%;
    height:100%;
    max-width:640px;
    min-width:320px;
    margin:0 auto;
    overflow:hidden;
}
.g-view-container{
    height:100%;
    padding-bottom:$tabbar-height; // 註意移動端在reset文件里要設置box-sizing:border-box
}
.g-header-container{
    position:absolute;
    left:0;
    top:0;
    width:100%;
    z-index:$navbar-z-index;
}
.g-footer-container{
    position:absolute;
    left:0;
    bottom:0;
    width:100%;
    box-shadow:0 0 10px 0 hsla(0,6%,58%,0.6);
    z-index:$tabbar-z-index;
}
.g-backup-container{
    position: absolute;
    z-index:$backtop-z-index;
    right:10px;
    bottom:$tabbar-z-index+10px;
}

 

index.scss里的代碼:

@charset "UTF-8";

@import "reset";
@import "base";
@import "icons"; // 引入時不需要寫_icons.scss
@import "containers";
@import "tabbar";

 

成功獲取輪播圖時的效果

 

獲取輪播圖失敗的效果圖

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 127.0.0.1:6379> info [server|clients|memory|stats|...] # Server redis_version:5.0.4 #redis版本 redis_git_sha1:00000000 redis_git_dirty:0 redis_build_id: ...
  • 一、大小寫特別敏感 大寫欄位需要用“”引號(pg欄位名使用“”,MySQL欄位名使用``) ******表名以及欄位名如果是小寫但是為關鍵字,比如name,則也需使用""; 二、分頁 limit ${limit} offset ${start} 三、判斷條件等號前後欄位類型需要一致 類型轉換相關函數 ...
  • 導讀 正所謂有人(鎖)的地方就有江湖(事務),人在江湖飄,怎能一無所知? 今天來細說一下Mysql中的三類鎖,分別是全局鎖、表級鎖、行級鎖。 文章首發於作者公眾號【碼猿技術專欄】,原創不易,喜歡的點個贊關註一下,謝謝!!! 全局鎖 全局鎖簡單的說就是鎖住整個資料庫實例,命令是Flush tables ...
  • Redis常用管理命令 # dbsize 返回當前資料庫 key 的數量。 # info 返回當前 redis 伺服器狀態和一些統計信息。 # monitor 實時監聽並返回redis伺服器接收到的所有請求信息。 # shutdown 把數據同步保存到磁碟上,並關閉redis服務。 # config ...
  • create table CUX_IMPORT_DATA_E45 as select * from CUX_IMPORT_DATA_L11 where 1>2; CREATE TABLE CUX.lmh_segment1_E41 AS SELECT * FROM CUX.lmh_segment1_L ...
  • 即使是一個開發工程師,也只是 MySQL 的用戶,但在瞭解了一個個系統模塊的原理後,再來使用它,感覺是完全不一樣的。 當在代碼里寫下一行資料庫命令的時候,就能想到它在資料庫端將怎麼執行,它的性能是怎麼樣的,怎樣寫能讓應用程式訪問資料庫的性能最高。進一步,哪些數據處理讓資料庫系統來做性能會更好,哪些數 ...
  • 一、 對UI界面盡心自定義組件 package com.example.uicustomviews; ​ import android.app.Activity; import android.os.Bundle; import android.view.Menu; import android.v ...
  • 最近簡單學習了MVVM框架,記錄一下。 結果演示: 分析其功能在不同框架下的構成: 無框架 可以明顯感受到在無框架下,雖然一個單獨的Activity即可實現功能,但其負擔過重,代碼複查時繁瑣,一旦需要修改,複雜項目極難維護。 MVC 在MVC框架下,雖然將獲取數據與界面展示分割開來,但對於Contr ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...