46
React Performance Is syntactic sugar so sweet?

JS Lab2017_Lightning Talks_React Perfomance

Embed Size (px)

Citation preview

Page 1: JS Lab2017_Lightning Talks_React Perfomance

ReactPerformanceIssyntacticsugarsosweet?

Page 2: JS Lab2017_Lightning Talks_React Perfomance

HowdoesReactwork?

2

Page 3: JS Lab2017_Lightning Talks_React Perfomance

HowdoesReactwork?

classAvatarextendsComponent{ render(){ return( <imgsrc="./public/avatar.png"{...this.props}/> ) } }

3

Page 4: JS Lab2017_Lightning Talks_React Perfomance

HowdoesReactwork?

classAvatarextendsComponent{ render(){ return( <imgsrc="./public/avatar.png"{...this.props}/> ) } }

3

Page 5: JS Lab2017_Lightning Talks_React Perfomance

HowdoesReactwork?

classAvatarextendsComponent{ render(){ return( <imgsrc="./public/avatar.png"{...this.props}/> ) } }

3

Page 6: JS Lab2017_Lightning Talks_React Perfomance

HowdoesReactwork?

classAvatarextendsComponent{ render(){ return( <imgsrc="./public/avatar.png"{...this.props}/> ) } }

3

Page 7: JS Lab2017_Lightning Talks_React Perfomance

HowdoesReactwork?

