前天完成了一個新組件的開發,作的過程也是各類遇到問題,完全弄懂了slot,鞏固了一些flex佈局和jquery的知識,比起本身第一次作組件開發,如今已是可以下手作,遇到問題解決問題,還算有進步。javascript
可是昨天寫博客的時候,就在我快寫完的時候,chrome崩潰了。。。我也崩潰了。。。寫的東西全沒有了!!!我仍是繼續從新碼字吧。。。崩潰。。。html
作的這個組件給它起個什麼名字比較合理我想了半天也沒想出來。。。vue
需求是這樣的:java
核心代碼寫在下面~供參考哦 jquery
html插入nav-list模板:chrome
<div id="main"> <nav-list :navs="navs" :contents="contents"> <div v-for="con in contents" :class="'con_' + con.en_name" :slot="'con_' + con.en_name">{{ con.text }}</div> // :class要寫在這裏,而不要寫在<slot>上 </nav-list> </div>
子組件模板:佈局
這裏重點是如何使用slot,而且如何將navs的每個標籤和下面的div對應聯繫起來!flex
<template> <div class="navList"> <div class="nav"> <div v-for="nav in navs" v-bind:class="{ active: cur == nav.en_name }" v-on:click="changeNav(nav.en_name)">{{ nav.name }}</div> </div> <div class="list"> <slot v-for="nav in navs" :name="'con_' + nav.en_name"></slot> </div> </div> </template>
子模板的操做代碼:ui
return{ props: { navs: { type: Array , default: function(){ return {} } } , contents: { type: Array , default: function(){ return {} } } } , data: function(){ return { cur: this.navs[0].en_name // 能夠在data中這樣定義初始值, 這裏是將cur的初始值設定爲navs的第一個en_name值 } } , methods: { changeNav: function(index){ // 點擊任意標籤,調用該事件,改變其相應div的位置,即便整個頁面向上滑動必定的距離。 this.cur = index var pos = $(".con_" + index).position().top var pos2 = $('.navList').position().top // 這個是整個組件距離頁面頂端的距離。 $(window).scrollTop(pos+pos2) } , scroll: function(){ // scroll()這個事件是div滑動中止時觸發的,事件內部定義了:如何肯定是哪一個div在第一個顯示位置,從而找到相應的navs的標籤 var _this = this $(window).on('scrollStop', function(event) { for( attr in _this.navs ){ var curPos = $(".con_" + _this.navs[attr].en_name).offset().top var curPos2 = curPos + $(".con_" + _this.navs[attr].en_name).height() if( curPos <= $(window).scrollTop() + $(".nav").height() && $(window).scrollTop() + $(".nav").height() <= curPos2){ _this.cur = _this.navs[attr].en_name }else if($(window).scrollTop() < $('.navList').offset().top){ _this.cur = _this.navs[0].en_name } } }) } } , mounted: function(){ this.scroll() this.$nextTick(function(){ $('.nav').sticky({ // 這個也是直接寫好的置於頂部的組件,我也是直接將它用在nav上 infinity: true }) }) } }
以上是全部vue組件代碼,下面建立一個父實例的js文件:this
var sticky = require('core/m/sticky_vue') var vm = new Vue({ el: "#main" ,components: { navList: require('navList.vue') } , data: function(){ return { navs: [{ name: '美妝', en_name: 'makeup' } , { name: '時尚', en_name: 'fashion' } , { name: '鞋履', en_name: 'shoes' } , { name: '大牌', en_name: 'board'} , { name: '潮服', en_name: 'clothes'} ] , contents: [ { en_name: 'makeup', text: '美妝美妝'} , { en_name: 'fashion', text: '時尚在哪裏時尚在哪裏'} , { en_name: 'shoes', text: '鞋鞋鞋子'} , { en_name: 'board', text: '大牌駕到'} , { en_name: 'clothes', text: '服飾!!!'} ] } } })
以上就是全部的代碼了~在整個過程當中遇到的問題都是基礎知識不紮實,還有vue的使用不很流暢。大體有如下幾點: