vue 路由跳转详情页,返回时页码依然在当前页

首先项目中使用的是element-ui,用的el-table,el-pagination

1.使用vuex,把当前页存起来

在store中新建一个modules,命名list.js文件

复制代码
const list = {
  state: {
    currentPage: 1
  },

  mutations: {
    SET_CURRENT_PAGE: (state, currentPage) => {
      state.currentPage = currentPage;
    }
  },

  actions: {
    setCurrentPage({ commit }, currentPage) {
      commit("SET_CURRENT_PAGE", currentPage);
    }
  }
};
export default list;

store/index.js中导入 list:

复制代码
import backtolist from "./modules/list";
import getters from "./getters";
...
const store = new Vuex.Store({
  modules: {
    list 
  },
  getters
});

export default store;

getters.js中获取定义好的currentPage变量

复制代码
const getters = {
 ...
  currentPage: (state) => state.list.currentPage,
};
export default getters;

在当前的表格的vue文件table.vue中写,因为我这个table,vue是子组件,导致beforeRouteLeave无效,watch监听路由还获取不到from值,所以采用以下方法,在父组件中使用beforeRouteEnter路由钩子

复制代码
table.vue  子组件
import { mapGetters } from 'vuex'
data() {
    return {
      query: {
        page: 1,
        limit: 15
      },
    }
  },
  computed: {
    ...mapGetters(['currentPage'])//获取当前页码
  }
 methods: {
    //进入详情的时候把当前页码存起来
    handleOperator(row) {
      this.$router.push({path: '/detail'})
      this.$store.dispatch("setCurrentPage", this.query.page);
    },
}

父组件list.vue
//进入页面就会执行该路由钩子
  beforeRouteEnter(to, from, next) {
    // 在渲染该组件的对应路由被 confirm 前调用
    // 不!能!获取组件实例 `this` 因为当守卫执行前,组件实例还没被创建
    // 可以通过传一个回调给 next来访问组件实例。在导航被确认的时候执行回调,
    并且把组件实例作为回调方法的参数。
    next(vm => {
      // 通过 `vm` 访问组件实例
      //如果是从detail详情页跳转过来的吧分页初始化
      if (from.name != 'detail') {
        vm.$store.dispatch('setCurrentPage', 1)
      }
      vm.$refs['tableList'].getData()//重新获取数据
    })
  },

这里需要注意的是beforeRouteEnter和mounted执行的先后顺序

复制代码
beforeRouteEnter (to, from, next) {
    console.log(1)
    getData(str) // 接口
      .then(({ data}) => {
        console.log(5)
        next(vm => {
          console.log(7)
          vm.tableData = data
          console.log(4)
        })
      })
  },

  created() {
    console.log(2)
  },

  mounted() {
    console.log(3)
  },
执行控制台打印出的顺序
1 5 2 3 7 4

到这里会遇到一个问el-pagination组件,current-page 绑定的数据变了,但是页面当前页码并没有变的问题,这是element的分页bug,使用v-if绑定分页。每次搜索的时候就会注销掉一个分页的Dom,等数据刷新完毕,再渲染一个相同的分页,重新渲染必须放到$nextTick中

复制代码
<el-pagination
      v-if="pageShow"
      :current-page.sync="currentPage"
      :page-size.sync="pageSize"
      :page-sizes="pageSizes"
      :total="total"
      @size-change="handleSizeChange"
      @current-change="handleCurrentChange"
    />
  methods: {
 async getData(obj) {
      this.pageShow = false;
      if (!obj) {
        this.query.page = this.currentPage
      }
      this.tableLoading = true
      const params = { ...this.filter, ...this.query }
      const { data, meta } = await getData(params)
      if (typeof data === 'undefined') {
        this.dataList = []
      } else {
        this.dataList = data
      }
      this.total = meta.total
      this.tableLoading = false
      //处理数据变了,当前页码并没有变的问题
      this.$nextTick(()=>{
        this.pageShow = true;
      });
    }
}
相关推荐
luback12 分钟前
页面编辑器CodeMirror初始化不显示行号或文本内容
前端·codemirror
爱的叹息12 分钟前
关于 Spring Boot + Vue 前后端开发的打包、测试、监控、预先编译和容器部署 的详细说明,涵盖从开发到生产部署的全流程
vue.js·spring boot·后端
一勺-_-12 分钟前
Chrome浏览器和Microsoft Edge浏览器的导出收藏链接
前端·chrome·edge
无名之逆19 分钟前
[特殊字符] 超轻高性能的 Rust HTTP 服务器 —— Hyperlane [特殊字符][特殊字符]
java·服务器·开发语言·前端·网络·http·rust
蘑菇头爱平底锅24 分钟前
数字孪生-DTS-孪创城市-导览功能、虚拟现实
前端·数据可视化
一口一个橘子1 小时前
[ctfshow web入门] web40
前端·web安全·网络安全
Z编程1 小时前
vue3实现markdown工具栏的点击事件监听
前端·javascript·vue.js
sen_shan1 小时前
Vue3+Vite+TypeScript+Element Plus开发-10.多用户动态加载菜单
vue.js·typescript·vue3·element·element plus·动态菜单·多用户动态加载菜单
华科云商xiao徐1 小时前
多语言编写的图片爬虫教程
前端
日升_rs1 小时前
Electron 开发:获取当前客户端 IP
前端·javascript