使用dvajs,在无状态组件中dispatch一个effects会不停的发送请求?

在model文件中

import { articleDetail } from '../../service/api';
export default {
  namespace: 'article',

  state: {
    detail: null
  },
  
  reducers: {
    saveDetail(state, { payload }) {
      return {
        ...state,
        detail: payload
      };
    }
  },

  effects: {
    *articleDetail({ payload: threadId }, { call, put }) {
      const res = yield call(articleDetail, threadId);
      if (res.code === 200) {
        yield put({
          type: 'saveDetail',
          payload: res.data
        });
      }
    },
  }
}

在组件中

import React from 'react';
import { connect } from 'dva';

function ArticleDetail({ match, dispatch }) {

  dispatch({
    type: 'article/articleDetail',
    payload: match.params.id
  });

  return (
    <div>detail/{match.params.id}</div>
  );
}

export default connect(({ article }) => ({ article }))(ArticleDetail);

在无状态组件中怎么正确获取请求啊

阅读 5.9k
3 个回答

你不能在stateless中直接dispatch一个effect.

import React from 'react';
import { connect } from 'dva';

function ArticleDetail({ match, dispatch }) {

  //dispatch({
  //  type: 'article/articleDetail',
  //  payload: match.params.id
  //});

  return (
    <div>detail/{match.params.id}</div>
  );
}

export default connect(({ article }) => ({ article }))(ArticleDetail);

注释掉的部分不能那么写。
如果想在页面第一次进入加载,请写在subscriptions中,或者写在componentDidMount()方法中

你在articleDetail中调用articleDetail了把?

effects: {
    *articleDetail({ payload: threadId }, { call, put }) {
      // 调用articleDetail
      const res = yield call(articleDetail, threadId);
      if (res.code === 200) {
        yield put({
          type: 'saveDetail',
          payload: res.data
        });
      }
    },
  }

二楼的答案是正确的,也遇到了一样的情况,因为请求的名字和effects中的一样,所以导致重复调用。

effects: {
    *articleDetail({ payload: threadId }, { call, put }) {
      // 调用articleDetail
      const res = yield call(articleDetail, threadId);
      if (res.code === 200) {
        yield put({
          type: 'saveDetail',
          payload: res.data
        });
      }
    },
  }

articleDetail更改一个就可以了

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题