vue新增和修改使用同一页面
路由设置 在route文件夹下index.js文件设置教师新增和修改公用同一个页面export const constantRouterMap = [{path: '/teacher',component: Layout,redirect: '/teacher/list',name: '讲师管理',meta: { title: '讲师管理', icon: 'example' },children:
·
路由设置 在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条内容
所有评论(0)