精华内容
下载资源
问答
  • Vue03_Router路由、ElementUI和Axios的使用

    万次阅读 2020-09-11 14:33:12
    Vue03_Router路由和ElementUI的使用 安装vue-router npm install vue-router 安装ElementUI npm i element-ui -S 在Vue项目下创建router目录,在其中创建index.js文件: import Vue from 'vue' import VueRouter ...

    Vue03_ Router路由、ElementUI 和 Axios 的使用


    安装vue-router

    npm install vue-router
    

    安装ElementUI

    npm i element-ui -S
    

    安装Axios

    npm install axios
    

    在Vue项目下创建router目录,在其中创建index.js文件:

    import Vue from 'vue'
    import VueRouter from 'vue-router'
    //引入组件
    import Content from "../components/Content";
    import Main from "../components/Main";
    import list from "../components/list";
    import Profile from "../components/Profile";
    import NotFound from "../components/NotFound";
    
    //声明使用路由
    Vue.use(VueRouter);
    
    //配置导出路由,编写路由参数:
    export default new VueRouter({
      routes:[
        {
          path: '/content',
          component: Content,
          name: 'Content'
        },
        {
          path: '/main',
          component: Main,
          name: 'Main',
          children: [
            {
              path: '/user/list/:username',
              component: list,
              name: 'userlist',
              props: true
            },
            {
              path: '/user/profile/:id',
              component: Profile,
              name: 'userProfile'
            },
            {
              path: '/goHome',
              redirect: '/main'
            }
          ]
        },
        {
          path: '*',
          component: NotFound
        },
        {
          path: '/',
          redirect: '/main'
        }
      ]
    });
    

    在main.js中导入自定义的vue-router配置:

    import Vue from 'vue'
    import App from './App'
    
    //导入自定义的router配置:
    import router from "./router";
    
    //导入ElementUI:
    import ElementUI from 'element-ui'
    import 'element-ui/lib/theme-chalk/index.css';
    
    //导入Axios:
    import axios from 'axios';
    import VueAxios from 'vue-axios';
    
    //声明使用ElementUI:
    Vue.use(ElementUI);
    
    //声明使用Axios
    Vue.use(VueAxios,axios);
    
    阻止vue在启动时生成生产提示:
    Vue.config.productionTip = false;
    
    new Vue({
      el: '#app',
      //将router挂载到Vue上:
      router,
      components: { App },
      template: '<App/>'
    })
    

    在public目录下创建mock目录,在mock目录中创建data.json文件:

    {
      "name": "BLU",
      "url": "http://www.baidu.com",
      "page": 1,
      "address": {
        "country": "China",
        "city": "南京",
        "street": "安德门大街"
      }
    }
    

    App.vue

    <template>
      <div id="app">
        <HelloWorld/>
        <router-link to="/main">首页</router-link>
        <router-link to="/content">内容页</router-link>
        <router-view></router-view>
      </div>
    </template>
    
    
    <script>
    import HelloWorld from "./components/HelloWorld";
    
    export default {
      name: 'App',
      components: {
        HelloWorld
      }
    }
    </script>
    
    
    <style>
    #app {
      font-family: 'Avenir', Helvetica, Arial, sans-serif;
      -webkit-font-smoothing: antialiased;
      -moz-osx-font-smoothing: grayscale;
    
      color: #2c3e50;
      margin-top: 60px;
    }
    </style>
    

    HelloWorld.vue

    <template>
      <div>
        <p>Hi BLU</p>
        <p>{{msg}}</p>
      </div>
    </template>
    
    
    <script>
    export default {
      name: 'HelloWorld',
      data () {
        return {
          msg: 'Welcome to Your Vue.js App'
        }
      }
    }
    </script>
    

    list.vue

    <template>
        <div>
            <h1>用户列表页</h1>
            {{username}}
        </div>
    </template>
    
    
    <script>
        export default {
            props: ['username'],
            name: "userlist"
        }
    </script>
    

    Profile.vue

    <template>
        <div>
            <h1>个人信息页</h1>
            {{ $route.params.id }}
        </div>
    </template>
    
    
    <script>
        export default {
            name: "userProfile",
            beforeRouteEnter:(to, from, next)=>{
                console.log("进入路由Profile");
                next(vm => {
                    vm.getData();
                });
            },
            beforeRouteLeave:(to, from, next)=>{
                console.log("离开路由Profile");
                next();
            },
            methods: {
                getData: function () {
                    this.axios({
                        method: 'get',
                        url: 'http://localhost:8080/mock/data.json'
                    }).then(function (response) {
                        console.log(response);
                    })
                }
            }
        }
    </script>
    

    Main.vue

    <template>
        <el-container>
        	<el-aside width="480px">
            	<el-col :span="12">
               		<h5>默认颜色</h5>
                	<el-menu
                        default-active="2"
                        class="el-menu-vertical-demo"
                        @open="handleOpen"
                        @close="handleClose">
                    	<el-submenu index="1">
                        	<template slot="title">
                            	<i class="el-icon-location"></i>
                            	<span>导航一</span>
                        	</template>
                        	<el-menu-item-group>
                            	<template slot="title">分组一</template>
                            	<el-menu-item index="1-1">
                                	<router-link :to="{name: 'userlist',params: {username: 'BLU'}}">用户列表页</router-link>
                            	</el-menu-item>
                            	<el-menu-item index="1-2">
                                	<router-link v-bind:to="{name: 'userProfile',params:{id: 1}}">个人信息页</router-link>
                            	</el-menu-item>
                            	<el-menu-item index="1-3">
                                	<router-link to="/goHome">回到首页</router-link>
                            	</el-menu-item>
                        	</el-menu-item-group>
                        	<el-menu-item-group title="分组二">
                            	<el-menu-item index="1-3">选项3</el-menu-item>
                        	</el-menu-item-group>
                        	<el-submenu index="1-4">
                            	<template slot="title">选项4</template>
                            	<el-menu-item index="1-4-1">选项1</el-menu-item>
                        	</el-submenu>
                    	</el-submenu>
                    	<el-menu-item index="2">
                        	<i class="el-icon-menu"></i>
                        	<span slot="title">导航二</span>
                    	</el-menu-item>
                    	<el-menu-item index="3" disabled>
                        	<i class="el-icon-document"></i>
                        	<span slot="title">导航三</span>
                    	</el-menu-item>
                    	<el-menu-item index="4">
                        	<i class="el-icon-setting"></i>
                        	<span slot="title">导航四</span>
                    	</el-menu-item>
                	</el-menu>
            	</el-col>
        	</el-aside>
        	<el-container>
            	<el-main>
                	<router-view></router-view>
            	</el-main>
        	</el-container>
    	</el-container>
    </template>
    
    
    <script>
        export default {
            name: "Main",
            methods: {
                handleOpen(key, keyPath) {
                    console.log(key, keyPath);
                },
                handleClose(key, keyPath) {
                    console.log(key, keyPath);
                }
            }
        }
    </script>
    

    Content.vue

    <template>
      <div>
        <el-form :model="ruleForm" status-icon :rules="rules" ref="ruleForm" label-width="100px" class="demo-ruleForm">
          <el-form-item label="密码" prop="pass">
            <el-input type="password" v-model="ruleForm.pass" autocomplete="off"></el-input>
          </el-form-item>
          <el-form-item label="确认密码" prop="checkPass">
            <el-input type="password" v-model="ruleForm.checkPass" autocomplete="off"></el-input>
          </el-form-item>
          <el-form-item label="年龄" prop="age">
            <el-input v-model.number="ruleForm.age"></el-input>
          </el-form-item>
          <el-form-item>
            <el-button type="primary" @click="submitForm('ruleForm')">提交</el-button>
            <el-button @click="resetForm('ruleForm')">重置</el-button>
          </el-form-item>
        </el-form>
      </div>
    </template>
    
    <script>
        export default {
            name: "Content",
            data() {
                var checkAge = (rule, value, callback) => {
                    if (!value) {
                        return callback(new Error('年龄不能为空'));
                    }
                    setTimeout(() => {
                        if (!Number.isInteger(value)) {
                            callback(new Error('请输入数字值'));
                        } else {
                            if (value < 18) {
                                callback(new Error('必须年满18岁'));
                            } else {
                                callback();
                            }
                        }
                    }, 1000);
                };
                var validatePass = (rule, value, callback) => {
                    if (value === '') {
                        callback(new Error('请输入密码'));
                    } else {
                        if (this.ruleForm.checkPass !== '') {
                            this.$refs.ruleForm.validateField('checkPass');
                        }
                        callback();
                    }
                };
                var validatePass2 = (rule, value, callback) => {
                    if (value === '') {
                        callback(new Error('请再次输入密码'));
                    } else if (value !== this.ruleForm.pass) {
                        callback(new Error('两次输入密码不一致!'));
                    } else {
                        callback();
                    }
                };
                return {
                    ruleForm: {
                        pass: '',
                        checkPass: '',
                        age: ''
                    },
                    rules: {
                        pass: [
                            { validator: validatePass, trigger: 'blur' }
                        ],
                        checkPass: [
                            { validator: validatePass2, trigger: 'blur' }
                        ],
                        age: [
                            { validator: checkAge, trigger: 'blur' }
                        ]
                    }
                };
            },
            methods: {
                submitForm(formName) {
                    this.$refs[formName].validate((valid) => {
                        if (valid) {
                            alert('submit!');
                        } else {
                            console.log('error submit!!');
                            return false;
                        }
                    });
                },
                resetForm(formName) {
                    this.$refs[formName].resetFields();
                }
            }
        }
    </script>
    

    NotFound.vue

    <template>
        <div>
            <h1>404:页面不存在</h1>
        </div>
    </template>
    
    <script>
        export default {
            name: "NotFound"
        }
    </script>
    

    在这里插入图片描述

    在这里插入图片描述

    展开全文
  • vue-router传递参数的几种方式

    万次阅读 多人点赞 2018-07-06 16:24:29
    vue-router传递参数分为两大类编程式的导航 router.push声明式的导航 &lt;router-link&gt;编程式的导航 router.push编程式导航传递参数有两种类型:字符串、对象。字符串字符串的方式是直接将路由地址以字符...

    vue-router传递参数分为两大类

    • 编程式的导航 router.push
    • 声明式的导航 <router-link>

    编程式的导航 router.push

    编程式导航传递参数有两种类型:字符串、对象。

    字符串

    字符串的方式是直接将路由地址以字符串的方式来跳转,这种方式很简单但是不能传递参数:
    this.$router.push("home");
    

    对象

    想要传递参数主要就是以对象的方式来写,分为两种方式:命名路由、查询参数,下面分别说明两种方式的用法和注意事项。

    命名路由

    命名路由的前提就是在注册路由的地方需要给路由命名如:

    命名路由传递参数需要使用params来传递,这里一定要注意使用params不是query。目标页面接收传递参数时使用params

     特别注意:命名路由这种方式传递的参数,如果在目标页面刷新是会出错的

    使用方法如下:

    this.$router.push({ name: 'news', params: { userId: 123 }})

    代码如下:

    <template>
      <div class="hello">
        <h1>{{ msg }}</h1>
        <button @click="routerTo">click here to news page</button>
      </div>
    </template>
    
    <script>
    export default {
      name: 'HelloWorld',
      data () {
        return {
          msg: 'Welcome to Your Vue.js App'
        }
      },
      methods:{
        routerTo(){
          this.$router.push({ name: 'news', params: { userId: 123 }});
        }
      }
    }
    </script>
    
    <style>
    </style>

    接受传递的参数:

    <template>
      <div>
        this is the news page.the transform param is {{this.$route.params.userId}}
      </div>
    </template>
    <script>
      
    </script>

    运行效果如下:


    查询参数

    查询参数其实就是在路由地址后面带上参数和传统的url参数一致的,传递参数使用query而且必须配合path来传递参数而不能用name,目标页面接收传递的参数使用query。
    注意:和name配对的是params,和path配对的是query
    使用方法如下:
    this.$router.push({ path: '/news', query: { userId: 123 }});

    代码如下:

    <template>
      <div class="hello">
        <h1>{{ msg }}</h1>
        <button @click="routerTo">click here to news page</button>
      </div>
    </template>
    
    <script>
    export default {
      name: 'HelloWorld',
      data () {
        return {
          msg: 'Welcome to Your Vue.js App'
        }
      },
      methods:{
        routerTo(){
          this.$router.push({ path: '/news', query: { userId: 123 }});
        }
      }
    }
    </script>
    
    <style>
    </style>

    接收参数如下:

    <template>
      <div>
        this is the news page.the transform param is {{this.$route.query.userId}}
      </div>
    </template>
    <script>
    </script>
    运行效果如下:


    声明式的导航

    声明式的导航和编程式的一样,这里就不在过多介绍,给几个例子大家对照编程式理解,例子如下:

    字符串

    <router-link to="news">click to news page</router-link>

    命名路由

    <router-link :to="{ name: 'news', params: { userId: 1111}}">click to news page</router-link>
    运行效果如下:

    查询参数

    <router-link :to="{ path: '/news', query: { userId: 1111}}">click to news page</router-link>
    运行效果如下:

    最后总结:路由传递参数和传统传递参数是一样的,命名路由类似表单提交而查询就是url传递,在vue项目中基本上掌握了这两种传递参数就能应付大部分应用了,最后总结为以下两点:
    1.命名路由搭配params,刷新页面参数会丢失
    2.查询参数搭配query,刷新页面数据不会丢失
    3.接受参数使用this.$router后面就是搭配路由的名称就能获取到参数的值

    如果觉得有帮助请支持我吧!







    展开全文
  • vue-router(路由)详细教程

    万次阅读 多人点赞 2018-05-28 21:08:30
      由于Vue在开发时对路由支持的不足,于是官方补充了vue-router插件。vue的单页面应用是基于路由和组件的,路由用于设定访问路径,并将路径和组件映射起来。传统的页面应用,是用一些超链接来实现页面切换和跳转的...

     

      由于Vue在开发时对路由支持的不足,于是官方补充了vue-router插件。vue的单页面应用是基于路由和组件的,路由用于设定访问路径,并将路径和组件映射起来。传统的页面应用,是用一些超链接来实现页面切换和跳转的。在vue-router单页面应用中,则是路径之间的切换,实际上就是组件的切换。路由就是SPA(单页应用)的路径管理器。再通俗的说,vue-router就是我们WebApp的链接路径管理系统。
      有的小伙伴会有疑虑,为什么我们不能像原来一样直接用a标签编写链接呢?因为我们一般用Vue做的都是单页应用,只有一个主页面index.html,所以你写的<a></a>标签是不起作用的,要使用vue-router来进行管理。

    一、安装

    如果你用vue-cli脚手架来搭建项目,配置过程会选择是否用到路由(详细见vue-cli 脚手架),如果选择y,后面下载依赖会自动下载vue-router。
    这里还是说一下安装:npm install vue-router

    二、创建组件

    如果在一个模块化工程中使用它,必须要通过 Vue.use() 明确地安装路由功能,用vue-cli生产了我们的项目结构,src文件目录下会有一个router文件夹,此处就是编写路由组件的地方。在src/router/index.js,这个文件就是路由的核心文件:

    
    import Vue from 'vue'   //引入Vue
    import Router from 'vue-router'  //引入vue-router
    import Hello from '@/components/Hello'  //引入根目录下的Hello.vue组件
     
    Vue.use(Router)  //Vue全局使用Router
     
    export default new Router({
      routes: [              //配置路由,这里是个数组
        {                    //每一个链接都是一个对象
          path: '/',         //链接路径
          name: 'Hello',     //路由名称,
          component: Hello   //对应的组件模板
        },{
          path:'/hi',
          component:Hi,
          children:[        //子路由,嵌套路由 (此处偷个懒,免得单独再列一点)
            {path:'/',component:Hi},
            {path:'hi1',component:Hi1},
            {path:'hi2',component:Hi2},
          ]
        }
      ]
    })
    

    三、router-link制作导航

    1.router-link 是一个组件,它默认会被渲染成一个带有链接的a标签,通过to属性指定链接地址。
    注意:被选中的router-link将自动添加一个class属性值.router-link-active。

    <router-link to="/">[text]</router-link>
    
    • to:导航路径,要填写的是你在router/index.js文件里配置的path值,如果要导航到默认首页,只需要写成 to="/" ,
    • [text] :就是我们要显示给用户的导航名称。

    2.router-view 用于渲染匹配到的组件。
    ①.可以给router-view组件设置transition过渡Vue2.0 Transition常见用法全解惑)。

    
    <transition name="fade">
      <router-view ></router-view>
    </transition>
    

    css过渡类名:
    组件过渡过程中,会有四个CSS类名进行切换,这四个类名与transition的name属性有关,比如name="fade",会有如下四个CSS类名:

    • fade-enter:进入过渡的开始状态,元素被插入时生效,只应用一帧后立刻删除。
    • fade-enter-active:进入过渡的结束状态,元素被插入时就生效,在过渡过程完成后移除。
    • fade-leave:离开过渡的开始状态,元素被删除时触发,只应用一帧后立刻删除。
    • fade-leave-active:离开过渡的结束状态,元素被删除时生效,离开过渡完成后被删除。

    从上面四个类名可以看出,fade-enter-activefade-leave-active在整个进入或离开过程中都有效,所以CSS的transition属性在这两个类下进行设置。

    过渡模式mode:

    • in-out(mode默认in-out模式):新元素先进入过渡,完成之后当前元素过渡离开。
    • out-in:当前元素先进行过渡离开,离开完成后新元素过渡进入。

    ②.还可以配合<keep-alive>使用,keep-alive可以缓存数据,这样不至于重新渲染路由组件的时候,之前那个路由组件的数据被清除了。比如对当前的路由组件a进行了一些DOM操作之后,点击进入另一个路由组件b,再回到路由组件a的时候之前的DOM操作还保存在,如果不加keep-alive再回到路由组件a时,之前的DOM操作就没有了,得重新进行。如果你的应用里有一个购物车组件,就需要用到keep-alive。

    <transition>
      <keep-alive>
        <router-view></router-view>
      </keep-alive>
    </transition>
    

    四、动态路由匹配

    我们经常需要把某种模式匹配到的所有路由,全都映射到同个组件。
    调用router的map方法映射路由,每条路由以key-value的形式存在,key是路径,value是组件。例如:'/home'是一条路由的key,它表示路径;{component: Home}则表示该条路由映射的组件:

    router.map({
        '/home': { component: Home },
        '/about': { component: About }
    })
    

    例如,我们有一个 User 组件,对于所有 ID 各不相同的用户,都要使用这个组件来渲染。那么,我们可以在 vue-router 的路由路径中使用『动态路径参数』来达到这个效果。

    
    const User = {
      template: '<div>User</div>'
    }
    
    const router = new VueRouter({
      routes: [
        // 动态路径参数 以冒号开头
        { path: '/user/:id', component: User }
      ]
    })
    

    例如: /user/foo 和 /user/bar 都将映射到相同的路由。
    一个『路径参数』使用冒号 : 标记。当匹配到一个路由时,参数值会被设置到this.$route.params,可以在每个组件内使用。
    你可以在一个路由中设置多段『路径参数』,对应的值都会设置到 $route.params 中。例如:

     

    五、vue-router参数传递

    1.用name传值(不推荐)

     

    2.通过<router-link> 标签中的to传参

    <router-link :to="{name:‘dxl’,params:{key:value}}">东西里</router-link>
    
    • name:就是我们在路由配置文件中起的name值。
      另:命名路由就是用一个名称来标识一个路由,在定义路由的时候设置一个name属性即可。在router-link中也可以用路由的名字来链接到一个路由。
    • params:就是我们要传的参数,它也是对象形势,在对象里可以传递多个值。
      最后用$route.params.username进行接收.

    3.用url传参

    上面第五点也有提到。 :冒号的形式传递参数
    (1).在router路由配置文件里以冒号的形式设置参数

    {
        path:'/params/:newsId/:userName,
        component:Params
    }
    

    (2).组件形式,在src/components目录下建立我们params.vue组件。
    我们在页面里输出了url传递的参数。

    <template>
        <div>
            <h2>{{ msg }}</h2>
            <p>新闻ID:{{ $route.params.newsId}}</p>
            <p>用户名:{{ $route.params.userName}}</p>
        </div>
    </template>
    <script>
    export default {
      name: 'params',
      data () {
        return {
          msg: 'params page'
        }
      }
    }
    </script>
    

    (3).<router-view>标签path路径中传值

    <router-link to="/params/888/dxl shuai>params</router-link>
    

    (4).正则表达式在URL传值中的应用
    希望我们传递的新闻ID只能是数字的形式,这时候我们就需要在传递时有个基本的类型判断,path:'/params/:newsId(\\d+)/:userName'

    六.响应路由参数的变化

    当使用路由参数时,例如从 /user/foo 导航到 /user/bar,原来的组件实例会被复用。因为两个路由都渲染同个组件,比起销毁再创建,复用则显得更加高效。不过,这也意味着组件的生命周期钩子不会再被调用。
    复用组件时,想对路由参数的变化作出响应的话:
    (1). watch(监测变化) $route 对象:

    
    const User = {
      template: '...',
      watch: {
        '$route' (to, from) {
          // 对路由变化作出响应...
        }
      }
    }
    

    (2).beforeRouteUpdate 导航守卫
    如果目的地和当前路由相同,只有参数发生了改变 (比如从一个用户资料到另一个 /users/1 -> /users/2),你需要使用 beforeRouteUpdate来响应这个变化 (比如抓取用户信息)。

    
    const User = {
      template: '...',
      beforeRouteUpdate (to, from, next) {
        // react to route changes...
        // don't forget to call next()
      }
    }
    

    七、实现不同路由不同页面标题

    
    // 定义路由的时候如下定义,name也可为中文
    const routes = [
      { path: '/goods', component: goods, name: 'goods' },
      { path: '/orders', component: orders, name: 'orders' },
      { path: '/seller', component: seller, name: 'seller' }
    ];
    // 创建路由实例
    const router = new VueRouter({
      routes: routes
    })
    // 关键在这里,设置afterEach钩子函数
    router.afterEach((to, from, next) => {
      document.title = to.name;
    })
    

    八、重定向

    刚进入应用都是进入到“/”这个路由的,如果想直接进入到“/goods”怎么办,有两种方法。一种是利用重定向,另一种是利用vue-router的导航式编程。
    redirect基本重定向:

    
    const routes = [
      { path: '/', redirect: '/goods'}
    ]
    重定向的目标也可以是一个命名的路由。
    const routes = [
      { path: '/', redirect: { name: 'goods' }}
    ]
    重定向时也可以传递参数
    {
      path:'/',
      redirect:'/goods/:newsId(\\d+)/:userName'
    }
    

    ★.这里不得不提到alias别名的使用。
    1.首先我们在路由配置文件里给路径起一个别名,dxl。

    
    {
        path: '/hi',
        component: Hi,
        alias:'/dxl'
     }
    

    2.配置我们的<router-link>,起过别名之后,可以直接使用<router-link>标签里的to属性,进行重新定向。

    <router-link to="/dxl">jspang</router-link>
    

    区别:

    • redirect:仔细观察URL,redirect是直接改变了url的值,把url变成了真实的path路径。
    • alias:URL路径没有别改变,这种情况更友好,让用户知道自己访问的路径,只是改变了<router-view>中的内容。

    ★★★.注意一个大坑:
    别名alias在path为'/'中,是不起作用的。

    
    {
      path: '/',
      component: Hello,
      alias:'/home'
    }
    

    九、编程式导航

    1.router.push( )
    想要导航到不同的 URL,则使用 router.push (在创建vue实例并挂载后调用)。router.push方法就是用来动态导航到不同的链接的,这个方法会向 history 栈添加一个新的记录,所以,当用户点击浏览器后退按钮时,则回到之前的 URL。
    当你点击 <router-link> 时,这个方法会在内部调用,所以说,点击 <router-link :to="..."> 等同于调用 router.push(...)。


    注意:
    如果提供了 path,params 会被忽略,而 query 并不属于这种情况。取而代之的是下面例子的做法,你需要提供路由的 name 或手写完整的带有参数的 path:

     

    
    const userId = 123
    router.push({ name: 'user', params: { userId }}) // -> /user/123
    router.push({ path: `/user/${userId}` }) // -> /user/123
    // 这里的 params 不生效
    router.push({ path: '/user', params: { userId }}) // -> /user
    

    2.router.replace( )
    router.replace跟 router.push 很像,唯一的不同就是,它不会向 history 添加新记录,而是跟它的方法名一样 —— 替换掉当前的 history 记录。


    3.router.go(n)
    这个方法的参数是一个整数,意思是在 history 记录中向前或者后退多少步,类似 window.history.go(n)。

     

    
    // 在浏览器记录中前进一步,等同于 history.forward()
    router.go(1)
    // 后退一步记录,等同于 history.back()
    router.go(-1)
    

    自定义一个goback()方法,并使用this.$router.go(-1),进行后退操作

    <script>
    export default {
      name: 'app',
      methods:{
        goback(){
          this.$router.go(-1);
        },
        goHome(){
          this.$router.push('/');
        }
      }
    }
    </script>
    

    十、路由中的钩子

    1.路由配置文件中的钩子函数:
    在路由文件中我们只能写一个beforeEnter,就是在进入此路由配置时:

    
    {
          path:'/params/:newsId(\\d+)/:userName',
          component:Params,
          beforeEnter:(to,from,next)=>{
            console.log('我进入了params模板');
            console.log(to);
            console.log(from);
            next();
    },
    

    三个参数:

    • to:路由将要跳转的路径信息,信息是包含在对像里边的。
    • from:路径跳转前的路径信息,也是一个对象的形式。
    • next:路由的控制参数,常用的有next(true)和next(false)。

    2.写在模板中的钩子函数:
    写在模板中就可以有两个钩子函数可以使用。
    beforeRouteEnter:在路由进入前的钩子函数。
    beforeRouteLeave:在路由离开前的钩子函数。

    
    export default {
      name: 'params',
      data () {
        return {
          msg: 'params page'
        }
      },
      beforeRouteEnter:(to,from,next)=>{
        console.log("准备进入路由模板");
        next();
      },
      beforeRouteLeave: (to, from, next) => {
        console.log("准备离开路由模板");
        next();
      }
    }
    

    ★此处常用于数据获取

    • 导航完成之后获取:先完成导航,然后在接下来的组件生命周期钩子中获取数据。在数据获取期间显示『加载中』之类的指示。
      当你使用这种方式时,我们会马上导航和渲染组件,然后在组件的 created 钩子中获取数据。这让我们有机会在数据获取期间展示一个 loading 状态,还可以在不同视图间展示不同的 loading 状态。
      假设我们有一个 Post 组件,需要基于 $route.params.id 获取文章数据:
    <template>
      <div class="post">
        <div class="loading" v-if="loading">
          Loading...
        </div>
        <div v-if="error" class="error">
          {{ error }}
        </div>
        <div v-if="post" class="content">
          <h2>{{ post.title }}</h2>
          <p>{{ post.body }}</p>
        </div>
      </div>
    </template>
    export default {
      data () {
        return {
          loading: false,
          post: null,
          error: null
        }
      },
      created () {
        // 组件创建完后获取数据,
        // 此时 data 已经被 observed 了
        this.fetchData()
      },
      watch: {
        // 如果路由有变化,会再次执行该方法
        '$route': 'fetchData'
      },
      methods: {
        fetchData () {
          this.error = this.post = null
          this.loading = true
          // replace getPost with your data fetching util / API wrapper
          getPost(this.$route.params.id, (err, post) => {
            this.loading = false
            if (err) {
              this.error = err.toString()
            } else {
              this.post = post
            }
          })
        }
      }
    }
    
    • 导航完成之前获取:导航完成前,在路由进入的守卫中获取数据,在数据获取成功后再执行导航。
      通过这种方式,我们在导航转入新的路由前获取数据。我们可以在接下来的组件的 beforeRouteEnter 守卫中获取数据,当数据获取成功后只调用 next 方法。
    
    export default {
      data () {
        return {
          post: null,
          error: null
        }
      },
      beforeRouteEnter (to, from, next) {
        getPost(to.params.id, (err, post) => {
          next(vm => vm.setData(err, post))
        })
      },
      // 路由改变前,组件就已经渲染完了
      // 逻辑稍稍不同
      beforeRouteUpdate (to, from, next) {
        this.post = null
        getPost(to.params.id, (err, post) => {
          this.setData(err, post)
          next()
        })
      },
      methods: {
        setData (err, post) {
          if (err) {
            this.error = err.toString()
          } else {
            this.post = post
          }
        }
      }
    }
    

    十一、History 模式

    vue-router 默认 hash 模式 —— 使用 URL 的 hash 来模拟一个完整的 URL,于是当 URL 改变时,页面不会重新加载。

    如果不想要很丑的 hash,我们可以用路由的 history 模式,这种模式充分利用 history.pushState API 来完成 URL 跳转而无须重新加载页面。

    
    const router = new VueRouter({
      mode: 'history',
      routes: [...]
    })
    

    在学习过渡效果的时候,我们学了mode的设置,但是在路由的属性中还有一个mode。
    mode的两个值:

    • histroy:当你使用 history 模式时,URL 就像正常的 url,http://www.dxl.com/user/id
      不过这种模式要玩好,还需要后台配置支持。因为我们的应用是个单页客户端应用,如果后台没有正确的配置,当用户在浏览器直接访问 http://www.dxl.com/user/id就会返回 404,。所以要在服务端增加一个覆盖所有情况的候选资源:如果 URL 匹配不到任何静态资源,则应该返回同一个 index.html 页面,这个页面就是你 app 依赖的页面。


      这么做以后,你的服务器就不再返回 404 错误页面,因为对于所有路径都会返回 index.html 文件。为了避免这种情况,你应该在 Vue 应用里面覆盖所有的路由情况,然后在给出一个 404 页面。
    
    const router = new VueRouter({
      mode: 'history',
      routes: [
        { path: '*', component: Error}
      ]
    })
    

    这里的path:'*'就是找不到页面时的配置,component是我们新建的一个Error.vue的文件

    • hash:默认’hash’值,但是hash看起来就像无意义的字符排列,不太好看也不符合我们一般的网址浏览习惯。不配置时是这样的:http://localhost:8080/#/users,多个#号。

    十二、路由组件传参

    (这点是直接粘贴的vue官网上的教程,此处是重点要多看多体会!)
    在组件中使用 $route 会使之与其对应路由形成高度耦合,从而使组件只能在某些特定的 URL 上使用,限制了其灵活性。
    解耦前:
    id不能直接拿出来使用

    
    const User = {
      template: '<div>User {{ $route.params.id }}</div>'
    }
    const router = new VueRouter({
      routes: [
        { path: '/user/:id', component: User }
      ]
    })
    

    使用 props 将组件和路由解耦:

    
    const User = {
      props: ['id'],
      template: '<div>User {{ id }}</div>'
    }
    const router = new VueRouter({
      routes: [
        { path: '/user/:id', component: User, props: true },
    
        // 对于包含命名视图的路由,你必须分别为每个命名视图添加 `props` 选项:
        {
          path: '/user/:id',
          components: { default: User, sidebar: Sidebar },
          props: { default: true, sidebar: false }
        }
      ]
    })
    

    这样你便可以在任何地方使用该组件,使得该组件更易于重用和测试。

    1.布尔模式
    如果 props 被设置为 true,route.params 将会被设置为组件属性。

    2.对象模式
    如果 props 是一个对象,它会被按原样设置为组件属性。当 props 是静态的时候有用。

    
    const router = new VueRouter({
      routes: [
        { path: '/promotion/from-newsletter', component: Promotion, props: { newsletterPopup: false } }
      ]
    })
    

    3.函数模式
    你可以创建一个函数返回 props。这样你便可以将参数转换成另一种类型,将静态值与基于路由的值结合等等。

    
    const router = new VueRouter({
      routes: [
        { path: '/search', component: SearchUser, props: (route) => ({ query: route.query.q }) }
      ]
    })
    

    /search?q=vue会将{query: 'vue'}作为属性传递给 SearchUser 组件。
    请尽可能保持 props 函数为无状态的,因为它只会在路由发生变化时起作用。如果你需要状态来定义 props,请使用包装组件,这样 Vue 才可以对状态变化做出反应。

    
    function dynamicPropsFn (route) {
      const now = new Date()
      return {
        name: (now.getFullYear() + parseInt(route.params.years)) + '!'
      }
    }
    const router = new VueRouter({
      mode: 'history',
      base: __dirname,
      routes: [
        { path: '/', component: Hello }, // No props, no nothing
        { path: '/hello/:name', component: Hello, props: true }, // Pass route.params to props
        { path: '/static', component: Hello, props: { name: 'world' }}, // static values
        { path: '/dynamic/:years', component: Hello, props: dynamicPropsFn }, // custom logic for mapping between route and props
        { path: '/attrs', component: Hello, props: { name: 'attrs' }}
      ]
    })
    

     

    展开全文
  • React-Router实战:重定向Redirect

    万次阅读 2019-03-23 18:55:45
    当用户访问某界面时,该界面并不存在,此时用Redirect重定向,重新跳到一个我们自定义的组件里。...import { Route, Redirect } from 'react-router' <Route exact path="/" render={() => ( ...

    当用户访问某界面时,该界面并不存在,此时用Redirect重定向,重新跳到一个我们自定义的组件里。
    在这里插入图片描述


    一、基础

    • 1、引入使用
    // 如果loggedIn 为 false, 则重定向跳转到 /home 页面
    
    import { Route, Redirect } from 'react-router'
    
    <Route exact path="/" render={() => (
      loggedIn ? (
        <Redirect to="/home"/>
      ) : (
        <User />
      )
    )}/>
    
    <Redirect
      to={{
        pathname: "/login",
        search: "?utm=your+face",
        state: { referrer: currentLocation }
      }}
    />
    

    二、DOME

    1、目录结构

    | - index.js
    | - components
    	| - App      =>   App.js
    	| - Home     =>   Home.js
    	| - About    =>   About.js
    	| - News      =>   News.js
    

    2、源码

    ./index.js

    import React from 'react';
    import ReactDOM from 'react-dom';
    import App from './components/App/App';
    ReactDOM.render(<App />, document.getElementById('root'));
    

    ./components/App/App.js

    import React , { Component } from 'react';
    import { BrowserRouter as Router, Route, NavLink, Switch, Redirect } from 'react-router-dom';
    import Home from '../Home/Home';
    import About from '../About/About';
    import News from '../News/News';
    
    class App extends Component {
      render() {
        return (
          <Router>
            <div>
              <li><NavLink to="/">Home</NavLink></li>
              <li><NavLink to="/about">About</NavLink></li>
              <li><NavLink to="/news">News</NavLink> </li>   <br/>
    
              <Switch>
                <Route path="/" exact component={Home} />
                <Route path="/about" component={About} />
                <Route path="/news" component={News} />
                <Redirect from="/*" to="/" />
              </Switch>
              
            </div>
          </Router>
        );
      }
    }
    
    export default App;
    

    在这里插入图片描述
    在这里插入图片描述
    ./components/About/About.js

    import React, { Component } from 'react';
    
    export default class About extends Component {
        render() {
            return (
                <div>
                	<h2>About</h2>
                </div>
            );
        }
    }
    

    ./components/New/New.js

    import React, { Component } from 'react';
    
    export default class News extends Component {
        render() {
            return (
               <div>
                   <h2>News</h2>
               </div>
            );
        }
    }
    

    3、show

    (1)一切功能都是正常,点击About或News就跳转到 About 或 New界面
    在这里插入图片描述

    (2)但当我要在url中,访问: http://localhost:3000/Login
    页面立即会重新跳转,跳转回home界面

    展开全文
  • React-router详细介绍及路由配置代码

    万次阅读 2019-06-05 21:06:16
    首先我们要知道单页面应用为什么要有router。 其实简单讲就一句话: 为了不进行后端路由,只进行前端路由 BrowserRouter --浏览器路由(属于后端路由) HasRouter --前端has路由(属于前端路由) 如何使用react-...
  • vue-router router-link

    千次阅读 2019-06-02 06:18:46
    个人理解vue-router能够实现当我们点击某个导航链接的时候能够动态的展示一个组件...import Vuerouter fom 'vue-router //加载路由模块 Vue.use(VueRouter) //注册到Vue中才可以使用 配置路由表 const router ...
  • vue-router 基本使用

    万次阅读 多人点赞 2019-06-12 15:57:54
    vue-router 基本使用  路由,其实就是指向的意思,当我点击页面上的home按钮时,页面中就要显示home的内容,如果点击页面上的about 按钮,页面中就要显示about 的内容。Home按钮 => home 内容, about按钮 =>...
  • 前端在做路由验证时,使用router.Routes动态添加路由非常方便。 以下是后台返回的一组路由表,根据路由中的name字段判断此路由对应的组件是否显示: import Vue from 'vue' import VueRouter from 'vue-router' ...
  • router.push 想要导航到不同的 URL,则使用 router.push 方法。这个方法会向 history 栈添加一个新的记录,所以,当用户点击浏览器后退按钮时,则回到之前的 URL。 &lt;router-link :to="..."&...
  • router配置文件 import Vue from 'vue' import Router from 'vue-router' import index from '@/pages/index' import fenlei from '@/pages/fenlei' Vue.use(Router) export default new Router({ mode : "...
  • router route

    千次阅读 2018-11-01 20:49:05
    第一:控制台输出 router的输出中mode属性,history属性是...通过在 Vue 根实例的router配置传入 router 实例,下面这些属性成员会被注入到每个子组件。 (1)this.$router router 实例。 (2)this.$route ...
  • Vue Router

    千次阅读 2020-07-19 23:38:54
    Vue Router 是 Vue.js 官方的路由管理器。它和 Vue.js 的核心深度集成,让构建单页面应用变得易如反掌。
  • Vue中的router-view解释

    万次阅读 2019-07-17 10:32:29
    router-view>的tag标签。通过它,我们点击链接,即可显示出Vue的HelloWorld.vue页面。 那么,到底是什么让HelloWorld.vue页面显示出来,并且它的路由途径和特点呢? 下面就一一来解释一下: 本质,...
  • Router走线

    千次阅读 2018-06-19 14:15:50
    PADS Router最常用的快捷键就是F3用于走线PADS Router之前先设置PADS LayoutPADS Layout : 设置-&gt;焊盘栈 因为过孔都是使用钻头钻的,过孔种类过多使得需要经常更换钻头,成本增加。所以一般设置5个以内的钻...
  • 写在前面:传参是前端经常需要用的一个操作,很多场景都会需要用到上个页面的参数,本文将会详细介绍vue router 是如何进行传参的,以及一些小细节问题。有需要的朋友可以做一下参考,喜欢的可以点波赞,或者关注...
  • 1、router.push():导航到不同的 url,向 history 栈添加一个新的记录。(=== window.history.pushState) 声明式 编程式 <router-link :to=""> router.push() // 字符串 router.push('home') // ...
  • router.go(n) 这个方法的参数是一个整数,意思是在 history 记录中向前或者后退多少步,类似 window.history.go(n) router.push(location) 想要导航到不同的 URL,则使用 router.push 方法。这个方法会向 history...
  • vue[导航切换router-link、router-view、router的使用]
  • vue-router addRouter 实现 动态路由

    千次阅读 2019-07-24 17:31:28
    vue-router 中有一个 api ,名曰 addRouter router.addRoutes(routes: Array<RouteConfig>) addRouterrouter 实例的一个方法, 可以动态添加更多的路由规则 这个 api ,可以让你的 router 配置,不用...
  • router.replace跟router.push的区别

    千次阅读 2019-08-23 14:27:33
    在学习案例过程中,遇到关于router.replace跟router.push的使用问题。 网上查询一番后,遇到一老哥的答案解释相对容易理解: 可以把路由router想象成一个访问记录的栈,router.replace() 是替换掉栈顶,而router....
  • MySQL Router 8 详解

    千次阅读 2019-09-03 15:35:32
    目录 一、功能介绍 1. 透明路由 2. 元数据缓存 3. 简单重定向 4. MySQL Router 8.0的新特性 ... MySQL Router最早是作为MySQL-Proxy的替代方案出现的。作为一个轻量级中间件,MySQL Router可在应用...
  • vue-routerrouter-link

    千次阅读 2019-09-27 14:48:57
    router-link>组件支持用户在具有路由功能的应用中(点击)导航。 通过to属性指定目标地址,默认渲染成带有正确链接的<a>标签,可以通过配置tag属性生成别的标签.。另外,当目标路由成功激活时,链接元素...
  • vue-router

    千次阅读 2019-10-20 16:34:08
    vue-router是什么 vue-router有哪几种方法 怎么只用vue-router 单页面应用: 基于路由和组件 route: 一条路由 routes:一组路由 router: 管理路由 客户端中的路由: dom元素显示或者隐藏。==》基于hash和基于...
  • router.matcher

    千次阅读 2020-04-14 11:09:58
    router.matcher // 替换现有router的routes router.matcher = new VueRouter({ routes: newRoutes }).matcher 对外提供两个方法match(负责route匹配), addRoutes(动态添加路由)。 具体原因:在做路径切换...
  • react-router和react-router-dom的区别

    万次阅读 2018-06-19 20:04:39
    转载自:react-router和react-router-dom的区别react-router-v4,我称之为“第四代react-router”,react-router和react-router-dom的区别是什么呢?为什么有时候我们看到如下的写法:写法1:import {Swtich, Route, ...
  • 1.this.$router是VueRouter的一个对象,表示全局路由器对象,项目中通过router路由参数注入路由之后,在任何一个页面都可以通过此方法获取到路由器对象,并调用其push(), go()等方法; 2.this.$router表示当前正在...
  • VueRouterrouter-view小记

    千次阅读 2018-05-18 16:04:05
    router-view可以实现局部加载,很方便,但是也有坑。router-view使用的前提是,局部加载的组件和加载它的组件要有父子关系,也就是说,需要在加载router-view的组件配置children路由如:{ path: '/attend', name: ...
  • ICMP Router advertisement/Router solicitation.

    千次阅读 2018-06-26 18:20:48
    ICMP Router advertisement/Router solicitation. http://www.networksorcery.com/enp/protocol/icmp/msg9.htm http://www.networksorcery.com/enp/protocol/icmp/msg10.htm   IP:BOOTP, RARP, or ICMP ...
  • 首先是vue提供的router-link,使用后再页面里会转换为a标签 <router-link to="/test">go home</router-link> 使用函数进行任意页面跳转 普通跳转 <button @click="jump('/test')">Click Me<...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 114,275
精华内容 45,710
关键字:

router