摘要:主顯示區(qū)我們在中先引用另外兩個組件并且修改路由配置組件姓名屬性性別種類身高體重捕獲成功請?zhí)钊胪暾`信息通過方法派發(fā)一個事件,用來保存新捕獲的精靈對于需添加并且設(shè)置名字與種類未填寫時無法提交。
花了兩周,看了許久的文檔和案例,還是要實踐一下,于是做了這個demo,設(shè)計就這樣看吧,我的設(shè)計水平真心不好T^T,一周目的demo是靜態(tài)的,二周目再搭建數(shù)據(jù)層。
項目倉庫:https://github.com/gknpezgssb...
項目簡介鑒于最近的pokemon大熱,這次的demo也選擇了pokemon主題的(其實我是想選守望屁股來著的)。
主體項目結(jié)構(gòu):
Demo:
主顯示區(qū)域(這里由vue-router控制)可進行三個界面的切換;
功能區(qū)域(由logo按鈕,搜索欄,pokemon列表,精靈捕獲記錄四個部分組成)
各部分功能
點擊捕獲按鈕,主界面切換,可以記錄pokemon信息,點擊捕獲成功后列表會自動更新(原諒科幻迷的我 (/≥▽≤/))
可以在搜索欄中用你給精靈起的名字尋找你的pokemon
點擊具體精靈會顯示他的信息
vue-cli是一款腳手架工具,使用他能幫你自動生成模版,免去繁雜的配置工作,這里我選用了webpack的模版。
首先安裝vue-cli:
npm install -g vue-cli
之后進入項目目錄,安裝依賴的包:
vue init webpack vue-time-tracker cd vue-time-tracker npm install
此時,執(zhí)行 npm run dev,在地址欄輸入localhost:8080,如果成功看到下圖就說明你已經(jīng)搭好框架了
main.js 與 App.vue 配置首先將 index.html 改寫成
yourpokemon
安裝vue-router
npm install vue-router --save
在main.js加入如下代碼:
import Vue from "vue" import App from "./App" import Home from "./components/Home" import VueRouter from "vue-router" Vue.use(VueRouter) const router = new VueRouter() router.map({ "/home": { component: Home } }) router.redirect({ "*": "/home" }) router.start(App, "#app")
這里暫時先引用Home組件。
我們引用了vue與vue-router,并且通過map配置了路由,這樣在任何標簽(不限于a)上使用v-link都能實現(xiàn)路由變化。
這樣App.vue中的內(nèi)容會替換掉到index里的div,這里左部的主題區(qū)域用vue-router來控制,右邊的功能區(qū)域自定義組件asidebar。
接下來我們在App.vue中添加
import Asidebar from "./components/Asidebar.vue" export default { components: { "asidebar": Asidebar }, data () { let monstersData = [ { name: "艾薩克·阿西莫夫", type: "thunder", species: "皮卡丘", height: "0.4m", weight: "6.0kg ", sex: "male" }, { name: "亞瑟·克拉克", type: "grass", species: "妙蛙種子", height: "0.7m", weight: "6.9kg ", sex: "female" } ] return { monsters: monstersData } }, events: { } }
這里引用組件Asidebar,偽造兩組數(shù)據(jù),通過v-bind進行父子組件通信,詳見使用props傳遞數(shù)據(jù)。
最后往App.vue添加樣式
*{ margin: 0; padding: 0; box-sizing:border-box; } #pokemon{ width: 100vw; height: 100vh; background-image: url(./assets/bg.jpg); background-position: center center; display: -webkit-flex; display: -moz-flex; display: -ms-flex; display: -o-flex; display: flex; justify-content: center; -ms-align-items: center; align-items: center; } .gb-main{ width: 500px; border: 20px solid #444; float: left; height: 100%; } .game-boy{ box-shadow: 0 0 15px #333; width: 800px; height: 450px; background-color: #fff; border: 25px solid #fc0; border-radius: 18px 18px 13px 13px; }倒騰 Sidebar.vue
首先添加html:
{{item.species}}:{{item.name}}
這里設(shè)置了v-link使
logo按鈕能訪問home頁面
li標簽?zāi)茉L問detail頁面
button按鈕能訪問new頁面
可以看到搜索欄綁定了v-model,通過他結(jié)合li上的search函數(shù)即可實現(xiàn)列表的搜索
在li上的click事件,綁定了show函數(shù),他實現(xiàn)了一個事件派發(fā),傳遞到App.vue后再由其進行廣播。js代碼如下:
export default { data () { return {search: ""} }, props: ["items"], filters: { search (name) { return name.filter(item => item.name.indexOf(this.search) > -1) } }, methods: { show (item) { let index = this.items.indexOf(item) this.$dispatch("findMonster", index) } } }
css代碼如下:
.gb-aside{ position: relative; float: right; width: 250px; background-color: #FC0; height: 100%; padding-left: 25px; } .gb-list{ list-style: none; background-color: #fff; width: 100%; margin-top: 20px; margin-bottom: 20px; height: 200px; overflow-y: scroll; overflow-x:hidden; } .monster{ cursor: pointer; width: 100%; height: 40px; border-bottom: 1px solid #dadada; position: relative; padding-left: 43px; position: relative; } .m-name{ width: 150px; line-height: 40px; font-size: 12px; color: #666; white-space: nowrap; overflow: hidden; -ms-text-overflow: ellipsis; text-overflow: ellipsis; } .m-name span{ font-size: 14px; color: #333; } .m-img.grass{ background-image: url(../assets/grass.png); } .m-img.thunder{ background-image: url(../assets/thunder.png); } .m-img.water{ background-image: url(../assets/water.png); } .m-img.fire{ background-image: url(../assets/fire.png); } .m-img.normal{ background-image: url(../assets/normal.png); } .m-img.chonoryoku{ background-image: url(../assets/chonoryoku.png); } .m-img.wrestle{ background-image: url(../assets/wrestle.png); } .m-img{ background-position: center center; -webkit-background-size: 23px 23px; background-size: 23px 23px; background-repeat: no-repeat; width: 30px; height: 40px; position: absolute; left: 5px; top: 0; } .m-img img{ width: 25px; height: 25px; } .gb-logo{ height: 60px; background-image: url(../assets/logo.png); background-repeat: no-repeat; background-position: center top; -webkit-background-size: auto 20px; background-size: auto 40px; cursor: pointer; } .gb-search{ width: 100%; display: block; border: 0px; height: 40px; padding-left: 1em; font-size: 18px; color: #333; /*margin-top: 60px;*/ } .gb-catch{ background-color: #fff; cursor: pointer; position: absolute; bottom: 10px; left: 25px; right: 0; margin: 0px auto; border: 0; width: 150px; height: 50px; border-radius: 25px; padding-left: 70px; font-size: 18px; line-height: 50px; color: #666; text-align: left; } .gb-catch::before{ background-image: url(../assets/ball.png); background-position: center center; background-repeat: no-repeat; -webkit-background-size:auto 40px ; background-size:auto 40px ; content:""; position: absolute; left: 3px; top: 0; width: 50px; height: 50px; animation-name: catch-pokemon; animation-duration:2s; animation-timing-function:linear; animation-iteration-count:infinite; animation-direction:normal; } @keyframes catch-pokemon { from { transform:rotate(0deg); } to { transform:rotate(360deg); } }
我門還需對App.vue添加事件
events: { findMonster (index) { let monster = this.monsters[index] this.$broadcast("showMonster", monster) } }
這里接受到事件派發(fā)的App.vue又進行了一次事件廣播實現(xiàn)了子組件的通信,當然還有更好的方式這里純粹是為了使用dispatch和broadcast.( ̄▽ ̄")
關(guān)于這塊詳見vue api broadcast和dispatch。
主顯示區(qū)我們在main.js中先引用另外兩個組件
import New from "./components/NewMonster" import Detail from "./components/Detail" //并且修改路由配置 router.map({ "/home": { component: Home }, "/new": { component: New }, "/detail": { component: Detail } })
NewMonster 組件
通過save方法派發(fā)一個事件,用來保存新捕獲的精靈;
對于App需添加events
events: { catch (monster) { this.monsters.push(monster) }, findMonster (index) { let monster = this.monsters[index] this.$broadcast("showMonster", monster) } }
并且設(shè)置名字與種類未填寫時無法提交。
Detail 組件
{{monster.name}}
{{monster.species}}
{{monster.height}}
{{monster.weight}}
{{monster.sex}}
App.vue廣播的時間被Detail收到從而實現(xiàn)右側(cè)列表點擊左側(cè)內(nèi)容切換的效果。
Home 組件
這是一個純粹靜態(tài)的組件,代碼也很簡短:
總結(jié){{msg}}
這只是一個很粗糙的試手Demo,有很多代碼需要優(yōu)化,會在二周目進行,二周目也會搭建真實的數(shù)據(jù)層;
demo真的沒有什么實際的用處╮(╯_╰)╭ ,但是vue卻是實用且精致的典范
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/86426.html
摘要:提示本文是個人的一點小筆記用來記錄開發(fā)中遇到的輪播圖問題和問題會不斷學習各種輪播圖添加到本文當中也有可能會上線方便看效果開始制作超簡易呼吸輪播簡單粗暴的使用制作的輪播圖這里解釋一下原理動畫效果就像車輛穿行隧道定好初始位置最終位置設(shè)定好運動 提示 本文是個人的一點小筆記,用來記錄開發(fā)中遇到的輪播圖問題和vue-transition問題. 會不斷學習各種輪播圖添加到本文當中 也有可能會上線...
摘要:由出品的前端開源項目周報第二期來啦。我們的前端開源周報集合了一周來新收錄的優(yōu)質(zhì)的前端開發(fā)方面的開源項目,方便前端開發(fā)人員便捷的找到自己需要的項目工具等。 由OpenDigg?出品的前端開源項目周報第二期來啦。我們的前端開源周報集合了OpenDigg一周來新收錄的優(yōu)質(zhì)的前端開發(fā)方面的開源項目,方便前端開發(fā)人員便捷的找到自己需要的項目工具等。 react-fix-it 根據(jù)error自動生...
摘要:由出品的前端開源項目周報第二期來啦。我們的前端開源周報集合了一周來新收錄的優(yōu)質(zhì)的前端開發(fā)方面的開源項目,方便前端開發(fā)人員便捷的找到自己需要的項目工具等。 由OpenDigg?出品的前端開源項目周報第二期來啦。我們的前端開源周報集合了OpenDigg一周來新收錄的優(yōu)質(zhì)的前端開發(fā)方面的開源項目,方便前端開發(fā)人員便捷的找到自己需要的項目工具等。 react-fix-it 根據(jù)error自動生...
摘要:由出品的前端開源項目周報第二期來啦。我們的前端開源周報集合了一周來新收錄的優(yōu)質(zhì)的前端開發(fā)方面的開源項目,方便前端開發(fā)人員便捷的找到自己需要的項目工具等。 由OpenDigg?出品的前端開源項目周報第二期來啦。我們的前端開源周報集合了OpenDigg一周來新收錄的優(yōu)質(zhì)的前端開發(fā)方面的開源項目,方便前端開發(fā)人員便捷的找到自己需要的項目工具等。 react-fix-it 根據(jù)error自動生...
閱讀 3656·2021-10-12 10:11
閱讀 1020·2021-09-22 15:42
閱讀 3472·2019-08-30 13:06
閱讀 912·2019-08-29 17:05
閱讀 1657·2019-08-29 12:21
閱讀 2386·2019-08-29 11:31
閱讀 1141·2019-08-23 18:37
閱讀 1263·2019-08-23 14:58