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

本文档介绍了如何在Vue.js应用中实现讲师管理功能,包括讲师列表、新增和编辑操作。通过路由配置,将讲师新增和编辑共用同一页面,利用动态参数`edit/:id`来区分新增和修改操作。在`watch`中监听路由变化以更新表单数据,确保组件数据根据路由变化正确加载。同时,展示了如何在页面中设置表单元素,并提供了相应的API调用以保存或更新讲师信息。
摘要由CSDN通过智能技术生成

路由设置 在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 }
      }
    }
……
这个问题通常是因为在进入新增页面时,没有清空组件中的数据,导致组件中的数据仍然是上一次编辑的数据。解决这个问题的方法有两种: 1. 在进入新增页面时,手动清空组件中的数据。 你可以在进入新增页面时,手动将组件中的数据清空。比如,在 `mounted` 钩子函数中,将组件中的数据重置为默认值,或者赋值为空。 ```vue <template> <div> <!-- 表单组件 --> </div> </template> <script> export default { data() { return { form: { // 表单数据 } } }, mounted() { // 重置表单数据 this.form = { // 表单数据的默认值 } } } </script> ``` 2. 在进入新增页面时,使用不同的数据对象。 你可以在进入新增页面时,使用一个新的数据对象,而不是使用上一次编辑的数据对象。这样可以避免在新增页面回显编辑的数据。 ```vue <template> <div> <!-- 表单组件 --> </div> </template> <script> export default { data() { return { form: { // 表单数据 } } }, created() { // 判断是否是编辑页面 if (this.$route.params.id) { // 如果是编辑页面,则从后端获取数据,然后为 form 赋值 this.fetchData() } else { // 如果是新增页面,则使用一个新的数据对象 this.form = { // 表单数据的默认值 } } }, methods: { fetchData() { // 从后端获取数据,然后为 form 赋值 } } } </script> ``` 这两种方法都可以解决组件回显编辑的数据的问题,具体使用哪种方法取决于你的具体需求。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值