reactjs - 在 React 组件中处理深度嵌套的数据
问题描述
我在组件中面临两难境地,我试图访问的数据还不“存在”。例如,当我记录我的 redux 操作时,我得到以下信息:
第一张图片是我的数据在加载时的样子,第二张图片是我收到的嵌套数据的样子。
因此,我必须在我的组件的 render 方法中运行检查,例如:
const data = homepage.upcomingTrips.data.upcoming_hikes;
{ !loading && data && data.upcoming_hikes &&
...more code here
}
_reducers/homepage/upcoming_trips.reducer.js:
import { homepageConstants } from '../../_constants';
export function upcomingTrips(state = {}, action) {
switch (action.type) {
case homepageConstants.UPCOMING_TRIPS_REQUEST:
return {
data: {},
loading: true,
};
case homepageConstants.UPCOMING_TRIPS_SUCCESS:
return {
data: action.data,
loading: false,
};
case homepageConstants.UPCOMING_TRIPS_FAILURE:
return {
error: action.error,
};
default:
return state;
}
}
_reducers/主页/index.js:
import { combineReducers } from 'redux';
import { currentPack } from './current_pack.reducer';
import { totalMiles } from './total_miles.reducer';
import { upcomingTrips } from './upcoming_trips.reducer';
const homepage = combineReducers({
currentPack,
totalMiles,
upcomingTrips,
});
export default homepage;
_reducers/index.js
import { combineReducers } from 'redux';
import { authentication } from './authentication.reducer';
import { registration } from './registration.reducer';
import { users } from './users.reducer';
// import { homepageData } from './homepage.reducer';
import homepage from './homepage';
import { explorepageData } from './explorepage.reducer';
import { alert } from './alert.reducer';
const rootReducer = combineReducers({
authentication,
registration,
users,
homepage,
explorepageData,
alert
});
export default rootReducer;
即将到来的旅行.jsx:
class UpcomingTrips extends Component {
componentDidMount() {
this.props.getUpcomingTrips();
}
render() {
const { classes, homepage } = this.props;
const data = homepage.upcomingTrips.data.upcoming_hikes;
const loading = homepage.upcomingTrips.data.loading;
console.log('homepage: ', homepage.upcomingTrips.data.upcoming_hikes);
return (
<UpcomingTripStyles>
<Typography variant='h4' className={ `${ classes.headline } ${ classes.widgetName }` }>
Upcoming Trips
</Typography>
{ loading && <img src='/static/loading.svg' alt='loading' className='loading-img' /> }
<ul className='upcoming-hikes'>
{ !loading && data && data.upcoming_hikes &&
data.upcoming_hikes.map((h) =>
<li className='hike-item' key={ h.id }>
<span className='start-date'>{ toDate(h.start_date) }</span>
<span className='hike-name'>{ h.name }</span>
</li>,
)
}
{ !loading && data && !_.toArray(data.upcoming_hikes).length &&
<p>You haven't created any Upcoming Hikes yet!</p>
}
</ul>
</UpcomingTripStyles>
);
}
}
function mapStateToProps(state) {
const { homepage } = state;
return {
homepage,
};
}
const mapDispatchToProps = dispatch => {
return {
getUpcomingTrips: () => {
dispatch(homepageActions.getUpcomingTrips())
}
};
};
const enhance = compose(
connect(mapStateToProps, mapDispatchToProps),
withStyles(styles),
);
const connectedUpcomingTrips = enhance(UpcomingTrips);
export { connectedUpcomingTrips as UpcomingTrips };
那么处理这一切的最佳方法是什么?我应该考虑使用 Normalizr 之类的东西来扁平化我的数据吗?或者它与我的减速器的工作方式有更多关系吗?
解决方案
推荐阅读
- javascript - 没有谷歌表单的谷歌表单数据。表单输入不会推送到工作表
- php - 检测 Carbon::createFromDate 的日期格式
- php - 选择生日后用生肖更新文本字段
- reactjs - 我如何只调用一次 e.target.value ?
- r - 使用 spread() 获取错误:每行输出必须由唯一的键组合标识
- azure - 如何根据employeeId字段创建动态安全组
- python - 如何将 float64 值转换为等效的日期时间格式?
- php - Laravel Livewire 分页链接不起作用
- ios - 将静态库 (Rust .a) 导入 iOS 中的 Flutter 项目
- javascript - 创建时如何在 html 中显示本地存储中的数据