在React和Redux应用中,首次渲染时从文件/API加载数据,后续渲染从Redux状态加载数据,是常见的优化模式。以下是完整实现方案:
// actions.js
export const fetchDataSuccess = (data) => ({
type: 'FETCH_DATA_SUCCESS',
payload: data
});
export const fetchData = () => async (dispatch) => {
try {
// 实际项目中替换为真实API调用
const response = await fetch('/api/data');
const data = await response.json();
dispatch(fetchDataSuccess(data));
} catch (error) {
console.error('Fetch error:', error);
}
};
// reducer.js
const initialState = {
data: null,
loading: false
};
export default (state = initialState, action) => {
switch (action.type) {
case 'FETCH_DATA_SUCCESS':
return { ...state, data: action.payload };
default:
return state;
}
};
import React, { useEffect } from 'react';
import { useSelector, useDispatch } from 'react-redux';
import { fetchData } from './actions';
const DataComponent = () => {
const dispatch = useDispatch();
const { data } = useSelector(state => state.dataStore);
useEffect(() => {
// 仅在数据未加载时发起请求
if (!data) {
dispatch(fetchData());
}
}, [dispatch, data]);
if (!data) return <div>Loading...</div>;
return (
<div>
{data.map(item => (
<div key={item.id}>{item.name}</div>
))}
</div>
);
};
// 在reducer中添加时间戳
case 'FETCH_DATA_SUCCESS':
return {
...state,
data: action.payload,
lastUpdated: Date.now()
};
// 组件中检查缓存时效
useEffect(() => {
const isStale = !state.lastUpdated ||
(Date.now() - state.lastUpdated > 600000); // 10分钟过期
if (!data || isStale) {
dispatch(fetchData());
}
}, []);
// 服务端初始化store
export const initializeStore = async (req) => {
const store = createStore();
await store.dispatch(fetchData());
return store;
};
若需从本地文件加载:
// 文件加载action
export const loadLocalData = () => {
return async (dispatch) => {
try {
const data = await import('./data.json');
dispatch(fetchDataSuccess(data));
} catch (error) {
console.error('File load error:', error);
}
};
};
问题1:数据闪烁(先空状态后加载)
问题2:重复渲染
问题3:API响应慢
interface DataItem {
id: number;
name: string;
}
interface AppState {
data: DataItem[] | null;
loading: boolean;
}
// 在组件中使用
const { data, loading } = useSelector((state: AppState) => ({
data: state.data,
loading: state.loading
}));
这种模式适用于:
关键点在于合理利用Redux作为单一数据源,配合React的渲染机制实现高效数据流管理。
没有搜到相关的文章