• Vue:ElementUI练习(路由嵌套)路由嵌套 重定向(狂神)


    在自己保存目录E:/course/Vue下输入命令创建项目:

     第一个第二个使用默认,第三个输入kuangshen,第四个选择第一项:

     下一步全部选择:n

    初始化项目就完成了:

     

     

     

    在安装各种插件和组件:按照上面的命令一次输入

    安装vue-router:改为cnpm install vue-router@3.1.3 --save-dev,其他正常输入:

     

    • assets:用于存放资源文件
    • components:用于存放Vue功能组件
    • views:用于存放Vue视图组件
    • router:用于存放vue-router配置

     

    • 在views目录下创建首页视图Main.vue组件
    1. <template>
    2. <h1>首页</h1>
    3. </template>
    4. <script>
    5. export default {
    6. name: "Main"
    7. }
    8. </script>
    9. <style scoped>
    10. </style>
    • 在views目录下创建登录页面视图Login.vue组件:使用ElementUI
    1. <template>
    2. <div>
    3. <el-form ref="loginForm" :model="form" :rules="rules" label-width="80px" class="login-box">
    4. <h3 class="login-title">欢迎 登录</h3>
    5. <el-form-item label=" 账号" prop="username">
    6. <el-input type="text" placeholder="请输入账号" v-model="form.username"/>
    7. </el-form-item>
    8. <el-form-item label=" 密码" prop="password">
    9. <el-input type="password" placeholder=" 请输入密码" v-model="form.password"/>
    10. </el-form-item>
    11. <el-form-item>
    12. <el-button type="primary" v-on:click="onSubmit( 'loginForm' )">登录</el-button>
    13. </el-form-item>
    14. </el-form>
    15. <el-dialog
    16. title="温馨提示"
    17. :visible.sync="dialogVisible"
    18. width="30%"
    19. :before-close="handLeClose">
    20. <span>请输入账号和密码</span>
    21. <span slot="footer" class="dialog- footer">
    22. <el-button type="primary" @click="dialogVisible = false">确定</el-button>
    23. </span>
    24. </el-dialog>
    25. </div>
    26. </template>
    27. <script>
    28. export default {
    29. name: "Login",
    30. data() {
    31. return {
    32. form: {
    33. username: '',
    34. password: ''
    35. },
    36. //表单验证,需要在el-form-item 元素中增加prop 属性
    37. rules: {
    38. username: [
    39. {required: true, message: " 账号不可为空", trigger: 'blur'}
    40. ],
    41. password: [
    42. {required: true, message: " 密码不可为空 ", trigger: 'blur'}
    43. ]
    44. },
    45. //对话框显示和隐藏
    46. dialogVisible: false
    47. }
    48. },
    49. methods: {
    50. onSubmit(formName) {
    51. //为表单绑定验证功能
    52. this.$refs[formName].validate((valid) => {
    53. if (valid) {//只要不为空就通过
    54. //使用vue-router路由到指定页面,该方式称之为编程式导航
    55. this.$router.push("/main");
    56. } else {
    57. this.dialogVisible = true;
    58. return false;
    59. }
    60. });
    61. }
    62. }
    63. }
    64. </script>
    65. <style lang="scss" scoped>
    66. .login-box {
    67. border: 1px solid #DCDFE6;
    68. width: 350px;
    69. margin: 180px auto;
    70. padding: 35px 35px 15px 35px;
    71. border-radius: 5px;
    72. -webkit-border-radius: 5px;
    73. -moz-border-radius: 5px;
    74. box-shadow: 0 0 25px #909399;
    75. }
    76. .login-title {
    77. text-align: center;
    78. margin: 0 auto 40px auto;
    79. color: #303133;
    80. }
    81. </style>
    • 在router目录下创建一个名为index.js的vue-router路由配置文件
    1. import Vue from 'vue'
    2. import Router from 'vue-router'
    3. //导入组件
    4. import Main from '../view/Main'
    5. import Login from '../view/Login'
    6. Vue.use(Router)
    7. export default new Router({
    8. routes:[
    9. {
    10. path:'/main',
    11. component:Main
    12. },
    13. {
    14. path:'/login',
    15. component:Login
    16. }
    17. ]
    18. });
    • 编写 APP.vue
    1. <template>
    2. <div id="app">
    3. <router-link to="/login">login</router-link>
    4. <router-view></router-view>
    5. </div>
    6. </template>
    7. <script>
    8. export default {
    9. name: 'App',
    10. }
    11. </script>
    • main.js中配置路由
    1. import Vue from 'vue'
    2. import App from './App'
    3. import router from './router'
    4. import ElementUI from 'element-ui'
    5. import 'element-ui/lib/theme-chalk/index.css'
    6. //安转路由
    7. Vue.use(router)
    8. Vue.use(ElementUI)
    9. new Vue({
    10. el: '#app',
    11. router,
    12. render: h => h(App) //ElementUI
    13. })

    App.vue:

    1. <template>
    2. <div id="app">
    3. <router-link to="/login">login</router-link>
    4. <router-view></router-view>
    5. </div>
    6. </template>
    7. <script>
    8. export default {
    9. name: 'App',
    10. }
    11. </script>

    index.html;:

     

    <!DOCTYPE html>
    <html>
      <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width,initial-scale=1.0">
        <title>hello-vue</title>
      </head>
      <body>
        <div id="app"></div>
        <!-- built files will be auto injected -->
      </body>
    </html>
    
    • 测试npm run dev

    说明: 如果出现错误: 可能是因为sass-loader的版本过高导致的编译错误 ,可以去package.json文件中把sass-loder的版本降低,也有可能是node-sass版本过高,看报错内容修改相应的版本

     修改版本后需要重新在项目中下载:

    重新启动项目:

     

     

     

    点击login或者在控制台输入Login:

     

    只要内容不为空就能进行跳转到Main:

     

    不输入密码:

     

     

     

     路由嵌套:

    嵌套路由又称子路由,在实际应用中,通常由多层嵌套的组件组合而成

    • 创建用户信息组件,在 views/user 目录下创建一个名为 Profile.vue 的视图组件
    1. <template>
    2. <h1>个人信息</h1>
    3. </template>
    4. <script>
    5. export default {
    6. name: "Profile"
    7. }
    8. </script>
    9. <style scoped>
    10. </style>
    • 在用户列表组件在 views/user 目录下创建一个名为 List.vue 的视图组件
    1. <template>
    2. <h1>用户列表</h1>
    3. </template>
    4. <script>
    5. export default {
    6. name: "List"
    7. }
    8. </script>
    9. <style scoped>
    10. </style>
    • 修改首页视图,我们修改 Main.vue 视图组件,此处使用了 ElementUI 布局容器组件
    1. <template>
    2. <div>
    3. <el-container>
    4. <el-aside width="200px">
    5. <el-menu :default-openeds="['1']">
    6. <el-submenu index="1">
    7. <template slot="title"><i class="el-icon-caret-right"></i>用户管理</template>
    8. <el-menu-item-group>
    9. <el-menu-item index="1-1">
    10. <!--插入的地方-->
    11. <router-link to="/user/profile">个人信息</router-link>
    12. </el-menu-item>
    13. <el-menu-item index="1-2">
    14. <!--插入的地方-->
    15. <router-link to="/user/list">用户列表</router-link>
    16. </el-menu-item>
    17. </el-menu-item-group>
    18. </el-submenu>
    19. <el-submenu index="2">
    20. <template slot="title"><i class="el-icon-caret-right"></i>内容管理</template>
    21. <el-menu-item-group>
    22. <el-menu-item index="2-1">分类管理</el-menu-item>
    23. <el-menu-item index="2-2">内容列表</el-menu-item>
    24. </el-menu-item-group>
    25. </el-submenu>
    26. </el-menu>
    27. </el-aside>
    28. <el-container>
    29. <el-header style="text-align: right; font-size: 12px">
    30. <el-dropdown>
    31. <i class="el-icon-setting" style="margin-right: 15px"></i>
    32. <el-dropdown-menu slot="dropdown">
    33. <el-dropdown-item>个人信息</el-dropdown-item>
    34. <el-dropdown-item>退出登录</el-dropdown-item>
    35. </el-dropdown-menu>
    36. </el-dropdown>
    37. </el-header>
    38. <el-main>
    39. <!--在这里展示视图-->
    40. <router-view />
    41. </el-main>
    42. </el-container>
    43. </el-container>
    44. </div>
    45. </template>
    46. <script>
    47. export default {
    48. name: "Main"
    49. }
    50. </script>
    51. <style scoped lang="scss">
    52. .el-header {
    53. background-color: #B3C0D1;
    54. color: #333;
    55. line-height: 60px;
    56. }
    57. .el-aside {
    58. color: #333;
    59. }
    60. </style>

    添加了组件,修改index.js:

    //嵌套路由
    children:[
      //:id
      {path:'/user/profile/:id',name:'UserProfile',component:UserProfile,props:true},
      {path:'/user/list',component:UserList}
    ]
    1. import Vue from 'vue'
    2. import Router from 'vue-router'
    3. //导入组件
    4. import Main from '../view/Main'
    5. import Login from '../view/Login'
    6. import UserList from '../view/user/List'
    7. import UserProfile from '../view/user/Profile'
    8. Vue.use(Router)
    9. export default new Router({
    10. routes:[
    11. {
    12. path:'/main',
    13. component:Main,//嵌套路由
    14. children:[
    15. {path:'/user/profile',component:UserProfile},
    16. {path:'/user/list',component:UserList}
    17. ]
    18. },
    19. {
    20. path:'/login',
    21. component:Login
    22. }
    23. ]
    24. });

    点击登录后:

     

    点击个人信息:

     

     

     参数传递和重定向

    参数传递

    方法一

    • 修改路由配置, 主要是router下的index.js中的 path 属性中增加了 :id 这样的占位符
    {path:'/user/profile/:id',name:'UserProfile',component:UserProfile,props:true},
    1. import Vue from 'vue'
    2. import Router from 'vue-router'
    3. //导入组件
    4. import Main from '../view/Main'
    5. import Login from '../view/Login'
    6. import UserList from '../view/user/List'
    7. import UserProfile from '../view/user/Profile'
    8. Vue.use(Router);
    9. export default new Router({
    10. routes:[
    11. {
    12. path:'/main',
    13. component:Main,//嵌套路由
    14. children:[
    15. //:id
    16. {path:'/user/profile/:id',name:'UserProfile',component:UserProfile},
    17. {path:'/user/list',component:UserList}
    18. ]
    19. },
    20. {
    21. path:'/login',
    22. component:Login
    23. }
    24. ]
    25. });

    Main.vue添加:

    <router-link :to="{name:'UserProfile',params:{id:1}}">个人信息</router-link>
    1. <template>
    2. <div>
    3. <el-container>
    4. <el-aside width="200px">
    5. <el-menu :default-openeds="['1']">
    6. <el-submenu index="1">
    7. <template slot="title"><i class="el-icon-caret-right"></i>用户管理</template>
    8. <el-menu-item-group>
    9. <el-menu-item index="1-1">
    10. <!--插入的地方-->
    11. <!--name:传组件名 params:传递参数-->
    12. <router-link :to="{name:'UserProfile',params:{id:1}}">个人信息</router-link>
    13. </el-menu-item>
    14. <el-menu-item index="1-2">
    15. <!--插入的地方-->
    16. <router-link to="/user/list">用户列表</router-link>
    17. </el-menu-item>
    18. </el-menu-item-group>
    19. </el-submenu>
    20. <el-submenu index="2">
    21. <template slot="title"><i class="el-icon-caret-right"></i>内容管理</template>
    22. <el-menu-item-group>
    23. <el-menu-item index="2-1">分类管理</el-menu-item>
    24. <el-menu-item index="2-2">内容列表</el-menu-item>
    25. </el-menu-item-group>
    26. </el-submenu>
    27. </el-menu>
    28. </el-aside>
    29. <el-container>
    30. <el-header style="text-align: right; font-size: 12px">
    31. <el-dropdown>
    32. <i class="el-icon-setting" style="margin-right: 15px"></i>
    33. <el-dropdown-menu slot="dropdown">
    34. <el-dropdown-item>个人信息</el-dropdown-item>
    35. <el-dropdown-item>退出登录</el-dropdown-item>
    36. </el-dropdown-menu>
    37. </el-dropdown>
    38. </el-header>
    39. <el-main>
    40. <!--在这里展示视图-->
    41. <router-view />
    42. </el-main>
    43. </el-container>
    44. </el-container>
    45. </div>
    46. </template>
    47. <script>
    48. export default {
    49. name: "Main"
    50. }
    51. </script>
    52. <style scoped lang="scss">
    53. .el-header {
    54. background-color: #B3C0D1;
    55. color: #333;
    56. line-height: 60px;
    57. }
    58. .el-aside {
    59. color: #333;
    60. }
    61. </style>

    <!--name是组件的名字 params是传的参数 如果要传参数的话就需要用v:bind:来绑定--> <router-link :to="{name:'UserProfile',params:{id:1}}">个人信息</router-link>

    说明: 此时我们在Main.vue中的route-link位置处 to 改为了 :to,是为了将这一属性当成对象使用,注意 router-link 中的 name 属性名称 一定要和 路由中的 name 属性名称 匹配,因为这样 Vue 才能找到对应的路由路径

    接收参数:

     Profile.vue

    1. <template>
    2. <div>
    3. <h1>个人信息</h1>
    4. {{$route.params.id}}
    5. </div>
    6. </template>
    7. <script>
    8. export default {
    9. name: "Profile"
    10. }
    11. </script>
    12. <style scoped>
    13. </style>

     更改id为2:

    方法二 使用props 减少耦合 

    • 修改路由配置 , 主要在router下的index.js中的路由属性中增加了 props: true 属性
    {path:'/user/profile/:id',name:'UserProfile',component:UserProfile,props:true},

     

    1. import Vue from 'vue'
    2. import Router from 'vue-router'
    3. //导入组件
    4. import Main from '../view/Main'
    5. import Login from '../view/Login'
    6. import UserList from '../view/user/List'
    7. import UserProfile from '../view/user/Profile'
    8. Vue.use(Router);
    9. export default new Router({
    10. routes:[
    11. {
    12. path:'/main',
    13. component:Main,//嵌套路由
    14. children:[
    15. //:id
    16. {path:'/user/profile/:id',name:'UserProfile',component:UserProfile,props:true},
    17. {path:'/user/list',component:UserList}
    18. ]
    19. },
    20. {
    21. path:'/login',
    22. component:Login
    23. },
    24. {// 重定向
    25. path:'/goHome',
    26. redirect:'/main'
    27. }
    28. ]
    29. });
    • 在Profile.vue接收参数为目标组件增加 props 属性
    1. <template>
    2. <div>
    3. <h1>个人信息</h1>
    4. <!--{{$route.params.id}}-->
    5. {{id}}
    6. </div>
    7. </template>
    8. <script>
    9. export default {
    10. props:['id'],
    11. name: "Profile"
    12. }
    13. </script>
    14. <style scoped>
    15. </style>

     重定向

    Vue 中的重定向是作用在路径不同但组件相同的情况,用于跳转路径

    • 在router/index.js配置重定向路径
    {// 重定向
      path:'/goHome',
      redirect:'/main'
    }
    1. import Vue from 'vue'
    2. import Router from 'vue-router'
    3. //导入组件
    4. import Main from '../view/Main'
    5. import Login from '../view/Login'
    6. import UserList from '../view/user/List'
    7. import UserProfile from '../view/user/Profile'
    8. Vue.use(Router);
    9. export default new Router({
    10. routes:[
    11. {
    12. path:'/main',
    13. component:Main,//嵌套路由
    14. children:[
    15. //:id
    16. {path:'/user/profile/:id',name:'UserProfile',component:UserProfile,props:true},
    17. {path:'/user/list',component:UserList}
    18. ]
    19. },
    20. {
    21. path:'/login',
    22. component:Login
    23. },
    24. {// 重定向
    25. path:'/goHome',
    26. redirect:'/main'
    27. }
    28. ]
    29. });

    Main.vue,添加:

    <el-menu-item index="1-3">
        <!--插入的地方-->
        <router-link to="/goHome">返回首页</router-link>
    </el-menu-item>

    1. <template>
    2. <div>
    3. <el-container>
    4. <el-aside width="200px">
    5. <el-menu :default-openeds="['1']">
    6. <el-submenu index="1">
    7. <template slot="title"><i class="el-icon-caret-right"></i>用户管理</template>
    8. <el-menu-item-group>
    9. <el-menu-item index="1-1">
    10. <!--插入的地方-->
    11. <!--name:传组件名 params:传递参数-->
    12. <router-link :to="{name:'UserProfile',params:{id:1}}">个人信息</router-link>
    13. </el-menu-item>
    14. <el-menu-item index="1-2">
    15. <!--插入的地方-->
    16. <router-link to="/user/list">用户列表</router-link>
    17. </el-menu-item>
    18. <el-menu-item index="1-3">
    19. <!--插入的地方-->
    20. <router-link to="/goHome">回到首页</router-link>
    21. </el-menu-item>
    22. </el-menu-item-group>
    23. </el-submenu>
    24. <el-submenu index="2">
    25. <template slot="title"><i class="el-icon-caret-right"></i>内容管理</template>
    26. <el-menu-item-group>
    27. <el-menu-item index="2-1">分类管理</el-menu-item>
    28. <el-menu-item index="2-2">内容列表</el-menu-item>
    29. </el-menu-item-group>
    30. </el-submenu>
    31. </el-menu>
    32. </el-aside>
    33. <el-container>
    34. <el-header style="text-align: right; font-size: 12px">
    35. <el-dropdown>
    36. <i class="el-icon-setting" style="margin-right: 15px"></i>
    37. <el-dropdown-menu slot="dropdown">
    38. <el-dropdown-item>个人信息</el-dropdown-item>
    39. <el-dropdown-item>退出登录</el-dropdown-item>
    40. </el-dropdown-menu>
    41. </el-dropdown>
    42. </el-header>
    43. <el-main>
    44. <!--在这里展示视图-->
    45. <router-view />
    46. </el-main>
    47. </el-container>
    48. </el-container>
    49. </div>
    50. </template>
    51. <script>
    52. export default {
    53. name: "Main"
    54. }
    55. </script>
    56. <style scoped lang="scss">
    57. .el-header {
    58. background-color: #B3C0D1;
    59. color: #333;
    60. line-height: 60px;
    61. }
    62. .el-aside {
    63. color: #333;
    64. }
    65. </style>

  • 相关阅读:
    【C++ 学习 ㉝】- C++11 使用 using 定义别名
    C# wpf 无边框窗口添加阴影效果
    详解HTTP1.0、1.1、2.0版本区别/优化
    c++回顾与提高
    uni-app 5小时快速入门 5 目录结构
    uniapp 打包后各静态资源加载失败的问题(背景图,字体等)
    【JUC系列-09】深入理解ReentrantReadWriteLock的底层实现
    angular抛出 ExpressionChangedAfterItHasBeenCheckedError错误分析
    nlp入门(二) :商品信息可视化与文本分析实战
    让电子制造厂提高生产率的方法,学会受用终生!
  • 原文地址:https://blog.csdn.net/dengfengling999/article/details/125488467