私はreduxを学び、反応します。そして、私は単純な "ストレステスト"を実行することを決めました。リアクションレスキューで生成されたステートレスコンポーネントのパフォーマンス
だから私は、年のような共通の小道具を受け取るステートレスコンポーネントを持っています。そして私は9000回以上このステートレスコンポーネントをクローンして更新したいと思っています。たとえば、2016年から2015年にprop(年)を変更します。
テストプロジェクトでこのコンポーネントをビルドしましたが、動作はしますが、特にIE 11では応答が遅くなりました。私のコードで間違っています。私は私のページコンポーネントに追加した不和のチャットルームで示唆したように
:
shouldComponentUpdate(nProps, nState) { return nProps.year != this.props.year; }
これはビットを助けました。しかしそれはまだ遅いです。
また、関連する質問として - lodash.assign()を使用して自分の状態を更新してもよろしいですか? また、私はtypescriptを使用していて、Object.assign()の組み込みのpolyfillを持っていないようです。だから私はロダッシュを試してみることに決めました。だからここ
は私の上の基本コンポーネントapp.tsxです:
import * as React from 'react';
import {bindActionCreators} from 'redux';
import {connect} from 'react-redux';
import * as pageActions from '../actions/page';
import User from '../components/user/User';
import Page from '../components/page/Page';
class App extends React.Component<any, any> {
render() {
const { user, page } = this.props;
const { setYear } = this.props.pageActions;
return (
<div>
<User name={user.name} />
<Page photos={page.photos} year={page.year} setYear={setYear} />
</div>
);
};
}
function mapStateToProps (state) {
return {
user: state.user, // (1)
page: state.page // (2)
};
}
function mapDispatchToProps(dispatch) {
return {
pageActions: bindActionCreators(pageActions, dispatch)
};
}
export default connect(
mapStateToProps,
mapDispatchToProps
)(App);
そして、これは私のページの減速である:
import * as React from 'react';
import {range} from 'lodash';
let StatelessSpan: React.StatelessComponent<any> = (props) => (
<span>{props.year} </span>
);
class Page extends React.Component<any, any> {
constructor(props) {
super(props);
}
private onYearBtnClick = (e) => {
this.props.setYear(+e.target.innerText);
};
shouldComponentUpdate(nProps, nState) {
return nProps.year != this.props.year;
}
render() {
const {year, photos} = this.props;
let years = range(15000).map((value, index) => {
if(index % 4===0){
return <StatelessSpan key={index} year={year} />;
}
return <span key={index}>i am empty</span>
});
return <div>
<p>
<button onClick={this.onYearBtnClick}>2016</button>
<button onClick={this.onYearBtnClick}>2015</button>
<button onClick={this.onYearBtnClick}>2014</button>
</p>
{years}
</div>;
};
}
export default Page;
一つは私に言った:
import {assign} from 'lodash';
const INITIAL_STATE = {
year: 2016,
photos: []
};
function pageReducer(state = INITIAL_STATE,
action = {type: '', payload: null}) {
switch (action.type) {
case 'SET_YEAR':
return assign({}, state, {year: action.payload});
default:
return state;
}
}
export default pageReducer;
とページ・コンポーネントそのinnerTextは実験的で安定していないので、textContentに変更しました。 IEでまだ遅れています。
IMHO練習問題は任意かつ実用的ではありません。 15k行を選んだ理由あなたはどの程度の応答性を考えていますか?パフォーマンスのボトルネックを判断するために[Chrome JSプロファイリング](https://developer.chrome.com/devtools/docs/cpu-profiling)を試してみてください。 – adamb
それは任意のサウンドかもしれませんが、Domで200以上の要素があり、同じ小道具を受け取ることができ、この例のような小道具を受け取ることはできませんが、10 +小道具以上の場合、角度のある実際のアプリケーションがあります。そして、私は50ms以下であると思います。 – truedrog
lodashのassign関数を別のObject.assign実装と入れ替えるとどうなりますか? https://www.npmjs.com/package/object-assignを試しましたか? – matthewmatician