varAvatar=function(_Component){ _inherits(Avatar,_Component);

functionAvatar(){ _classCallCheck(this,Avatar);

return_possibleConstructorReturn(this,(Avatar.__proto__|| Object.getPrototypeOf(Avatar)).apply(this,arguments)); }

_createClass(Avatar,[{ key:"render", value:functionrender(){ returnReact.createElement( "img", _extends({src:"./public/avatar.png"}, this.props) ); } }]);

4

Page 8: JS Lab2017_Lightning Talks_React Perfomance

ReactPerftool

5

Page 9: JS Lab2017_Lightning Talks_React Perfomance

ReactPerftool 6

Page 10: JS Lab2017_Lightning Talks_React Perfomance

ReactPerftool

classAvatarextendsComponent{ render(){ return( <imgsrc="./public/avatar.png"{...this.props}/> ) }}

7

Page 11: JS Lab2017_Lightning Talks_React Perfomance

ReactPerftool

classAvatarextendsComponent{ render(){ return( <imgsrc="./public/avatar.png"{...this.props}/> ) }}

7

Page 12: JS Lab2017_Lightning Talks_React Perfomance

ReactPerftool

classAvatarextendsComponent{ render(){ return( <imgsrc="./public/avatar.png"{...this.props}/> ) }}

7

Page 13: JS Lab2017_Lightning Talks_React Perfomance

ReactPerftool

classAvatarextendsComponent{ render(){ return( <imgsrc="./public/avatar.png"{...this.props}/> ) }}

7

Page 14: JS Lab2017_Lightning Talks_React Perfomance

Styling

8

Page 15: JS Lab2017_Lightning Talks_React Perfomance

Styling

classAvatarextendsPureComponent{ render(){ return<imgsrc="./public/avatar.png"{...this.props}/> } }

9

Page 16: JS Lab2017_Lightning Talks_React Perfomance

Styling

classAvatarextendsPureComponent{ render(){ return<imgsrc="./public/avatar.png"{...this.props}/> } }

classStylingextendsPureComponent{ render(){ return<Avatarstyle={{width:'100px'}}/> } }

9

Page 17: JS Lab2017_Lightning Talks_React Perfomance

Styling

classAvatarextendsPureComponent{ render(){ return<imgsrc="./public/avatar.png"{...this.props}/> } }

classStylingextendsPureComponent{ render(){ return<Avatarstyle={{width:'100px'}}/> } }

9

Page 18: JS Lab2017_Lightning Talks_React Perfomance

Styling

classAvatarextendsPureComponent{ render(){ return<imgsrc="./public/avatar.png"{...this.props}/> } }

10

Page 19: JS Lab2017_Lightning Talks_React Perfomance

Styling

classAvatarextendsPureComponent{ render(){ return<imgsrc="./public/avatar.png"{...this.props}/> } }

conststyle={width:'100px'} classStylingFixedextendsPureComponent{ render(){ return<Avatarstyle={style}/> } }

10

Page 20: JS Lab2017_Lightning Talks_React Perfomance

Styling

classAvatarextendsPureComponent{ render(){ return<imgsrc="./public/avatar.png"{...this.props}/> } }

conststyle={width:'100px'} classStylingFixedextendsPureComponent{ render(){ return<Avatarstyle={style}/> } }

10

Page 21: JS Lab2017_Lightning Talks_React Perfomance

Inlinehandler

11

Page 22: JS Lab2017_Lightning Talks_React Perfomance

Inlinehandler

classAvatarextendsPureComponent{ render(){ return<imgsrc="./public/avatar.png"{...this.props}/> } }

12

Page 23: JS Lab2017_Lightning Talks_React Perfomance

Inlinehandler

classAvatarextendsPureComponent{ render(){ return<imgsrc="./public/avatar.png"{...this.props}/> } }

classInlineHandlerextendsPureComponent{ render(){ return<AvataronClick={()=>{this.setState({clicked:true})}}/> } }

12

Page 24: JS Lab2017_Lightning Talks_React Perfomance

Inlinehandler

classAvatarextendsPureComponent{ render(){ return<imgsrc="./public/avatar.png"{...this.props}/> } }

classInlineHandlerextendsPureComponent{ render(){ return<AvataronClick={()=>{this.setState({clicked:true})}}/> } }

12

Page 25: JS Lab2017_Lightning Talks_React Perfomance

InlinehandlervarInlineHandler=function(_PureComponent){ _inherits(InlineHandler,_PureComponent);

functionInlineHandler(){ _classCallCheck(this,InlineHandler);

return_possibleConstructorReturn(this,(InlineHandler.__proto__|| Object.getPrototypeOf(InlineHandler)).apply(this,arguments)); }

_createClass(InlineHandler,[{ key:"render", value:functionrender(){ var_this2=this;

returnReact.createElement( "div", null, React.createElement(Avatar,{onClick:functiononClick(){ _this2.setState({clicked:true}); }}) ); } }]);

returnInlineHandler;}

13

Page 26: JS Lab2017_Lightning Talks_React Perfomance

Inlinehandler

classInlineHandlerFixedextendsPureComponent{ constructor(props,context){ super(props,context); this.handleClick=this.handleClick.bind(this) }

handleClick(){ this.setState({ clicked:true }) } render(){ return<AvataronClick={this.handleClick}/> }}

14

Page 27: JS Lab2017_Lightning Talks_React Perfomance

Inlinehandler

classInlineHandlerFixedextendsPureComponent{ constructor(props,context){ super(props,context); this.handleClick=this.handleClick.bind(this) }

handleClick(){ this.setState({ clicked:true }) } render(){ return<AvataronClick={this.handleClick}/> }}

14

Page 28: JS Lab2017_Lightning Talks_React Perfomance

Composition

15

Page 29: JS Lab2017_Lightning Talks_React Perfomance

Composition

classSelectextendsPureComponent{ render(){ return( <div> {this.props.children} </div> ) }}

classOptionextendsPureComponent{ render(){ return( <span>{this.props.title}</span> ) }}

16

Page 30: JS Lab2017_Lightning Talks_React Perfomance

CompositionclassCompositionextendsPureComponent{ handleUpdate=()=>{ this.forceUpdate() }

render(){ return( <div> <buttononClick={this.handleUpdate}>Update</button> <Select> <Optiontitle="Title1"/> <Optiontitle="Title2"/> <Optiontitle="Title3"/> <Optiontitle="Title4"/> <Optiontitle="Title5"/> </Select> </div> ); }}

17

Page 31: JS Lab2017_Lightning Talks_React Perfomance

CompositionclassCompositionextendsPureComponent{ handleUpdate=()=>{ this.forceUpdate() }

render(){ return( <div> <buttononClick={this.handleUpdate}>Update</button> <Select> <Optiontitle="Title1"/> <Optiontitle="Title2"/> <Optiontitle="Title3"/> <Optiontitle="Title4"/> <Optiontitle="Title5"/> </Select> </div> ); }}

17

Page 32: JS Lab2017_Lightning Talks_React Perfomance

CompositionclassWrappedSelectextendsPureComponent{ staticpropTypes={ options:PropTypes.array }

render(){ return( <Select> { this.props.options.map((option)=>( <Optionkey={option}title={option}/> )) } </Select> ) }}

18

Page 33: JS Lab2017_Lightning Talks_React Perfomance

CompositionclassCompositionFixedextendsPureComponent{ constructor(props,context){ super(props,context) this.state={ options:["Title1","Title2","Title3","Title4","Title5"] } }

handleUpdate=()=>{ this.forceUpdate() }

render(){ return( <div> <buttononClick={this.handleUpdate}>Update</button> <WrappedSelectoptions={this.state.options}/> </div> ) }}

19

Page 34: JS Lab2017_Lightning Talks_React Perfomance

CompositionclassCompositionFixedextendsPureComponent{ constructor(props,context){ super(props,context) this.state={ options:["Title1","Title2","Title3","Title4","Title5"] } }

handleUpdate=()=>{ this.forceUpdate() }

render(){ return( <div> <buttononClick={this.handleUpdate}>Update</button> <WrappedSelectoptions={this.state.options}/> </div> ) }}

19

Page 35: JS Lab2017_Lightning Talks_React Perfomance

ConditionalRendering

20

Page 36: JS Lab2017_Lightning Talks_React Perfomance

ConditionalRenderingclassConditionalRenderingextendsPureComponent{ constructor(props,context){ super(props,context); this.state={list:range(1,100000)} }

handleUpdate=()=>{this.forceUpdate()}

render(){ return( <div> <buttononClick={this.handleUpdate}>Update</button> { this.state.list.map((item)=>( <h1key={item}>{item}</h1> )) } </div> ) }}

21

Page 37: JS Lab2017_Lightning Talks_React Perfomance

ConditionalRenderingclassConditionalRenderingextendsPureComponent{ constructor(props,context){ super(props,context); this.state={list:range(1,100000)} }

handleUpdate=()=>{this.forceUpdate()}

render(){ return( <div> <buttononClick={this.handleUpdate}>Update</button> { this.state.list.map((item)=>( <h1key={item}>{item}</h1> )) } </div> ) }}

21

Page 38: JS Lab2017_Lightning Talks_React Perfomance

ConditionalRenderingclassListextendsPureComponent{ staticpropTypes={ list:PropTypes.array } render(){ return( <div> { this.props.list.map((item)=>( <h1key={item}>{item}</h1> )) } </div> ) }}

22

Page 39: JS Lab2017_Lightning Talks_React Perfomance

ConditionalRenderingclassConditionalRenderingFixedextendsPureComponent{ constructor(props,context){ super(props,context);

this.state={list:range(1,100000)} }

handleUpdate=()=>{this.forceUpdate()}

render(){ return( <div> <buttononClick={this.handleUpdate}>Update</button> <Listlist={this.state.list}/> </div> ) }}

23

Page 40: JS Lab2017_Lightning Talks_React Perfomance

ConditionalRenderingclassConditionalRenderingFixedextendsPureComponent{ constructor(props,context){ super(props,context);

this.state={list:range(1,100000)} }

handleUpdate=()=>{this.forceUpdate()}

render(){ return( <div> <buttononClick={this.handleUpdate}>Update</button> <Listlist={this.state.list}/> </div> ) }}

23

Page 41: JS Lab2017_Lightning Talks_React Perfomance

ConstComponent

24

Page 42: JS Lab2017_Lightning Talks_React Perfomance

ConditionalRenderingclassConstComponentextendsPureComponent{

handleClick=()=>{ this.forceUpdate() }

render(){ return( <div> <buttononClick={this.handleClick}>Update</button>

<Constvalue={1}/> <Constvalue={1}/> <Constvalue={1}/> ...10000... </div> ) }}

25

Page 43: JS Lab2017_Lightning Talks_React Perfomance

ConditionalRenderingclassConstComponentextendsPureComponent{

handleClick=()=>{ this.forceUpdate() }

render(){ return( <div> <buttononClick={this.handleClick}>Update</button>

<Constvalue={1}/> <Constvalue={1}/> <Constvalue={1}/> ...10000... </div> ) }}

25

Page 44: JS Lab2017_Lightning Talks_React Perfomance

ConditionalRenderingconstcomponent=<Constvalue={1}/>

classConstComponentFixedextendsPureComponent{

handleClick=()=>{ this.forceUpdate() }

render(){ return( <div> <buttononClick={this.handleClick}>Update</button>

{component} {component} {component} ...10000... </div> ) }}

26

Page 45: JS Lab2017_Lightning Talks_React Perfomance

ConditionalRenderingconstcomponent=<Constvalue={1}/>

classConstComponentFixedextendsPureComponent{

handleClick=()=>{ this.forceUpdate() }

render(){ return( <div> <buttononClick={this.handleClick}>Update</button>

{component} {component} {component} ...10000... </div> ) }}

26

Page 46: JS Lab2017_Lightning Talks_React Perfomance

СпасибозаВнимание!

@maxkudla

27