因为上个月直接专注在 [iT邦铁人赛]
直接好几个礼拜都没有刷 [鼠年全马] 进度xD
这周回归来做我们美美的旅馆预约平台
来复习一下目前的进度
看起来首页的部分该有的都有了~
这篇就来把首页完善吧!!
Slide 文字目前只是装饰,但我们可以把它做的更好,让它真的有功能
这里使用Vuetify本身提供的 滚动指令 来做出简单的画面滚动动画
使用 button 元件包住 [Slide] 和 [>>],并加上点击事件:
<button @click="slideClick" style="outline: none;">
<div class="slidetext">
Slide
</div>
<div class="slideicon"><span>></span><span>></span></div>
</button>
点击事件内容:
使用 $vuetify.goTo()
方法 参考这边
methods: {
slideClick() {
//前往id叫做rooms的区块
this.$vuetify.goTo("#rooms", this.scrollOptions);
},
},
$vuetify.goTo(arg_1,arg_2)
滚动属性设定放在data:
data: () => ({
scrollOptions: {
duration: 600,
easing: "linear",
},
})
来看看效果图吧~
[首页] 最後要来写导向 [预约页面]
导向的时机在点选房间卡 RoomCard 的时候触发!!
首先, 我们在卡片组件 v-card 加上点击事件:
//RoomCard.vue
<v-card class="roomcard" @click="goto">
//v-card内容
</v-card>
事件中使用 $router.push()
方法导向到 [预约页面]
vue-router导页 参考这边
方法中设定带参数,把 RoomCard 详细资料带上
methods: {
goto() {
this.$router.push({ name: "Reservation", params: { room: this.room } });
},
},
接着到 Reservation 接收资料:
//Reservation.vue
export default {
name: "Reservation",
created() {
this.room = this.$route.params.room;
},
data: () => ({
room: {},
}),
};
取得参数资料之後,习惯放进後再使用
###################分隔线###################
上面是原本的写法,这里要介绍一招
开启路由设定页(router/index.js),在里面加上一段function:
//router/index.js
const mixProps = function () {
return route => {
return Object.assign({}, route.params, route.query)
}
}
mixProps
: 将传入的 params 及 query 合并在路由设定(routes)的部份加上:
const routes = [
{
...,
name: 'Reservation',
props: mixProps(), //加入这行
},
]
props: mixProps()
: 将合并後的物件使用 props 接收回到 Reservation 改成使用 props 接收参数就好罗!!
//Reservation.vue
export default {
name: "Reservation",
props: ["room"],
};
这样写就不用再分 params 或是 query,全都用 props 就好了~
是不是超酷的xD
页面跳转完成罗!!
[预约页面] 开始开发~先把它切好切满吧~
切好之後就建立对应的component之後放上画面吧~
//Reservation.vue
<template>
<div>
<ReservationTop />
<ReservationCard />
<ReservationInfo />
<Footer />
</div>
</template>
<script>
import Footer from "../components/Footer";
import ReservationTop from "../components/ReservationTop";
import ReservationCard from "../components/ReservationCard";
import ReservationInfo from "../components/ReservationInfo";
export default {
name: "Reservation",
components: { ReservationTop, ReservationCard, ReservationInfo, Footer },
};
</script>
因为左右两边各占一半,可以利用 grid 来帮忙切
<div class="row">
<div class="col-6"><ReservationCard /></div>
<div class="col-6"><ReservationInfo /></div>
</div>
row 预设有外距 -12px,可以加上 pa-0 ma-0
让内外距为0
<div class="row pa-0 ma-0">
<div class="col-6"><ReservationCard /></div>
<div class="col-6"><ReservationInfo /></div>
</div>
Reservation.vue 的部分先到这边结束~
再来从上往下开始做,从 ReservationTop.vue 开始
[标题] 是由3张图片 + 1个标题组合
图片的部分,利用 grid 来切分为2:1,使用 Vuetify-Images图片组件,先用官方提供的图片来生成画面:
//ReservationTop.vue
<div class="row pa-0">
<div class="col-8">
<v-img src="https://picsum.photos/500/300?image=10"></v-img>
</div>
<div class="col-4">
<v-img src="https://picsum.photos/500/300?image=15"></v-img>
<v-img src="https://picsum.photos/500/300?image=20"></v-img>
</div>
</div>
图片中间被留白了,因为 col 本身有内距,可以加上 pa-0
让内距为0:
<div class="col-8 pa-0">
<v-img src="https://picsum.photos/500/300?image=10"></v-img>
</div>
<div class="col-4 pa-0">
<v-img src="https://picsum.photos/500/300?image=15"></v-img>
<v-img src="https://picsum.photos/500/300?image=20"></v-img>
</div>
这里的范例刚好都是横向图片, 如果放上直向图片就会超出高度,於是这里加上高度限制:
<div class="col-8 pa-0">
<v-img src="https://picsum.photos/500/300?image=10" max-height="428"></v-img>
</div>
<div class="col-4 pa-0">
<v-img src="https://picsum.photos/500/300?image=15" max-height="214"></v-img>
<v-img src="https://picsum.photos/500/300?image=20" max-height="214"></v-img>
</div>
标题的部分,先使用绝对定位与图片重叠, 然後使用 d-flex
让整体定位在右下方:
<div class="restitle d-flex align-self-end justify-end">
<div>This is Title</div>
</div>
.restitle {
width: 100%;
position: absolute;
}
接着要计算一下内容的位移(要自己算):
.restitle div {
margin-bottom: -56px;
margin-right: 80px;
}
最後套上设计师的CSS:
.restitle {
width: 100%;
position: absolute;
font: Italic 110px/138px Rage;
letter-spacing: 17.6px;
color: #496146;
}
美爆了
接着将真实资料从 Reservation.vue 传入:
//Reservation.vue
<ReservationTop :name="room.name" :imageUrl="room.imageUrl" />
回到 ReservationTop.vue 接收:
//ReservationTop.vue
export default {
name: "ReservationTop",
props: ["name", "imageUrl"],
};
套上真实资料:
<template>
<div class="row pa-0 ma-0">
<div class="col-8 pa-0">
<v-img :src="imageUrl[0]" max-height="428"></v-img>
</div>
<div class="col-4 pa-0">
<v-img :src="imageUrl[1]" max-height="214"></v-img>
<v-img :src="imageUrl[2]" max-height="214"></v-img>
</div>
<div class="restitle d-flex align-self-end justify-end">
<div>{{ name }}</div>
</div>
</div>
</template>
[标题] 的部分完成罗~
来看看画面吧~
这周开始继续维持每周一篇的频率往金角奖迈进
(必要时会多补几篇进度xD)
附上这次进度的云端压缩档, 执行前记得先npm install
有需要改进或是任何意见建议欢迎下面留言~
今天会来实作OPA的配置,由於之前有透过rancher管理了k8s环境,所以就可以从rancher的...
深度追踪是刷题前一定要了解的观念! 今天就来用Depth-first-searh的方式来走访一棵树吧...
不管是哪种测试,都是为了确保程序码的品质,以及是否符合需求规格。而单元测试是工程师确保自身产出的一种...
openwrt虽然主力是在网路服务,但如果硬体与韧体的支援上有GPIO(通用型之输入输出的简称),也...
一、前言 在大家入行当网页工程师前,一定都会做很多功课,了解前後端工程师技能树与後期发展性等等,...