vue新增和修改使用同一页面

路由设置 在route文件夹下index.js文件设置
教师新增和修改公用同一个页面

export const constantRouterMap = [
 {
    path: '/teacher',
    component: Layout,
    redirect: '/teacher/list',
    name: '讲师管理',
    meta: { title: '讲师管理', icon: 'example' },
    children: [
      {
        path: 'list',
        name: '讲师列表',
        component: () => import('@/views/teacher/list'),
        meta: { title: '讲师列表', icon: 'table' }
      },
      {
        path: 'add',
        name: '讲师新增',
        component: () => import('@/views/teacher/form'),
        meta: { title: '讲师新增', icon: 'tree' }
      },
      {
        path: 'edit/:id',// : 用来传递参数的
        name: '讲师修改',
        component: () => import('@/views/teacher/form'),
        meta: { title: '讲师修改', icon: 'tree' },
        hidden:true   //不显示
      }
    ]
  },
 ]

页面代码

<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>

<script>
import teacher from "@/api/edu/teacher"

const defaultFrom = {
          name: '',
          sort: 0,
          level: 1,
          career: '',
          intro: '',
          avatar: ''
      }

export default {
  data () {
    return {
      teacher: defaultFrom,
      saveBtnDisabled: false // 不启用disabled, 保存按钮为亮色
    }
  },
  // watch的作用可以监控一个值的变换,并调用因为变化需要执行的方法。
  //监听路由是否发生变化
  watch: {
    $route(to, from) {
      //当监听的路由这个方法执行的时候,
      //我们是不是判断此路由过来的参数是否存在,
      //如果不存在,那就说明是新增
      //如果存在那么说明修改过来的
      this.init()
    }
  },
  created () {// 在加载的时候执行了这个方法,可以调用这个根据ID来插叙的方法
      // 执行此方法、获取我们的参数
      this.init()
  },
  methods: {
    init(){
      // 判断是否有参数
        if(this.$route.params && this.$route.params.id){ // 当加载页面的时候就要获取参数的值了
            this.selectById(this.$route.params.id)
        } else{
            //this.teacher = defaultFrom
            // 没有参数  清空
            this.teacher = {...defaultFrom}
        }
    },
    // 1、 怎么判断是否是新增还是修改
    // 2、 根据teacher.id来判断

    saveOrUpdate(){
      //当点击按钮的时候,让保存按钮为浅色, 不启用
      this.saveBtnDisabled = true
		//判断teacher.id是否存在  存在则为修改
      if(this.teacher.id){
        this.updateById()
      } else{
        this.save()
      }

    },
    save(){
      teacher.save(this.teacher)
        .then(response => {
          return this.$message({
            type: 'success',
            message: '保存成功!'
          })
        })
        .then(response => {
          this.$router.push({path : "/teacher/list"})
        })
        .catch(response => {
          return this.$message({
            type: 'error',
            message: '保存失败!'
          })
        })
    },
    updateById(){
        teacher.updateById(this.teacher)
          .then(response => {
            //修改提示
            this.$message({
              type:'success',
              message:'修改成功'
            })
          })
          .then(response => {
            this.$router.push({path:"/teacher/list"})
          })
          .catch(response => {
            this.$message({
              type:'error',
              message:response.data.message
            })
          })
    },
    selectById(id){
        teacher.selectById(id)
          .then(response => {
             this.teacher = response.data.teacher
          }).catch(response => {
            this.$message({
              type:'error',
              message:"获取失败"
            })
          })
    }
  }
}
</script>


分析
修改的时候应该点击列表中的修改按钮,然后跳转到添加的页面但是里面的数据应该要根据点击此行的ID查询数据回显,在list.vue中点击修改:

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

在src/router路由中再添加一个/teacher/edit的路由,指向add.vue页面,但是这个页面需要隐藏,不必在后台管理页面导航中出现,

{
        path: 'edit/:id',
        name: '讲师修改',
        component: () => import('@/views/teacher/form'),
        meta: { title: '讲师修改', icon: 'tree' },
        hidden:true
}

此时中path:’edit/:id’中“:” 用于指定参数的

存在问题
vue-router导航切换 时,如果两个路由都渲染同个组件,组件会重(chong)用,
组件的生命周期钩子(created)不会再被调用, 使得组件的一些数据无法根据 path的改变得到更新
因此:
1、我们可以在watch中监听路由的变化,当路由变化时,重新调用created中的内容
2、在init方法中我们判断路由的变化,如果是修改路由,则从api获取表单数据,如果是新增路由,则重新初始化表单数据

定义teacher对象初始化:

<script>
import teacher from '@/api/edu/teacher'
const defaultForm = {
  name: '',
  sort: 0,
  level: '',
  career: '',
  intro: '',
  avatar: ''
}
……

那么在export default中:

export default {
  data() {
    return {
      teacher: defaultForm,
      saveBtnDisabled: false // 保存按钮是否禁用,
    }
  },
  watch: {
    $route(to, from) {
      console.log('watch $route')
      this.init()
    }
  },
  created() {
    console.log('created')
    this.init()
  },
  methods: {
    init() {
      if (this.$route.params && this.$route.params.id) {
        const id = this.$route.params.id
        this.selectById(id)
      } else {
        // 使用对象拓展运算符,拷贝对象,而不是引用,
        // 否则新增一条记录后,defaultForm就变成了之前新增的teacher的值
        this.teacher = { ...defaultForm }
      }
    }
……
  • 8
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值