kepro

(src/components/home/home.vue)

<template>

  <div>

    <HomeBanner/>

    <HomeMenu/>

    <HomeBlog/>

  </div>

</template>

<script>

import HomeBanner from './HomeBanner.vue'

import HomeMenu from './HomeMenu.vue'

import HomeBlog from './HomeBlog.vue'

export default {

    components:{

        HomeBanner,

        HomeMenu,

        HomeBlog

    }

};

</script>

<style scoped></style>

(src/components/home/homebanner.vue)

<template>

  <div class="banner">

    <swiper ref="mySwiper" :options="swiperOptions">

      <swiper-slide><img src="../../assets/images/html.png"/></swiper-slide>

      <swiper-slide><img src="../../assets/images/react.png"/></swiper-slide>

      <swiper-slide><img src="../../assets/images/vue.png"/></swiper-slide>

      <div class="swiper-pagination" slot="pagination"></div>

    </swiper>

  </div>

</template>

<script>

export default {

  data() {

    return {

      swiperOptions: {

        pagination: {

          el: ".swiper-pagination",

        },

        autoplay: {

            delay: 3000,

            disableOnInteraction: false,

        },

        loop:true

      },

    };

  },

};

</script>

<style scoped>

.banner img{

    width: 100vw;

    height: 170px;

}

</style>

(src/components/home/homeblog.vue)

<template>

  <div class="blog">

    <h4>推荐文章</h4>

    <div v-for="(item,index) in $store.state.hotblogs.blogs" :key="index">

        <div class="bg">

            {{item.title}}

            <div class="name">Angular</div>

        </div>

    </div>

  </div>

</template>

<script>

export default {};

</script>

<style scoped>

.blog{

    padding: 10px;

}

h4{

    margin-left: 10px;

    margin-bottom: 20px;

}

.bg{

    width: 100%;

    height: 100px;

    background: #ccc;

    text-align: center;

    line-height: 100px;

    margin-bottom: 10px;

    border-radius: 5px;

    /* 相对定位 */

    position: relative;

}

.name{

    /* 绝对定位 */

    position: absolute;

    background: #666;

    color: white;

    width: 80px;

    height: 30px;

    line-height: 30px;

    right: 10px;

    bottom: 10px;

    border-radius: 3px;

}

</style>

(src/components/home/homemenu.vue)

<template>

  <div class="menu">

    <div @click="gotoList(item.id)" v-for="(item,index) in $store.state.category" :key="index">

        <div class="bg" :style="{backgroundColor:bc()}">{{item.category | showFirst}}</div>

        <div class="name">{{item.category}}</div>

    </div>

  </div>

</template>

<script>

export default {

    // 定义一个过滤器

    filters:{

        showFirst(val){

            return val.substr(0,1)

        }

    },

    methods: {

        //随机生成背景颜色

        bc(){

            console.log(11);

            let arr = [6,7,8,9,'a','b','c','d','e','f']

            let color = '#'

            for(let i = 0;i<3;i++){

                color+= arr[Math.floor(Math.random()*10)]

            }

            return color

        },

        gotoList(id){

            this.$router.push('/category/'+id)

        }

    },

};

</script>

<style scoped>

.menu{

    display: flex;

    flex-wrap: wrap;

}

.menu>div{

    width: 25%;

    margin: 10px 0;

    display: flex;

    flex-direction: column;

    align-items: center;

    justify-content: center;

}

.bg{

    width: 44px;

    height: 44px;

    /* background: rgb(247, 167, 167); */

    border-radius: 50%;

    text-align: center;

    line-height: 44px;

}

</style>

(src/components/blogs/blogcontent.vue)

<template>

<div class="content">

    <div class="fhlb" @click="$router.push('/category/'+id)">

        >>>返回列表

    </div>

    <div>

        <div class="bt">{{blog.title}}</div>

        <div class="nr">{{blog.content}}</div>

    </div>

</div>

</template>

<script>

export default {

    // 这里接收两个参数

    props:['id','bid'],

    data() {

        return {

            // 定义一个blog对象

            blog:{}

        }

    },

    mounted() {

        this.blog = this.$store.state.category.find(r=>r.id==this.id).blogs.find(r=>r.id==this.bid)

    },

}

</script>

<style scoped>

.content{

    padding: 10px;

}

.fhlb{

    padding: 20px 0;

}

.bt{

    margin: 20px 0;

    text-align: center;

    font-weight: bold;

}

.nr{

    margin: 20px 0;

    text-align: center;

}

</style>

(src/components/blogs/blogcontent.vue)

<template>

  <div class="list">

      <div class="category">

          "{{category.category}}"类目下文章列表

      </div>

      <div @click="$router.push('/')">

          >>>返回首页

      </div>

      <div @click="gotoContent(item.id)" class="blogs" v-for="(item,index) in category.blogs" :key="index">

          {{item.title}}

      </div>

  </div>

</template>

<script>

