Vue入门6、插槽(自定义分发)+router-view+重定向+嵌套路由

Vue入门6、插槽(自定义分发)+router-view+重定向+嵌套路由

项目沿用Vue入门5的项目,/views/Four.vue

插槽(自定义分发)

我们先来想想一个场景
我们的

  • 标签里的内容是从服务器里来的,不想写死
    在这里插入图片描述
  • <template>
    <div class="four">
        <h1>hello</h1>
        <el-row>
      <!--将函数绑定在了一个按钮上-->
      <el-button type="primary" v-on:click="tuanyou(1,2)">主要按钮</el-button>
      <!--使用kuaidian()调用函数-->
      <el-button type="warning" plain v-on:click="kuaidian()">警告按钮</el-button>
      <!--使用kuaidian调用函数-->
      <el-button type="danger" plain v-on:click="kuaidian">警告按钮</el-button>
    </el-row>
        <span>{{nenglian}}</span>
        <p>百家姓</p>
        <ul>
            <li></li>
            <li></li>
            <li></li>
        </ul>
    </div>
    </template>
    <script>
    export default {
        name: 'Four',
        data(){
            return{
                msg:'法外狂徒:张三'
            }
        },
        methods:{
            //tuanyou即为这个函数的名字,function标明了这是一个方法。(x,y)说明需要两个参数
            tuanyou:function(x,y){
                alert(x+y)
            },
            //定义一个不需要参数的函数
            kuaidian:function(){
                alert("hello kuaidian")
            }
        },
        created(){
            window.four=this
        },
        computed:{
            nenglian:function(){
                this.msg;
                return Date.now();
            }
        }
    }
    </script>
    <style>
    
    </style>
    

    1、components下新建baijiaxing.vue

    <template>
        <div>
            <slot></slot>
            <ul>
                <slot></slot>
            </ul>
        </div>
    </template>
    <script>
    export default {
        name: 'baijiaxing'
    }
    </script>
    <style scoped>
    
    </style>
    

    2、components下新建baijiaxingtitle.vue

    <template>
    <div>
        <p>{{title}}</p>
    </div>
    </template>
    <script>
    export default {
        name: 'baijiaxingtitle',
        props:['title']
    }
    </script>
    <style scoped>
    
    </style>
    

    3、components下新建baijiaxingul.vue

    <template>
    <li>{{item}}</li>
    </template>
    <script>
    export default {
        name: 'baijiaxingul',
        props:['item']
    }
    </script>
    <style scoped>
    
    </style>
    

    4、我们已经定义好两个插槽的名字了,回到baijiaxing.vue将name属性加进去

    这一步一定要加,我尝试过不加行不行,结论是不行

    <template>
        <div>
            <slot name="baijiaxingtitle"></slot>
            <ul>
                <slot name="baijiaxingul"></slot>
            </ul>
        </div>
    </template>
    <script>
    export default {
        name: 'baijiaxing'
    }
    </script>
    <style scoped>
    
    </style>
    

    5、在父组件中添加内容

    <template>
    <div class="four">
        <h1>hello</h1>
        <el-row>
      <!--将函数绑定在了一个按钮上-->
      <el-button type="primary" v-on:click="tuanyou(1,2)">主要按钮</el-button>
      <!--使用kuaidian()调用函数-->
      <el-button type="warning" plain v-on:click="kuaidian()">警告按钮</el-button>
      <!--使用kuaidian调用函数-->
      <el-button type="danger" plain v-on:click="kuaidian">警告按钮</el-button>
    </el-row>
        <span>{{nenglian}}</span>
    <!--1、baijiaxing,是因为他是一个组件,所以可以这样使用,请先编写这里,然后自动生成import,如果手动import再写这里,就可能会明明导入了,却报错未导入-->
    <baijiaxing>
        <baijiaxingtitle slot="baijiaxingtitle" v-bind:title="titleone"></baijiaxingtitle>
        <!--v-bind,前面是子组件的内容,后面是父组件的内容-->
        <baijiaxingul slot="baijiaxingul" v-for="(item,index) in items" v-bind:key="index" v-bind:item="item"></baijiaxingul>
    </baijiaxing>
    </div>
    </template>
    <script>
    import baijiaxing from '../components/baijiaxing.vue'
    import Baijiaxingtitle from '../components/baijiaxingtitle.vue'
    import Baijiaxingul from '../components/baijiaxingul.vue'
    
    export default {
      components: { baijiaxing, Baijiaxingtitle, Baijiaxingul },
        name: 'Four',
        data(){
            return{
                msg:'法外狂徒:张三',
                //数据从哪里来呢?在父组件中定义
                titleone : '百家姓',
                items:['赵','钱','孙']
            }
        },
        methods:{
            //tuanyou即为这个函数的名字,function标明了这是一个方法。(x,y)说明需要两个参数
            tuanyou:function(x,y){
                alert(x+y)
            },
            //定义一个不需要参数的函数
            kuaidian:function(){
                alert("hello kuaidian")
            }
        },
        created(){
            window.four=this
        },
        computed:{
            nenglian:function(){
                this.msg;
                return Date.now();
            }
        }
    }
    </script>
    <style>
    
    </style>
    

    路由嵌套

    我们新建一个views/User.vue

    <template>
        <div>
          <el-container>
            <el-aside width="200px">
              <el-menu :default-openeds="['1']">
                <el-submenu index="1">
                  <template slot="title"><i class="el-icon-caret-right"></i>用户管理</template>
                  <el-menu-item-group>
                    <el-menu-item index="1-1">
                    <!--插入的地方-->
                      <router-link to="/user/profile">个人信息</router-link>
                    </el-menu-item>
                    <el-menu-item index="1-2">
                    <!--插入的地方-->
                      <router-link to="/user/list">用户列表</router-link>
                    </el-menu-item>
                  </el-menu-item-group>
                </el-submenu>
                <el-submenu index="2">
                  <template slot="title"><i class="el-icon-caret-right"></i>内容管理</template>
                  <el-menu-item-group>
                    <el-menu-item index="2-1">分类管理</el-menu-item>
                    <el-menu-item index="2-2">内容列表</el-menu-item>
                  </el-menu-item-group>
                </el-submenu>
              </el-menu>
            </el-aside>
    
            <el-container>
              <el-header style="text-align: right; font-size: 12px">
                <el-dropdown>
                  <i class="el-icon-setting" style="margin-right: 15px"></i>
                  <el-dropdown-menu slot="dropdown">
                    <el-dropdown-item>个人信息</el-dropdown-item>
                    <el-dropdown-item>退出登录</el-dropdown-item>
                  </el-dropdown-menu>
                </el-dropdown>
              </el-header>
              <el-main>
              <!--在这里展示视图-->
                <router-view />
              </el-main>
            </el-container>
          </el-container>
        </div>
    </template>
    <script>
        export default {
            name: "user"
        }
    </script>
    <style scoped lang="scss">
      .el-header {
        background-color: #B3C0D1;
        color: #333;
        line-height: 60px;
      }
      .el-aside {
        color: #333;
      }
    </style>
    

    由于我们这个User.vue下用了

    这个scss是CSS预处理器,至于是个啥玩儿意,我也不清楚,这是搜出来的定义:

    CSS书写代码规模较大的Web应用时,容易造成选择器、层叠的复杂度过高,因此推荐通过SASS预处理器进行CSS的开发,SASS提供的变量、嵌套、混合、继承等特性,让CSS的书写更加有趣与程式化。

    所以我们要下载

    npm i node-sass -D
    
    npm i sass-loader -D
    

    views下新建文件夹user
    新建/views/user/profile

    <template>
        <div>
            <h1>用户信息</h1>
        </div>
    </template>
    <script>
    export default {
        name: 'profile'
        
    }
    </script>
    <style scoped>
    
    </style>
    

    新建/views/user/list

    <template>
        <div>
            <h1>用户列表</h1>
        </div>
    </template>
    <script>
    export default {
        name: 'list'
        
    }
    </script>
    <style scoped>
    
    </style>
    

    将页面全部加入到router/index.js中

    import Vue from 'vue'
    import VueRouter from 'vue-router'
    //  首先将页面导入进来
    import Main from '../views/Main'
    import Four from '../views/Four'
    import user from '../views/User'
    import List from '../views/user/list'
    import Profile from '../views/user/profile'
    
    Vue.use(VueRouter)
    
    const routes = [
      {
        //  标识一下路径
        path: '/main',
        //  组件就是我们刚刚引入的Main
        component: Main,
        //  name,就是起个名字,可有可无
        name: Main
      },
      {
        path:'/four',
        component: Four,
        name: Four
      },
      {
        path:'/user',
        component: user,
        name: user,
        children:[
          {
            path:'/user/list',
            component: List,
            name: List
          },
          {
            path:'/user/profile',
            component: Profile,
            name: Profile
          }
        ]
      }
      
    
    ]
    
    const router = new VueRouter({
      //将路由模式修改为history模式
      mode: 'history',
      routes
    })
    
    export default router
    
    

    上面的children关键字就是嵌套路由的关键字。
    但是启动项目会报下面的错

     ERROR  Failed to compile with 1 error                                                                                                                                      10:15:42 ├F10: AM┤
    
     error  in ./src/views/User.vue?vue&type=style&index=0&id=e0b47cf6&scoped=true&lang=scss&
    
    TypeError: this.getOptions is not a function
    
    
     @ ./src/views/User.vue?vue&type=style&index=0&id=e0b47cf6&scoped=true&lang=scss& 1:0-526 1:0-526
     @ ./src/views/User.vue
     @ ./src/router/index.js
     @ ./src/main.js
     @ multi (webpack)-dev-server/client?http://localhost:8090&sockPath=/sockjs-node (webpack)/hot/dev-server.js ./src/main.js
    

    原因百度出来说事sass版本太高了,我们就要降级一下

    npm uninstall --save node-sass // 卸载
    npm i node-sass@4.14.1 // 安装
    npm uninstall --save sass-loader // 卸载
    npm i -D sass-loader@8.x // 安装
    // 如果node-sass安装失败,也可以直接在package.json中写上版本号,删除node_modules文件夹,重新npm i即可
    
    

    结果图
    我们点击不同的链接整体页面是不变的,变化的只是那么一部分,哪一部分呢,就是下一小节的router-view
    在这里插入图片描述
    在这里插入图片描述

    router-view

    我们嵌套路由的子页面,展示在哪里呢,在User.vue中有这么一段,其中,el-main就是elementui标识的主展示区域,就相当于一个页面有一个左边框,一个上边框,剩余的是主展示区域,router-view放在这里,就表示在el-main里展示路由的子页面的信息。

              <el-main>
              <!--在这里展示视图-->
                <router-view />
              </el-main>
    

    重定向

    在User.vue中新增一段

                    <el-menu-item index="1-3">
                      <router-link to="/goHome">回到four页面</router-link>
                    </el-menu-item>
    

    在这里插入图片描述
    在router/index.js中新增重定向路由

      {
        path:'/goHome',
        redirect:'/four'
      },
    

    在这里插入图片描述
    效果
    点击回到four页链接
    在这里插入图片描述
    跳转到four页面
    在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值