【发布时间】:2017-07-27 18:25:52
【问题描述】:
我正在使用 Redux 和 React 构建一个 Web 应用程序。我的应用程序是一个呈现大量数据的分析应用程序。当我的商店变大时,我会遇到性能问题。
在 redux 中避免大数据性能问题的首选方法是什么?
应用结构
我的应用程序的结构是 settings(小 json)、results(大 json)和 calculate(settings)。计算是确定性和幂等的。我的应用以图表、表格等形式呈现设置元数据和结果。
因为计算是确定性和幂等的,我知道设置不变时结果不会改变。当设置确实改变时,我的结果可能会改变。换句话说,我很乐意仅依靠设置来确定是否需要更新我的 UI。
Redux 行为和潜在解决方案
当我在我的商店中包含结果时,我的应用程序很慢:
let settings = { foo: "bar" };
let results = calculate(settings);
Object.assign({}, state, { settings: settings, results: results });
//deterministic and idempotent
function calculate(settings) {
return /*large json*/;
}
当我引用但不在我的商店中包含结果时,我的应用程序很快:
let settings = { foo: "bar" };
let results = calculate(settings);
Object.assign({}, state, { settings: settings, results: () => results });
//deterministic and idempotent
function calculate(settings) {
return /*large json*/;
}
我知道 redux 建议不要存储函数,因此另一种方法是使用字符串保存引用...类似于:
let settings = { foo: "bar" };
let calculationId = uuid(); //could also be a hash of settings if I want to avoid some false positive UI re-rendering
let results = calculate(settings);
setResults(calculationId, results);
Object.assign({}, state, { settings: settings, calculationId: calculationId });
//deterministic and idempotent
function calculate(settings) {
return /*large json*/;
}
let fakeStore = { calculationId: null, results: null };
function setResults(calculationId, results) {
fakeStore. calculationId = calculationId;
fakeStore.results = results;
}
function getResults(calculationId) {
if(fakeStore.calculationId === calculationId) {
return fakeStore.results;
}
throw new Error("Invalid data access");
}
render() {
let calculationId = this.props.calculationId;
let results = getResults(calculationId);
}
将大数据保存在存储之外是可行的,但似乎有更好的方式 react 支持这个用例。
使用redux 3.7.1,react 15.4.2,react-redux 4.4.8
【问题讨论】:
标签: javascript json performance reactjs redux