export default {

  // 接收路由参数

  props: ["id"],

  data() {

    return {

      // 定义一个分类对象

      category: {},

    };

  },

  methods: {

      // 跳转到详情页

      gotoContent(bid){

          this.$router.push(`/category/${this.id}/${bid}`)

      }

  },

  // 页面挂载完成后

  mounted() {

    this.category = this.$store.state.category.find((r) => r.id == this.id);

    console.log(this.category);

  },

};

</script>

<style scoped>

.list{

    padding: 10px;

}

.category{

    margin: 20px 0;

    font-size: 20px;

    font-weight: bold;

}

.blogs{

    margin: 10px 0;

    padding: 10px 0;

    border-bottom: 1px solid #ccc;

}

</style>

(router/index.js)

import Vue from 'vue'

import VueRouter from 'vue-router'

Vue.use(VueRouter)

const routes = [

  {

    path:'/',

    component:()=>import("../components/Home/Home.vue")

  },

  {

    path:'/category/:id',

    props:true,

    component:()=>import("../components/Blogs/BlogList.vue")

  },

  {

    path:'/category/:id/:bid',

    props:true,

    component:()=>import("../components/Blogs/BlogContent.vue")

  }

]

const router = new VueRouter({

  routes

})

export default router

(store/index.js)

import Vue from "vue";

import Vuex from "vuex";

Vue.use(Vuex);

export default new Vuex.Store({

  state: {

    // 分类信息

    category: [

      {

        id: 0,

        category: "HTML",

        url: "/category/0",

        blogs: [

          {

            id: 0,

            title: "HTML5新增标签",

            content: "HTML5新增标签——内容",

          },

          {

            id: 1,

            title: "HTML基础语法",

            content: "HTML基础语法——内容",

          },

        ],

      },

      {

        id: 1,

        category: "CSS",

        url: "/category/1",

        blogs: [

          {

            id: 0,

            title: "CSS3新特性一览",

            content: "CSS3新特性一览——内容",

          },

          {

            id: 1,

            title: "CSS3动画使用",

            content: "CSS3动画使用——内容",

          },

        ],

      },

      {

        id: 2,

        category: "JavaScript",

        url: "/category/2",

        blogs: [

          {

            id: 0,

            title: "JavaScript内置对象一览表",

            content: "JavaScript内置对象一览表——内容",

          },

          {

            id: 1,

            title: "闭包的使用",

            content: "闭包的使用——内容",

          },

        ],

      },

      {

        id: 3,

        category: "HTTP",

        url: "/category/3",

        blogs: [

          {

            id: 0,

            title: "HTTP协议详细介绍",

            content: "HTTP协议详细介绍——内容",

          },

          {

            id: 1,

            title: "HTTP状态码一览",

            content: "HTTP状态码一览——内容",

          },

        ],

      },

      {

        id: 4,

        category: "React",

        url: "/category/4",

        blogs: [

          {

            id: 0,

            title: "React之状态管理",

            content: "React之状态管理——内容",

          },

          {

            id: 1,

            title: "React之脚手架使用",

            content: "React之脚手架使用——内容",

          },

        ],

      },

      {

        id: 5,

        category: "Vue",

        url: "/category/5",

        blogs: [

          {

            id: 0,

            title: "Vue常用指令",

            content: "Vue常用指令——内容",

          },

          {

            id: 1,

            title: "Vue生命周期",

            content: "Vue生命周期——内容",

          },

        ],

      },

      {

        id: 6,

        category: "Angular",

        url: "/category/6",

        blogs: [

          {

            id: 0,

            title: "Angular指令",

            content: "Angular指令——内容",

          },

          {

            id: 1,

            title: "Angular深入原理",

            content: "Angular深入原理——内容",

          },

        ],

      },

      {

        id: 7,

        category: "ES6",

        url: "/category/7",

        blogs: [

          {

            id: 0,

            title: "ECMAScript 的背景",

            content: "ECMAScript 的背景——内容",

          },

          {

            id: 1,

            title: "Promise 对象使用方法",

            content: "Promise 对象使用方法——内容",

          },

        ],

      },

    ],

    // 热点信息

    hotblogs: {

      id: 6,

      category: "Angular",

      url: "/category/6",

      blogs: [

        {

          id: 0,

          title: "Angular指令",

          content: "Angular指令——内容",

        },

        {

          id: 1,

          title: "Angular深入原理",

          content: "Angular深入原理——内容",

        },

      ],

    },

  },

  mutations: {},

  actions: {},

  modules: {},

});

(main.js)

import Vue from 'vue'

import App from './App.vue'

// 导入了路由

import router from './router'

// 导入了vuex

import store from './store'

// 导入swiper

import VueAwesomeSwiper from 'vue-awesome-swiper'

import 'swiper/css/swiper.css'

Vue.use(VueAwesomeSwiper)

Vue.config.productionTip = false

new Vue({

  router,

  store,

  render: h => h(App)

}).$mount('#app')

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,029评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,238评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,576评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,214评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,324评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,392评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,416评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,196评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,631评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,919评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,090评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,767评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,410评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,090评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,328评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,952评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,979评论 2 351

推荐阅读更多精彩内容