我正在创建一个简单的应用程序,它向服务器发出GET请求,然后准备收到的数据并创建图表。问题很少:
我应该在哪里放置负责检查和准备原始数据的代码。目前我在我的动作创作者中有它,但也许它需要在组件本身?
我需要检查并将准备好的数据与已经用于图表的数据进行比较,如果相同或无效,则不要调用重新渲染。我应该把这张支票放在哪里?现在我想把它放在动作创作者里面。但为此我需要使用getState()
来访问状态,看起来不对。
对我来说,动作创建者似乎是所有这些检查的正确位置,因为如果数据无效,我就不能用它来更新我的状态,(例如,不要派遣某些动作创建者)或者我可能需要更新尽管它没有效,但是有新数据的状态?
给定这些动作创建者,描述检查的最佳位置是什么?:
export function fetchPopulations(term = "") {
return function (dispatch) {
dispatch(fetchingPopulations())
term=toTitleCase(term)
return fetch(`${API_URL}${term.replace(/\s/g, '%20')}`)
.then(response => response.json())
.then(json => dispatch(requestPopulations(json)))
}
}
export function requestPopulations(data = []) {
return {
type: REQUEST_POPULATIONS,
payload: data,
}
}
export function fetchingPopulations() {
return {
type: FETCHING_POPULATIONS
}
}
答案 0 :(得分:1)
我会说你做对了。
在您的示例中,requestPopulations
和fetchingPopulations
是真正的动作创建者,fetchPopulations
是一个合成函数(是的,为胜利组成函数!)。
我应该在哪里放置负责检查和准备原始代码的代码 数据。目前我在我的动作创作者中有它,但也许它需要 在组件本身?
组件不是放置应用程序业务逻辑的地方。组件应仅代表我们的MVC中的视图。没有API调用,没有业务逻辑,只有道具和状态。
我需要检查并比较准备好的数据和数据 已经用于图表,如果它是相同的,不要调用重新渲染 或无效。我应该把这张支票放在哪里?现在我想放置 它也在动作创作者中。但为此,我需要使用getState() 进入州,看起来不对。
创建模块化函数(它实际上是代码维护和重用),用于执行这些检查,将它们与您的真实动作创建者一起组合在另一个中,并且您可以仅在需要时进行调度。可以在组件生命周期钩子shouldComponentUpdate(nextProps, nextState)
内进行进一步优化。另外我认为使用带有这样签名的方法肯定不是反模式:
export function myComposingFunction(params) {
return (dispatch, getState) => {
// ...
所以你可以使用getState()
。
对我来说,动作创作者似乎适合所有这些检查,因为 如果数据无效,我就不能用它更新我的状态,(例如 不要派遣某些行动创造者)或者我可能需要更新 虽然它没有效,但是有新数据的状态?
不,不要用无用的数据更新状态。如果这样做,您将无需重新渲染整个树。你绝对正确地说“如果数据无效,我就不能用它更新我的状态,(例如,不要派遣某些行动创造者)”