一般的な質問ですが、特定の例が含まれます:計算を抽出するためにステート/ストアドデータをループする正しい場所はどこですか?reduxでの計算はどこですか?
ここでは、 'stats'サイドバーに表示するためにいくつかの計算を行う必要があります。これは、さまざまな小道具/値を取り出して追加するクライアントの配列それらのすべて一緒に。私はそれを動作させるためにレンダリングしました。は、が間違っていますが、コンポーネントやレンダリングの外、またはレデューサー内でも起こりますか?
これらの値は更新された値になります(クライアントは「サーブド」とマークされ、その後、統計サイドバーはサーブされるクライアントの数を増やし、サービングされるクライアントの数を減らします)。しかし、それは私の一般的な質問の範囲外です。
大変お世辞になりました。ありがとうございました。
import React, { Component, PropTypes } from 'react';
import { browserHistory } from 'react-router';
import './ScheduleDayContainer.scss';
import { connect } from 'react-redux';
import { bindActionCreators } from 'redux';
import * as ScheduleActions from '../../actions/ScheduleActions';
class ScheduleDayContainer extends Component {
static propTypes = {
actions: PropTypes.object,
clients: PropTypes.array.isRequired
};
constructor(props, context) {
super(props, context);
}
componentWillMount() {
// gets schedule (code removed because doesn't matter here) and clients array (used below)
this.props.actions.fetchDaySchedule();
}
render() {
const { clients } = this.props;
const getStats = function (clients) {
let totalClientsExpected = clients.length,
totalHousehold = clients.length,
totalServed = 0,
totalNoShows = 0,
totalUnverifiedExpected = 0,
totalNotYetServed = 0;
clients.forEach(function(client) {
totalHousehold += client.family_count;
client.served_at != null ? totalServed += 1 : totalNotYetServed += 1;
// TODO: no show?
client.verified_at === null ? totalUnverifiedExpected += 1 : null;
});
return {
totalClientsExpected,
totalHousehold,
totalServed,
totalNoShows,
totalUnverifiedExpected,
totalNotYetServed
};
};
const stats = getStats(clients);
return (
<div className="day-container">
<aside className="column">
<div className="statistics-bar-container">
<h3 className="statistics-title">Statistics</h3>
<ul className="statistics-items">
<li className="statistics-item">
<p>Clients expected</p>
<span>{stats.totalClientsExpected}</span>
</li>
<li className="statistics-item">
<p>Total household members to be served</p>
<span>{stats.totalHousehold}</span>
</li>
<li className="statistics-item">
<p>Served</p>
<span>{stats.totalServed}</span>
</li>
<li className="statistics-item">
<p>Did not show</p>
<span>{stats.totalNoShows}</span>
</li>
<li className="statistics-item">
<p>Unverified clients expected</p>
<span>{stats.totalUnverifiedExpected}</span>
</li>
<li className="statistics-item">
<p>Yet to be served</p>
<span>{stats.totalNotYetServed}</span>
</li>
</ul>
</div>
</aside>
</div>
);
}
}
function mapStateToProps(state) {
return {
clients: state.schedule.clients
};
}
function mapDispatchToProps(dispatch) {
return {
actions: bindActionCreators(ScheduleActions, dispatch)
};
}
export default connect(
mapStateToProps,
mapDispatchToProps
)(ScheduleDayContainer);
そして、減速中
: それは一般的に試してみて、できるだけ(リレーショナルデータベースを考える!)正規化された状態を維持するためのベストプラクティスを合意していますexport default function scheduleReducer(state = initialState, action) {
switch (action.type) {
case types.FETCH_DAY:
return {
...state,
clients: action.data.clients,
daySummary: action.data.summary,
times: action.data.times,
serviceDate: action.data.serviceDate,
time: action.data.time
};
default:
return state;
}
}
@ Timoの回答は、1か所でこれを行うことが余計なライブラリを保証しているとは思えなかったので、以下のように終わりましたが、これは非常に役に立ち、間違いなく私の次のプロジェクトの最初から実装されます!だから助けてくれてありがとう! – megkadams
あなたは大歓迎です。ではごきげんよう。 –