账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    使用dvajs,在无状态组件中dispatch一个effects会不停的发送请求?
    45
    0

    在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);

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

    0
    打赏
    收藏
    点击回答
        全部回答
    • 0
    • 无期过往ヘ 普通会员 1楼

      在Dva.js中,通过在无状态组件中dispatch一个effects时,如果经常性地发送请求,可能会导致性能问题和不必要的请求开销。以下是一些可能导致这种情况的原因和解决方案:

      1. 频繁的API调用:如果你的actions或effects频繁地调用API,那么每次调用都可能被视为一个新的请求,导致API返回的结果被发送到状态更新的组件中。这种情况下,如果你在状态更新的组件中进行任何操作(如修改状态或调用其他actions),那么每个新的状态更新都会重新调用API,导致重复的API调用。

      解决方案: a. 缓存数据:在需要频繁调用API的actions或effects中,可以使用Promise的catch方法来捕获和处理可能的错误。在axios或fetch等库中,你可以使用catch方法来捕获Promise的错误,并在Promise成功或失败时更新状态。例如:

      ```javascript import axios from 'axios';

      export const fetchData = async () => { try { const response = await axios.get('https://api.example.com/data'); // 使用response的状态更新组件 this.setState({ data: response.data }); } catch (error) { // 处理API错误 console.error(error); this.setState({ error: 'Error fetching data' }); } };

      export default fetchData; ```

      b. 使用fetch代替axios:如果你在不经常调用API的actions或effects中使用axios,那么可以考虑使用fetch代替axios。fetch不会立即发送HTTP请求,而是返回一个Promise,你可以使用Promise的thencatch方法来处理返回的结果。例如:

      ```javascript import axios from 'fetch';

      export const fetchData = async () => { try { const response = await axios.get('https://api.example.com/data'); // 使用fetch的then方法处理返回的结果 this.setState({ data: response.data }); } catch (error) { // 处理API错误 console.error(error); this.setState({ error: 'Error fetching data' }); } };

      export default fetchData; ```

      1. 合并异步操作:在你的actions或effects中,如果它们有多个异步操作需要完成,可以将它们合并到一个Promise中,然后在Promise中调用每个异步操作。例如:

      ```javascript export const fetchData = async () => { try { const data1 = await this.fetchData1(); const data2 = await this.fetchData2(); // 将数据1和数据2合并到一个Promise中 const data = await Promise.all([data1, data2]); // 使用Promise.all的then方法处理合并后的数据 this.setState({ data }); } catch (error) { // 处理异步操作错误 console.error(error); this.setState({ error: 'Error fetching data' }); } };

      export const fetchData1 = async () => { // 处理异步操作1 };

      export const fetchData2 = async () => { // 处理异步操作2 };

      export default fetchData; ```

      1. 缓存状态更新:在需要频繁更新状态的组件中,可以使用一个状态缓存来存储状态的最新值。当状态发生变化时,先检查缓存中的状态是否与新的状态相同,如果相同,则直接返回新的状态;否则,使用fetch或axios发送一个新的请求到API,获取新的状态,并将状态更新到缓存中。

      ```javascript import { useState, useEffect } from 'react';

      const initialState = { data: null };

      const fetchData = async () => { try { const response = await axios.get('https://api.example.com/data'); const data = response.data; // 将状态更新为新的数据 initialState.data = data; // 将缓存中的状态更新为新的状态 this.setState({ data }); } catch (error) { // 处理API错误 console.error(error); this.setState({ error: 'Error fetching data' }); } };

      const handleDataChange = (event) => { const { value } = event.target; if (value === initialState.data) { // 如果状态的值与缓存中的值相同,直接更新缓存中的状态 this.setState({ data: value }); } else { // 使用fetch或axios发送一个新的请求到API,获取新的状态 fetchData(); } };

      export default (

      ); ```

      通过上述方式,你可以有效地减少无状态组件中dispatch一个effects的频繁请求,并提高性能和可维护性。同时,你也可以根据实际需求选择最适合的解决方案,例如合并异步操作、缓存状态更新或使用状态缓存等。

    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部