小工具知识网

当前位置: 首页 > 行业知识 > vue2 element 实现表格点击详情,返回时保留查询参数

行业知识

vue2 element 实现表格点击详情,返回时保留查询参数

2026-11-07 13:11:43 来源:互联网转载

先���观一点,上图

列表共5条数据,准备输入Author过滤条件进行查询

进入查看详情页,就随便搞了个按钮,将就看吧

点击返回后

一开始准备用vuex做这个功能,后来放弃了,想到直接用路由去做可能也不错。有时间再整一套vuex版的,也很简单

                                                                                                                                查询          重置                                    {{ scope.$index }}                    {{ scope.row.title }}                              {{ scope.row.author }}                            {{ scope.row.pageviews }}                              {{ scope.row.status }}                                                {{ scope.row.display_time }}                                      查看          编辑                    import { getList } from '@/api/table'// import { createNamespacedHelpers } from 'vuex'// const { mapMutations, mapActions } = createNamespacedHelpers('queryParams')export default {  filters: {    statusFilter(status) {      const statusMap = {        published: 'success',        draft: 'gray',        deleted: 'danger'      }      return statusMap[status]    }  },  beforeRouteEnter(to, from, next) {    // console.log('beforeRouteEnter:', from);      /**       * 官方文档是这样写明的:       * -- start --       * beforeRouteEnter 守卫不能访问this,因为守卫在导航确认前被调用,因此即将登场的新组件还没被创建。       * 不过,你可以通过传一个回调给 next 来访问组件实例。在导航被确认的时候执行回调,并且把组件实例作为回调方法的参数       * beforeRouteEnter (to, from, next) {          next(vm => {            // 通过 `vm` 访问组件实例          })        }      * -- end --      * 重点是第二句话,说明是有方法给组件实例修改值的      */          /** 有问题的写法       * const data = { testMsg: '测试信息'}       * const saveData = data       * next(vm => {       * 在这里卡了很久,这样写的话,组件created抑或mounted里,可以访问data的属性,但却拿不到beforeRouteEnter中定义的属性       *  //vm.saveData = saveData       *  //vm.$set(vm, 'saveData', saveData)       *        * })       *        * 执行顺序:       * beforeRouteEnter       * beforeCreate       * mounted       * vm       */// 有效处理    let obj = {}    if (from.name == 'itemDetail') {      obj = from.params    } else {      obj = {}    }    next(vm => {      /**       * 在这里卡了很久后,尝试将设置value写入methods方法中使用vm来调用,       * mounted拿不到beforeRouteEnter这里定义的变量,但是它可以访问vm实例的变量和方法       * 再将beforeRouteEnter这定义的对象作为函数参数       */       vm.setFilterParams(obj)    })  },  data() {    return {      list: null,      listLoading: false,      queryParams: {        author: '',        status: ''      },    }  },  created(){    this.fetchData()  },  mounted() {    // if (    //   Object.keys(this.$store.state.queryParams.filterParams).length === 0    // ) {    //   this.queryParams = {    //     // pageNum: 1,    //     // pageSize: 10,    //     author: '',    //     status: ''    //   };    // } else {    //   this.queryParams = JSON.parse(    //     JSON.stringify(this.$store.state.queryParams.filterParams)    //   );    // }  },  methods: {    // ...mapActions(["filterCache"]),    setFilterParams(obj) {      this.queryParams = Object.assign({},obj)      this.fetchData()    },    fetchData() {      this.listLoading = true      let queryParams = this.queryParams      getList(queryParams).then(response => {        this.list = response.data.items        this.listLoading = false      })    },    // 查看    doView(row) {      this.$router.push({        /* path与params不可同时出现 */        // path: 'table/itemDetail',        name: 'itemDetail',        params: this.queryParams      })    },    // 查询    onSubmit() {      // this.$store.dispatch("queryParams/filterCache", this.queryParams);      // this.filterCache(this.queryParams)      this.fetchData()    },    reset() {      this.queryParams = {}      this.fetchData()    }  }}

上面重点部分就是beforeRouteEnter了:

beforeRouteEnter(to, from, next) {    // console.log('beforeRouteEnter:', from);      /**       * 官方文档是这样写明的:       * -- start --       * beforeRouteEnter 守卫不能访问this,因为守卫在导航确认前被调用,因此即将登场的新组件还没被创建。       * 不过,你可以通过传一个回调给 next 来访问组件实例。在导航被确认的时候执行回调,并且把组件实例作为回调方法的参数       * beforeRouteEnter (to, from, next) {          next(vm => {            // 通过 `vm` 访问组件实例          })        }      * -- end --      * 重点是第二句话,说明是有方法给组件实例修改值的      */          /** 有问题的写法       * const data = { testMsg: '测试信息'}       * const saveData = data       * next(vm => {       * 在这里卡了很久,这样写的话,组件created抑或mounted里,可以访问data的属性,但却拿不到beforeRouteEnter中定义的属性       *  //vm.saveData = saveData       *  //vm.$set(vm, 'saveData', saveData)       *        * })       *        * 执行顺序:       * beforeRouteEnter       * beforeCreate       * mounted       * vm       */// 有效处理    let obj = {}    if (from.name == 'itemDetail') {      obj = from.params    } else {      obj = {}    }    next(vm => {      /**       * 在这里卡了很久后,尝试将设置value写入methods方法中使用vm来调用,       * mounted拿不到beforeRouteEnter这里定义的变量,但是它可以访问vm实例的变量和方法       * 再将beforeRouteEnter这定义的对象作为函数参数       */       vm.setFilterParams(obj)    })  },
在这里插入代码片
      返回  export default {  name: 'itemDetail',  data() {    return {    }  },  created() {    // console.log(this.$route);  },  methods: {    handleClick() {    /**       * go(-1): 原页面表单中的内容会丢失;       * this.$router.go(-1):后退+刷新;       * this.$router.go(0):刷新;       * this.$router.go(1) :前进       *        * back(): 原页表表单中的内容会保留;在返回界面传递参数;       * this.$router.back():后退 ;       * this.$router.back(0) 刷新;       * this.$router.back(1):前进       *        */      this.$router.back()    }  },  watch: {  }}

上一篇:服务器怎么把com口停掉?

下一篇:苹果手机无服务器怎么连接?