[dva]解决页面路由变化但页面不刷新的问题

一、问题描述:

点击同一页面不同数据跳转到该数据的详情页面时,路由变化但页面停留在第一次点击的数据详情页面,除非每次点击后关闭该详情页面,再点击下一个数据。

二、发生原因:

当第一次点击数据路由跳转后的详情页面未关闭时,再点击另一个数据执行路由跳转第二次传入的参数Id,虽然路由变化,但此时并未识别为一个新的页面,props中数据只有history的路由相关信息发生改变,此时并未重新执行React的生命周期,因此compontentDidMount中的dispath请求并未发出,因此数据未更新。

三、解决方法:

使用dva的订阅。在dva中我们可以在 Model 中实现事件监听, model 中的 subscriptions 相当于一个监听器,可以监听路由变化,鼠标,键盘变化,服务器连接变化,状态变化等,这样在其中就可以根据不同的变化做出相应的处理,在这个 subsriptions 中的方法名是随意定的,每次变化都会一次去调用里面的所有方法,所以一般会加相应的判断。

四、代码对比:

修改前:

import * as HomeworkManagementService from "@/services/HomeworkManagementService";

export default {
  namespace: 'HomeworkManagementModel',
  state: {
    homeworkData:{list:[],pagination:{}},
    pagination: {
      total: 0,
      current: 1,
      pageSize: 10,
    },
  },

  effects: {
    * fetch({payload}, {call, put}) {
      const path = window.location.pathname;
      const reg = /\/HomeworkDetail\/(\d+)/;
      const classResult = reg.exec(path);
      const courseId = classResult[1];
      payload.courseId=courseId;
      const response = yield call(HomeworkManagementService.getAllHomework, payload);
      const {data: { records, current, size, total }} = response;
      const list =records;
      const pagination = {
        current: current || 1,
        pageSize:size,
        total,
      };
      const result = {
        list,
        pagination,
      };
      yield put({
        type: 'save',
        payload: {
            homeworkData:result,
            pagination
        }
      })
    },
  },
  reducers: {
    save(state, {payload}) {
      return (
        {
          ...state,
          ...payload,
        }
      )
    },
  },
};

修改后:

import * as HomeworkManagementService from "@/services/HomeworkManagementService";

export default {
  namespace: 'HomeworkManagementModel',
  state: {
    homeworkData:{list:[],pagination:{}},
    pagination: {
      total: 0,
      current: 1,
      pageSize: 10,
    },
    currentCourseId:"",
  },

  subscriptions: {
    setupHistory({dispatch, history}) {
      history.listen((location) => {
        const {pathname} = location;
        const reg = /\/HomeworkDetail\/(\d+)/;
        if (reg.test(pathname)) {
          const courseId = reg.exec(pathname)[1];
          dispatch({
            type: 'save',
            payload: {
              currentCourseId:courseId,
            },
          })
//  保存当前页面的id后 调用fetch时也传入当前的id 避免修改后不刷新
          dispatch({
            type:'fetch',
            payload:{
              current: 1,
              pageSize: 10,
              courseId,
            }
          })
        }
      })
    }
  },

  effects: {
    * fetch({payload}, {call, put,select}) {
      const courseId =yield select(state => state.HomeworkManagementModel.currentCourseId);
      payload.courseId=courseId;
      const response = yield call(HomeworkManagementService.getAllHomework, payload);
      const {data: { records, current, size, total }} = response;
      const list =records;
      const pagination = {
        current: current || 1,
        pageSize:size,
        total,
      };
      const result = {
        list,
        pagination,
      };
      console.log(result)
      yield put({
        type: 'save',
        payload: {
            homeworkData:result,
            pagination
        }
      })
    },
  },
  reducers: {
    save(state, {payload}) {
      return (
        {
          ...state,
          ...payload,
        }
      )
    },
  },
};

​

  • 13
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值