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

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

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

路由设置 在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 }
      }
    }
……
### Vue 2 中添加新地址功能的实现 #### 表单设计与初始化 为了实现在同一页面既能添加又能编辑地址,在表单对象中加入一个额外属性`addr_id`来区分操作模式。当此字段为空(null),则表示当前处于新增状态;反之,则代表正在进行已有记录的更新[^3]。 ```javascript data() { return { addressForm: { addr_id: null, name: '', phone: '', detailAddress: '' } }; } ``` #### 组件模板结构 创建包含输入框以及提交按钮在内的HTML片段,通过v-model指令绑定数据模型至视图层面上各个控件上。对于按钮部分,可以设置样式并定义点击事件处理器以便后续逻辑处理[^4]。 ```html <el-form :model="addressForm"> <!-- 用户名 --> <el-form-item label="联系人姓名"> <el-input v-model="addressForm.name"></el-input> </el-form-item> <!-- 手机号 --> <el-form-item label="手机号码"> <el-input v-model="addressForm.phone"></el-input> </el-form-item> <!-- 地址详情 --> <el-form-item label="详细地址"> <el-input type="textarea" v-model="addressForm.detailAddress"></el-input> </el-form-item> <!-- 提交按钮 --> <div class="submit-btns"> <button @click.prevent="saveAddress">保存</button> <button @click.prevent="resetForm">重置</button> </div> </el-form> ``` #### 处理函数编写 针对不同的业务需求分别定义相应的JavaScript方法: - `saveAddress`: 判断是否存在有效的ID值(`addr_id`),以此决定调用API接口执行增加还是修改动作; - `resetForm`: 清除所有已填写的信息并将组件恢复到初始态,准备下一次录入工作。 ```javascript methods: { saveAddress(){ const id = this.addressForm.addr_id; if(id === null){ // 调用服务端接口完成新建流程... console.log('正在尝试向服务器发送新的地址...'); // 假设成功后刷新列表显示最新结果集 alert('恭喜您!您的新地址已经成功保存!'); }else{ // 更新现有条目的信息... console.log(`即将更新id=${id}对应的那一条目`); // 成功提示语句同上 alert('该地址已被更新'); } // 不论哪种情况都应清空本地缓存的数据项 Object.assign(this.$data.addressForm, this.$options.data().addressForm); }, resetForm(){ Object.assign(this.$data.addressForm, this.$options.data().addressForm); } } ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值