- 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 条
- 全部回答
-
无期过往ヘ 普通会员 1楼
在Dva.js中,通过在无状态组件中dispatch一个effects时,如果经常性地发送请求,可能会导致性能问题和不必要的请求开销。以下是一些可能导致这种情况的原因和解决方案:
- 频繁的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的
then和catch方法来处理返回的结果。例如:```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; ```
- 合并异步操作:在你的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; ```
- 缓存状态更新:在需要频繁更新状态的组件中,可以使用一个状态缓存来存储状态的最新值。当状态发生变化时,先检查缓存中的状态是否与新的状态相同,如果相同,则直接返回新的状态;否则,使用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的频繁请求,并提高性能和可维护性。同时,你也可以根据实际需求选择最适合的解决方案,例如合并异步操作、缓存状态更新或使用状态缓存等。
- 扫一扫访问手机版
回答动态

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器更新之后。服务器里面有部分玩家要重新创建角色是怎么回事啊?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题函数计算不同地域的是不能用内网吧?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题ARMS可以创建多个应用嘛?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题在ARMS如何申请加入公测呀?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题前端小程序接入这个arms具体是如何接入监控的,这个init方法在哪里进行添加?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器刚到期,是不是就不能再导出存档了呢?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器的游戏版本不兼容 尝试更新怎么解决?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器服务器升级以后 就链接不上了,怎么办?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器转移以后服务器进不去了,怎么解决?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器修改参数后游戏进入不了,是什么情况?预计能赚取 0积分收益
- 回到顶部
- 回到顶部
