做一个vue模态弹出框如何?

运用的知识点包括:

路由的配置

插槽

vue的过渡动画

路由重定向

router/index.js里面配置路由

import Vue from 'vue'
import Router from 'vue-router'
import Home from '@/components/home'
import About from '@/components/about'

Vue.use(Router)

export default new Router({
  mode:'history',
  routes: [
    {
      path: '/home',
      name: 'Home',
      component: Home
    },
    {
      path: '/about',
      name: 'About',
      component: About
    },
    { path: '/', redirect:'/home' }
    
  ]
})

app.vue

<template>
  <div >
   <router-link :to="{path:'/home'}">home</router-link>
   <router-link :to="{path:'/about'}">about</router-link>
    <router-view/>
  </div>
</template>

<script>
export default {
  name: 'App'
}
</script>

<style>
#app {
  font-family: 'Avenir', Helvetica, Arial, sans-serif;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  text-align: center;
  color: #2c3e50;
  margin-top: 60px;
}
</style>

home.vue

<template>
  <div class="home">
   <p>{{msg}}</p>
  <transition name="slide-fade">
   <v-modal v-show="modalStatus" :title="title" :content="content" :btnType="btnType">
    <slot>

    <button v-for="item in btnType" :class="item.class" @click="modalStatus=false">

      {{item.vlaue}}

    </button>

    </slot>
   </v-modal>
  </transition>
   <button @click="openHomeModal()">打开modal</button>


  
  </div>
</template>

<script>
import Modal from "@/components/modal.vue";
export default {
  name: "HelloWorld",
  data() {
    return {
      msg: "我是首页信息",
      modalStatus: false,
      title: "我是首页,我骄傲",
      content: "我是首页的内容",

btnType: [{"value":"确定","class":"danger"},{"value": "取消","class":"defalut"}]


}; }, components: { "v-modal": Modal }, methods: { openHomeModal() { this.modalStatus = true; } } }; </script> <!-- Add "scoped" attribute to limit CSS to this component only --> <style scoped > /* 可以设置不同的进入和离开动画 */ /* 设置持续时间和动画函数 */ .slide-fade-enter-active { transition: all .3s ease; } .slide-fade-leave-active { transition: all .2s cubic-bezier(1.0, 0.5, 0.8, 1.0); } .slide-fade-enter, .slide-fade-leave-to /* .slide-fade-leave-active for below version 2.1.8 */ { transform: translateY(-10px); opacity: 0; } </style>

about.vue

<template>
    <div class="about">
        <p>{{aboutmsg}}</p>
        <button @click="openHomeModal()">打开about里面的modal</button>
       <transition name="slide-fade">
         <v-modal v-show="modalStatus" :title="title" :content="content">
         
      <slot>

     <button v-for="item in btnType" :class="item.class" @click="modalStatus=false">

      {{item.vlaue}}

     </button>

      </slot>
         </v-modal>
       </transition>
    </div>
</template>
<script>
import Modal from "@/components/modal.vue";
export default {
  data() {
    return {
      modalStatus: false,
      aboutmsg: "我是关于页面",
      title: "我是关于页面的title",
      content: "我是关于页面的内容",
btnType:["value":"确定","class":"default"]
}; }, methods: { openHomeModal() { this.modalStatus = true; } }, components: { "v-modal": Modal } }; </script> <style > /* 可以设置不同的进入和离开动画 */ /* 设置持续时间和动画函数 */ .slide-fade-enter-active { transition: all .3s ease; } .slide-fade-leave-active { transition: all .2s cubic-bezier(1.0, 0.5, 0.8, 1.0); } .slide-fade-enter, .slide-fade-leave-to /* .slide-fade-leave-active for below version 2.1.8 */ { transform: translateY(-10px); //从上面下移,逐渐出现 opacity: 0; } </style>

modal.vue

<template>
    <div class="modal">
        <div class="header">{{title}}</div>
        <div class="content">{{content}}</div>
        <div class="footer">
            <slot></slot>
        </div>
    </div>
</template>
<script>
export default{
    data(){
        return {}
    },
    props:['title','content'],
   
}
</script>
<style >
.modal {
    width:500px;
    height:400px;
    position: absolute;
    top:50%;
    left:50%;
    margin-toP:-250px;
    margin-left:-200px;
    border:1px solid #666;
  .header {
      height:60px;
      line-height:60px;
      text-align: center;
      background:#666;
      border-bottom: 1px solid #000;
      box-sizing: border-box;
  }
  .content {
      background:orange;
      height:290px;

  }
  .footer {
      height:50px;
      line-height: 50px;
      button {
       vertical-align: middle;
        display: inline-block;
        width:80px;
        height:40px;
        line-height: 40px;
         color:#fff;
        &.danger{
            background:red;
        
           
        }
        &.default{
            background:#ddd;
        }
     
    }
    
  }
}
</style>