一、新增

1、定义api

src/api/edu/teacher.js

  1. save(teacher) {
  2. return request({
  3. url: api_name,
  4. method: 'post',
  5. data: teacher
  6. })
  7. }

2、初始化组件

src/views/edu/teacher/form.vue
html

  1. <template>
  2. <div class="app-container">
  3. <el-form label-width="120px">
  4. <el-form-item label="讲师名称">
  5. <el-input v-model="teacher.name"/>
  6. </el-form-item>
  7. <el-form-item label="讲师排序">
  8. <el-input-number v-model="teacher.sort" controls-position="right" min="0"/>
  9. </el-form-item>
  10. <el-form-item label="讲师头衔">
  11. <el-select v-model="teacher.level" clearable placeholder="请选择">
  12. <!--
  13. 数据类型一定要和取出的json中的一致,否则没法回填
  14. 因此,这里value使用动态绑定的值,保证其数据类型是number
  15. -->
  16. <el-option :value="1" label="高级讲师"/>
  17. <el-option :value="2" label="首席讲师"/>
  18. </el-select>
  19. </el-form-item>
  20. <el-form-item label="讲师资历">
  21. <el-input v-model="teacher.career"/>
  22. </el-form-item>
  23. <el-form-item label="讲师简介">
  24. <el-input v-model="teacher.intro" :rows="10" type="textarea"/>
  25. </el-form-item>
  26. <!-- 讲师头像:TODO -->
  27. <el-form-item>
  28. <el-button :disabled="saveBtnDisabled" type="primary" @click="saveOrUpdate">保存</el-button>
  29. </el-form-item>
  30. </el-form>
  31. </div>
  32. </template>

js

  1. <script>
  2. export default {
  3. data() {
  4. return {
  5. teacher: {
  6. name: '',
  7. sort: 0,
  8. level: 1,
  9. career: '',
  10. intro: '',
  11. avatar: ''
  12. },
  13. saveBtnDisabled: false // 保存按钮是否禁用,
  14. }
  15. },
  16. methods: {
  17. saveOrUpdate() {
  18. this.saveBtnDisabled = true
  19. this.saveData()
  20. },
  21. // 保存
  22. saveData() {
  23. }
  24. }
  25. }
  26. </script>

3、实现新增功能

引入teacher api模块

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

完善save方法

  1. // 保存
  2. saveData() {
  3. teacher.save(this.teacher).then(response => {
  4. return this.$message({
  5. type: 'success',
  6. message: '保存成功!'
  7. })
  8. }).then(resposne => {
  9. this.$router.push({ path: '/edu/teacher' })
  10. }).catch((response) => {
  11. // console.log(response)
  12. this.$message({
  13. type: 'error',
  14. message: '保存失败'
  15. })
  16. })
  17. }

二、回显

1、定义api

src/api/edu/teacher.js

  1. getById(id) {
  2. return request({
  3. url: `${api_name}/${id}`,
  4. method: 'get'
  5. })
  6. }

2、组件中调用api

methods中定义fetchDataById

  1. // 根据id查询记录
  2. fetchDataById(id) {
  3. teacher.getById(id).then(response => {
  4. this.teacher = response.data.item
  5. }).catch((response) => {
  6. this.$message({
  7. type: 'error',
  8. message: '获取数据失败'
  9. })
  10. })
  11. }

3、页面渲染前调用fetchDataById

  1. created() {
  2. console.log('created')
  3. if (this.$route.params && this.$route.params.id) {
  4. const id = this.$route.params.id
  5. this.fetchDataById(id)
  6. }
  7. }

三、更新

1、定义api

  1. updateById(teacher) {
  2. return request({
  3. url: `${api_name}/${teacher.id}`,
  4. method: 'put',
  5. data: teacher
  6. })
  7. }

2、组件中调用api

methods中定义updateData

  1. // 根据id更新记录
  2. updateData() {
  3. this.saveBtnDisabled = true
  4. teacher.updateById(this.teacher).then(response => {
  5. return this.$message({
  6. type: 'success',
  7. message: '修改成功!'
  8. })
  9. }).then(resposne => {
  10. this.$router.push({ path: '/edu/teacher' })
  11. }).catch((response) => {
  12. // console.log(response)
  13. this.$message({
  14. type: 'error',
  15. message: '保存失败'
  16. })
  17. })
  18. }

3、完善saveOrUpdate方法

  1. saveOrUpdate() {
  2. this.saveBtnDisabled = true
  3. if (!this.teacher.id) {
  4. this.saveData()
  5. } else {
  6. this.updateData()
  7. }
  8. }

四、存在问题

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

  1. <script>
  2. import teacher from '@/api/edu/teacher'
  3. const defaultForm = {
  4. name: '',
  5. sort: 0,
  6. level: '',
  7. career: '',
  8. intro: '',
  9. avatar: ''
  10. }
  11. export default {
  12. data() {
  13. return {
  14. teacher: defaultForm,
  15. saveBtnDisabled: false // 保存按钮是否禁用,
  16. }
  17. },
  18. watch: {
  19. $route(to, from) {
  20. console.log('watch $route')
  21. this.init()
  22. }
  23. },
  24. created() {
  25. console.log('created')
  26. this.init()
  27. },
  28. methods: {
  29. init() {
  30. if (this.$route.params && this.$route.params.id) {
  31. const id = this.$route.params.id
  32. this.fetchDataById(id)
  33. } else {
  34. // 使用对象拓展运算符,拷贝对象,而不是引用,
  35. // 否则新增一条记录后,defaultForm就变成了之前新增的teacher的值
  36. this.teacher = { ...defaultForm }
  37. }
  38. },
  39. ......
  40. }
  41. }
  42. </script>