Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
React & Component
Search
ningzbruc
January 01, 2016
Programming
45
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
React & Component
React 简介与升级
ningzbruc
January 01, 2016
More Decks by ningzbruc
See All by ningzbruc
如何写出一个优秀的开源库
ningzbruc
0
66
去啊无线前端的一天
ningzbruc
1
190
阿里旅行去啊H5首页总结&Promise
ningzbruc
0
270
KISSY.Base - all about that Base
ningzbruc
0
140
Hammer.js
ningzbruc
1
340
淘宝旅行门票iPad版开发
ningzbruc
0
140
Travel on KISSY mini
ningzbruc
0
210
Events
ningzbruc
2
130
Why YUI3
ningzbruc
0
190
Other Decks in Programming
See All in Programming
TSX の <Hoge<Fuga>> という構文に驚いた話 / tsx-type-argument-syntax
kanaru0928
0
240
Android CLI
fornewid
0
240
ドリフトを絶対に許さない(?)CDK運用 / CDK Ops with Zero Tolerance for Drifts (?)
akihisaikeda
1
230
AI Engineeringは、AIプロダクトだけのものか? 〜AIがソフトウェアを作る時代の新しい当たり前〜 / No AI in your product. AI Engineering in your development.
rkaga
5
530
リアルな遅延を測る仕様
kota_yata
1
130
書籍「プロフェッショナルAI駆動開発」紹介スライド
juntaromatsumoto
0
660
言葉の格闘技のススメ~紙とペンと言葉から始める、キャリアの描き方~
progresscicada
2
180
仕様駆動開発へのトライを機に チームに適合する手法を模索し続けている話
freee
PRO
0
620
komatsuna「分散システムにおけるバグ分析手法」
komatsunaqa
0
280
「人を評価する AI」の設計と実装
ryoyanara
0
250
30年振りにコンパイラの定数整数除算を改善した
herumi
9
4.2k
信頼性の目標を誰も求めてない
shubox
0
120
Featured
See All Featured
sira's awesome portfolio website redesign presentation
elsirapls
0
350
Building a Scalable Design System with Sketch
lauravandoore
463
34k
Everyday Curiosity
cassininazir
0
290
[RailsConf 2023] Rails as a piece of cake
palkan
59
6.9k
Heart Work Chapter 1 - Part 1
lfama
PRO
8
36k
A Tale of Four Properties
chriscoyier
163
24k
Marketing Yourself as an Engineer | Alaka | Gurzu
gurzu
0
280
Reality Check: Gamification 10 Years Later
codingconduct
0
2.3k
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
659
62k
Public Speaking Without Barfing On Your Shoes - THAT 2023
reverentgeek
1
550
Large-scale JavaScript Application Architecture
addyosmani
515
110k
How GitHub (no longer) Works
holman
316
150k
Transcript
React & Component ᡡᇌ
React فᳪکන A Facebook & Instagram collaboration.
# React
React • Web Component • Just View • Finite State
Machine • Virtual DOM
Web Component <input type="checkbox" value="yes" checked="checked" /> <select> <option value="1">1</option>
<option value="2" selected="selected">2</option> </select> new ScrollList({ container: '.scroll-list', data: [] }).render(); <SearchSuggest value="۹Ղ" source={this.source} /> <ScrollList data={this.data} /> DOM: React: Component:
Just View render() { return ( <div> <SearchSuggest source={this.source} />
<ScrollList data={this.data} /> </div> ); } return (SingleComponent || Array)
Finite State Machine render() { return ( <div> <SearchSuggest source={this.source}
/> {this.state.showList ? ( <ScrollList data={this.data} /> ) : null} </div> ); }
Virtual DOM render() { return ( <div> <SearchSuggest source={this.source} />
{this.state.showList ? ( <ScrollList data={this.data} /> ) : null} </div> ); } this.setState({ showList: true });
Props & State defaultProps = { width: 100, height: 200
}; constructor() { super(); this.state = { visible: true }; } <Overlay width={300} height={300} onClose={this.onClose} /> render() { return ( {this.state.visible ? ( <div style={{ width: this.props.width, height: this.props.height }}></div> ) : null} ); } close() { this.setState({ visible: false }); this.props.onClose(); }
vs. Kissy ATTRS ATTRS = { width: { value: 100
}, height: { value: 200 }, visible: { value: true } }; this.set('width', 300); this.set('visible', false); 配置参数与ᕟ件状ா混淆 this.after('visibleChange', function(e) { e.newValue ? this.show() : this.hide(); }); 手动管理ى联状ா与UI
DOM Props render() { return ( {this.state.visible ? ( <div
ref="container" className="container" style={{ width: this.props.width, height: this.props.height }} > </div> ) : null} ); } this.refs.container.addEventListener('click', () => {}, false);
ClassName className="container" import styles from “./index.scss"; className={styles.container} import ClassNames from
"classnames/bind"; let cx = ClassNames.bind(styles); className={cx({ container: true, hidden: !this.state.visible })} import CSSModules from 'react-css-modules'; @CSSModules(styles); styleName="container" // class="container" // class="overlay__container___1K9zE" // class="overlay__container___1K9zE overlay__hidden___1K8jY" // class="overlay__container___1K9zE"
Event System render() { return ( <div ref="container" className="container" onClick={this.onClick.bind(this)}
onTouchTap={this.onTap.bind(this)} > </div> ); }
SyntheticEvent console.log({...e}); e.nativeEvent.preventDefault();
LifeCycle: React vs. Kissy class Overlay extends React.Component { static
propTypes = { width: React.PropTypes.number }; static defaultProps = { width: 200 }; constructor() { super(); this.state = { visible: true }; }; componentWillMount() {}, render(), componentDidMount(), componentWillUpdate(), componentDidUpdate(), componentWillUnmount(), }; Base.extend({ initializer() {}, renderUI() {}, bindUI() {}, syncUI(){}, destroy() {} }, { ATTRS: { width: { value: 200, validator: S.isNumber } } });
componentWillReceiveProps defaultProps = { visible: false }; constructor() { super();
this.state = { visible: this.props.visible }; } componentWillReceiveProps(nextProps) { if (this.props.visible !== nextProps.visible) { this.setState({ visible: nextProps.visible }); } } render() { return ( {this.state.visible ? ( <div style={this.props.style}></div> ) : null} ); } render() { return ( <Overlay visible={this.state.active} /> ); } 子ᕟ件 父ᕟ件
Pass Props render() { return ( <form> <input type="input" {...this.props}
/> <button>ݐၾ</button> </form> ); } let { onValueChange, ...inputProps } = this.props; render() { return ( <form> <input type="input" {...inputProps} /> <button>ݐၾ</button> </form> ); } <SearchInput placeholder=“ᔱ" value="۹Ղ" onValueChange={this.change} />
Child Event render() { return ( <form> <input ref="input" type=“input"
value={this.state.value} {...this.props} onInput={() => this.setState({ value: this.refs.input.value })} /> {this.state.value ? (<button>x</button>) : null } </form> ); }
Children render() { return ( {this.state.visible ? ( <div>{this.props.children}</div> )
: null} ); } <Overlay visible="true"> <p>౯ฎٖ౯ฎٖ</p> <p>౯ฎٖ౯ฎٖ</p> <p>౯ฎٖ౯ฎٖ</p> </Overlay> React.Children.map(this.props.children, fn); React.Children.forEach(this.props.children, fn);
Performance render() { return ( {this.state.visible ? ( <div>{this.props.children}</div> )
: null} ); } render() { return ( <div className={this.state.visible : '' : 'hidden'}> {this.props.children} </div> ); } 避免过多生成ᲀ毁 优先样式展示ᵌ藏
key render() { return ( <ul> {this.props.items.map((item, index) => {
return (<li key={'item_' + index}>{item.name}</li>) })} </ul> ); } 方便DOMᜓ点重复利用
shouldComponentUpdate shouldComponentUpdate(nextProps, nextState) { if (this.state.visible !== nextState.visible) { return
true; } return false; } 必要的时候才更新UI 但state多的时候不好管理
None
None
# ReactNative
learn once, write everywhere!
Native vs. Web • View -> div • Text ->
span • Image -> img, background-image • TextInput -> input • TouchableHighlight -> div.onclick • AsyncStorage -> localStorage • …
None
Styles
getStyles
!zIndex https://www.npmjs.com/package/react-native-order-children
# React <=> RN EZ…
# ?PI
None
Join us!!!
THE END.