您现在的位置是:首页 >学无止境 >谷粒学苑第二章前端框架-2.4讲师的增删改+路由跳转网站首页学无止境

谷粒学苑第二章前端框架-2.4讲师的增删改+路由跳转

花果水莲 2024-09-04 00:01:02
简介谷粒学苑第二章前端框架-2.4讲师的增删改+路由跳转

一、新增

第一步:添加路由,UI定向到views/edu/teacher/save页面

{
    path: 'save',
    name: '讲师添加',
    component: () => import('@/views/edu/teacher/save'),
    meta: { title: '讲师添加', icon: 'tree' }
}

第二步:在views目录下创建文件夹edu/teacher/并创建save.vue页面。

<template>
  <div class="app-container">
    <el-form label-width="120px">
      <el-form-item label="讲师名称">
        <el-input v-model="teacher.name"/>
      </el-form-item>
      <el-form-item label="讲师排序">
        <el-input-number v-model="teacher.sort" controls-position="right" min="0"/>
      </el-form-item>
      <el-form-item label="讲师头衔">
        <el-select v-model="teacher.level" clearable placeholder="请选择">
          <!--
            数据类型一定要和取出的json中的一致,否则没法回填
            因此,这里value使用动态绑定的值,保证其数据类型是number
          -->
          <el-option :value="1" label="高级讲师"/>
          <el-option :value="2" label="首席讲师"/>
        </el-select>
      </el-form-item>
      <el-form-item label="讲师资历">
        <el-input v-model="teacher.career"/>
      </el-form-item>
      <el-form-item label="讲师简介">
        <el-input v-model="teacher.intro" :rows="10" type="textarea"/>
      </el-form-item>
      <!-- 讲师头像:TODO -->
      <el-form-item>
        <el-button :disabled="saveBtnDisabled" type="primary" @click="saveOrUpdate">保存</el-button>
      </el-form-item>
    </el-form>

  </div>
</template>

第三步:定义api,调用后端接口。

src/api/edu/teacher.js

    addTeacher(eduTeacher){
        return request({
            url: `/eduservice/teacher/addteacher`,
            method: 'post',
            //data表示把对象转换成json进行传递到接口里面,后端使用RequestBody获取数据
            data: eduTeacher
          })
    }

引入teacher api模块

import teacher from '@/api/edu/teacher'

// 保存
saveData() {
      teacher.save(this.teacher).then(response => {
        return this.$message({
          type: 'success',
          message: '保存成功!'
        })
      }).then(resposne => {
        this.$router.push({ path: '/edu/teacher' })
      }).catch((response) => {
        // console.log(response)
        this.$message({
          type: 'error',
          message: '保存失败'
        })
      })
    }

二、路由跳转到其他页面

this.$router.push({ path: '/edu/teacher' }):跳转到/edu/teacher页面。

三、修改

3.1 每条记录后面添加"修改"按钮

<el-table-column label="操作" width="200" align="center">
        <template slot-scope="scope">
          <router-link :to="'/edu/teacher/edit/'+scope.row.id">
            <el-button type="primary" size="mini" icon="el-icon-edit">修改</el-button>
          </router-link>
          <el-button type="danger" size="mini" icon="el-icon-delete" @click="removeDataById(scope.row.id)">删除</el-button>
        </template>
      </el-table-column>

<router-link :to="'/edu/teacher/edit/'+scope.row.id">表示路由跳转到指定的地址

3.2 通过路由跳转进入数据回显页面,在路由index页面添加路由

{
        path: 'edit/:id',  //:id相当于占位符
        name: '讲师修改',
        component: () => import('@/views/edu/teacher/save'),
        meta: { title: '讲师修改', icon: 'tree' },
        hidden:true
      },

3.3 点击修改按钮,进入表单页面,进行数据回显

(1) teacher.js

getTeacherInfo(id){
    return request({
        url: `/eduservice/teacher/getTeacherById/${id}`,
        method: 'get',
      })
},

(2) save.vue 

getTeacherInfo(id){
    teacher.getTeacherInfo(id)
        .then(response=>{
            this.eduTeacher = response.data.teacher
    })
}

(3)调用 根据id查询方法

因为添加和修改使用save页面,添加还是修改的区别是:只有修改的时候查询数据回显。

判断路径中是否包含讲师的id值,如果有id值则是修改,没有id值则是添加。

created(){ //页面渲染之前执行
    //判断路径是否有id值
    if(this.$route.params && this.$route.params.id){
        //从路径中获取id值
        const id = this.$route.params.id
        //调用根据id查询方法
        this.getTeacherInfo(id)
    }    
},

四、存在的问题

vue-router导航切换 时,如果两个路由都渲染同个组件,组件会重(chong)用,

组件的生命周期钩子(created)不会再被调用, 使得组件的一些数据无法根据 path的改变得到更新

因此:

1、我们可以在watch中监听路由的变化,当路由变化时,重新调用created中的内容

2、在init方法中我们判断路由的变化,如果是修改路由,则从api获取表单数据,

      如果是新增路由,则重新初始化表单数据

在create方法后面添加监听

watch:{  //监听
    $route(to,from){  //路由变化方式,路由发生变化,方法就会执行
        this.init()
    }
},
init(){
    if (this.$route.params && this.$route.params.id) {
        const id = this.$route.params.id
        this.getTeacherInfo(id) //根据id查询
    } else {//路径没有id值做添加
         this.eduTeacher = {}
    }
},

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。