iT邦幫忙

2

pug 基礎介紹(2) DAY100

Jade 匯入外部 JSON 資料內容

這裡我們先自行新增2份 jaon檔
https://ithelp.ithome.com.tw/upload/images/20201125/20123039S991ou3te2.jpg


**menu.json**
{
    "list":[{
        "name": "首頁",
        "url": "index.html"
    },
    {
        "name": "分頁",
        "url": "page.html"
    }]
}

data.json

{
    "records":[
        {
            "Ticketinfo": "免費參觀",
            "Zone": "三民區",
            "Add": "高雄市三民區建國二路318號",
            "Opentime": "週二至週日10:00-18:00,每週一公休",
            "Name": "高雄願景館",
            "Picture1": "http://khh.travel/FileArtPic.ashx?id=705&w=1280&h=960"
        }
    ]
}

由於我們要把 json檔匯入到專案內
我們須透過一個 gulp 套件
gulp-data
https://www.npmjs.com/package/gulp-data

npm install gulp-data --save

並在 jade
加上

.pipe($.data(function(){
        // 檔案從外部匯進來
        let kh = require("./source/data/data.json");
        let menu = require("./source/data/menu.json");
        let source = {
            'kh': kh,
            'menu': menu
        }
        return source;
    }))

這裡 return一個物件
加上結果

gulp.task('jade', function() {
    return gulp.src('./source/**/*.jade')
    .pipe($.plumber())
    .pipe($.data(function(){
        let page = require("./source/data/data.json");
        let menu = require("./source/data/menu.json");
        let source = {
            'page': page,
            'menu': menu
        }
        return source;
    }))
    .pipe($.jade({
        pretty: true
    }))
    .pipe(gulp.dest('./public/'))
    .pipe(browserSync.stream())
});

為了顯示
我們在 index.jade 加入

 h1 #{menu.list[1].name}

這裡使用 #{} 接收變數
且它是從屬性開始 並非 source.menu.list[1].name
https://ithelp.ithome.com.tw/upload/images/20201126/201230391NDN2ouJza.jpg


使用 Each 處理資料並產生選單

這裡我們會利用 menu.json 來繪製我們的 navbar
修改 navbar.jade 為
這裡要注意 我們有使用 each

 //  menu.list 為陣列
 each item in menu.list

這裡的 item 為 menu.list 裡面的一個個物件

nav.navbar.navbar-expand-lg.navbar-light.bg-light
            a.navbar-brand(href='#') Navbar
            button.navbar-toggler(type='button' data-toggle='collapse' data-target='#navbarNav' aria-controls='navbarNav' aria-expanded='false' aria-label='Toggle navigation')
                span.navbar-toggler-icon
            #navbarNav.collapse.navbar-collapse
                ul.navbar-nav
                    each item in menu.list
                        li.nav-item.active
                            a.nav-link(href='#{item.url}')
                                | #{item.name}

接著我們再開一個 list.jade
然後找一個 bootstrap4 卡片元件 轉為 jade 格式 貼入

extend layout.jade

block  content
    .card-columns
        .card
            img.card-img-top(src='...' alt='...')
            .card-body
                h5.card-title Card title that wraps to a new line
                p.card-text
                    | This is a longer card with supporting text below as a natural lead-in to additional content. This content is a little bit longer.


再來我們就是要用 each 把資料帶入卡片內啦~~

extend layout.jade

block navbar
    include partials/navbar.jade

block  content
    .card-columns
        each item in kh.records
            .card
                img.card-img-top(src='#{item.Picture1}' alt='...')
                .card-body
                    h5.card-title #{item.Name}
                    p.card-text
                        | #{item.Opentime}

https://ithelp.ithome.com.tw/upload/images/20201126/20123039k4XLF3jtTG.jpg


使用 Mixin 來製作 HTML 模組

由於開發的時候 程式碼會過於冗長

所以我們可以利用 mixin 來解決此問題

https://pugjs.org/language/mixins.html

這裡我們來修改 navbar
原本 navnar.jade

nav.navbar.navbar-expand-lg.navbar-light.bg-light
    a.navbar-brand(href='#') Navbar
    button.navbar-toggler(type='button' data-toggle='collapse' data-target='#navbarNav' aria-controls='navbarNav' aria-expanded='false' aria-label='Toggle navigation')
        span.navbar-toggler-icon
    #navbarNav.collapse.navbar-collapse
        ul.navbar-nav
            each item in menu.list
                +link(item.url,item.name)
                li.nav-item.active
                    a.nav-link(href='#{item.url}')
                        | #{item.name}

我們在上面新增 mixin

mixin link(url,name)
    li.nav-item
        a.nav-link(href='#{url}')
            |  #{name}
            
nav.navbar.navbar-expand-lg.navbar-light.bg-light
    a.navbar-brand(href='#') Navbar
    button.navbar-toggler(type='button' data-toggle='collapse' data-target='#navbarNav' aria-controls='navbarNav' aria-expanded='false' aria-label='Toggle navigation')
        span.navbar-toggler-icon
    #navbarNav.collapse.navbar-collapse
        ul.navbar-nav
            each item in menu.list
                +link(item.url,item.name)

利用 +link 並傳入參數
會發現 navbar 沒有改變 這是正常的><

接著我們利用變數搭配 if else 來實現 active 效果
我們在 index.jade 與 list.jade 加入

 - var path = "index.html"
 - var path = "list.html"

並把mixin 修改為

這裡為什麼要設變數呢??

因為在jade
我們不知道目前頁面是在哪一個頁面

若變數與url 相同
則有 active 效果
否則沒有

mixin link(url,name)
    if(path === url)
        li.nav-item.active
            a.nav-link(href='#{url}')
                |  #{name}
    else
        li.nav-item
            a.nav-link(href='#{url}')
                |  #{name}

那今天的介紹就到這裡
有任何問題 或 內容有誤
都可以跟我說唷/images/emoticon/emoticon41.gif

連續發文100天 達成!!/images/emoticon/emoticon42.gif


圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言