一、新增
1、定义api
src/api/edu/teacher.js
save(teacher) {return request({url: api_name,method: 'post',data: teacher})}
2、初始化组件
src/views/edu/teacher/form.vue
html
<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>
js
<script>export default {data() {return {teacher: {name: '',sort: 0,level: 1,career: '',intro: '',avatar: ''},saveBtnDisabled: false // 保存按钮是否禁用,}},methods: {saveOrUpdate() {this.saveBtnDisabled = truethis.saveData()},// 保存saveData() {}}}</script>
3、实现新增功能
引入teacher api模块
import teacher from '@/api/edu/teacher'
完善save方法
// 保存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: '保存失败'})})}
二、回显
1、定义api
src/api/edu/teacher.js
getById(id) {return request({url: `${api_name}/${id}`,method: 'get'})}
2、组件中调用api
methods中定义fetchDataById
// 根据id查询记录fetchDataById(id) {teacher.getById(id).then(response => {this.teacher = response.data.item}).catch((response) => {this.$message({type: 'error',message: '获取数据失败'})})}
3、页面渲染前调用fetchDataById
created() {console.log('created')if (this.$route.params && this.$route.params.id) {const id = this.$route.params.idthis.fetchDataById(id)}}
三、更新
1、定义api
updateById(teacher) {return request({url: `${api_name}/${teacher.id}`,method: 'put',data: teacher})}
2、组件中调用api
methods中定义updateData
// 根据id更新记录updateData() {this.saveBtnDisabled = trueteacher.updateById(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: '保存失败'})})}
3、完善saveOrUpdate方法
saveOrUpdate() {this.saveBtnDisabled = trueif (!this.teacher.id) {this.saveData()} else {this.updateData()}}
四、存在问题
vue-router导航切换 时,如果两个路由都渲染同个组件,组件会重(chong)用,
组件的生命周期钩子(created)不会再被调用, 使得组件的一些数据无法根据 path的改变得到更新
因此:
1、我们可以在watch中监听路由的变化,当路由变化时,重新调用created中的内容
2、在init方法中我们判断路由的变化,如果是修改路由,则从api获取表单数据,
如果是新增路由,则重新初始化表单数据
<script>import teacher from '@/api/edu/teacher'const defaultForm = {name: '',sort: 0,level: '',career: '',intro: '',avatar: ''}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.idthis.fetchDataById(id)} else {// 使用对象拓展运算符,拷贝对象,而不是引用,// 否则新增一条记录后,defaultForm就变成了之前新增的teacher的值this.teacher = { ...defaultForm }}},......}}</script>
