在使用过程中,两个路由地址用到了同一个页面,需要根据某条件判断是哪个路由过来的,做出不同的处理。
例如如下页面:
在这里插入图片描述
在这里插入图片描述
添加讲师的路由在左侧显示了出来,但是修改讲师是隐藏的路由。
添加讲师和修改讲师用到了同一个页面,但是由不同的路由地址进行跳转,修改需要回显讲师数据信息,所以需要加以判断。
在设置路由时,可以在修改的路由上做如下设置:

{
        path: 'updateTeacher/:id',
        name: '修改讲师',
        component: () => import('@/views/edu/teacher/save'),
        meta: { title: '修改讲师' },
        hidden: true
      }

路由地址后边跟着:id,“id”只是一个变量名,随便写,后续用到了地址中的这串数据,需要从路由对象中以“id”取。 看着和springMvc中请求地址上的{id}很像,例如:@requestMapping("/getList/{id}"),那么在入参上用@PathVariable取出。
此例中,这是讲师实体的id。
跳到这个路由的时候,地址后边跟上id数据,如:

<router-link :to="'/teacher/updateTeacher/'+scope.row.id">
            <el-button type="primary" size="mini" icon="el-icon-edit">修改</el-button>
          </router-link>

那么跳转后的路由就是这样(看地址栏,带上了ID):
在这里插入图片描述
然后在修改页面中,可以通过this.$route.params.id取出地址后的id值。
由于这个判断会被复用,我抽成了一个叫init的函数。

//判断是否是更新,是更新则根据id查出讲师数据回显
        init(){
          if(this.$route.params && this.$route.params.id){
            const id = this.$route.params.id
            this.getTeacherById(id)
          }else{
            this.teacher = {}
          }
        }

所以,最后的处理就是,在修改页面,我们在create生命周期方法中,进行调用init方法进行判断,看到底是新增还是修改,是修改则查询数据进行回显,是新增那就需要清空输入框,为什么清空?稍后说。
代码如下:
create方法会在页面加载完成之前调用,也就是渲染前

created(){
        this.init()
    },

但是,这样会有一个问题,由于新增和修改用的是一个路由,那么当我点击修改以后,页面是有回显内容的,接着点击一下新增,页面中的回显数据依然存在,业务上我们是需要它清空的,所以我在自定义的init方法判断中,加了个else,但是,没有效果。
之所以没有效果,就是因为生命周期问题。
当点击了修改,页面渲染完成之前,会进行判断,然后是否回显数据。当我们接着点击新增,由于新增的路由指向的依然是此页面,所以不会执行crate函数了。
想接着点击新增还能进行init的判断,那么就需要加上一个监听,watch,代码:

watch:{
       $route(to, from){
          this.init()
       }
    }

它会对路由进行监听,如果路由发生了变化,就会调用init方法,进行判断是否进行数据回显。

Logo

前往低代码交流专区

更多推荐