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
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
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
180
阿里旅行去啊H5首页总结&Promise
ningzbruc
0
270
KISSY.Base - all about that Base
ningzbruc
0
130
Hammer.js
ningzbruc
1
340
淘宝旅行门票iPad版开发
ningzbruc
0
140
Travel on KISSY mini
ningzbruc
0
200
Events
ningzbruc
2
130
Why YUI3
ningzbruc
0
190
Other Decks in Programming
See All in Programming
ふつうのFeature Flag実践入門
irof
7
3.9k
Semantic Version 単位で戦略を柔軟に変えて、パッケージアップデートを自動化する
daitasu
1
230
Snowflake Summitでの新機能 CoCo / CoWork / snowflake-summit-2026-overall-what-new-coco
tatsuhiro
1
130
フロントエンドとバックエンドで「1文字」を揃えよう
youkidearitai
PRO
0
640
Skillsは効率化、Agentsは"自分の拡張"——Builder時代のエージェント編成(CC Night 2026)
wemra
1
120
脅威をエンジニアリングの糧にして――現場編 / Turning Threats into Engineering Fuel — Field Edition
nrslib
0
280
Oxcを導入して開発体験が向上した話
yug1224
4
310
スマートグラスで並列バイブコーディング
hyshu
0
140
エンジニアと一緒にテストコードの設計と実装を改善した話
mototakatsu
0
170
Mujeres en SEO Summit 2026 - Greatest Disaster Hits en Web Performance
guaca
0
170
AI 時代のソフトウェア設計の学び方
masuda220
PRO
29
12k
Webフレームワークの ベンチマークについて
yusukebe
0
160
Featured
See All Featured
KATA
mclloyd
PRO
35
15k
Documentation Writing (for coders)
carmenintech
77
5.4k
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
31
2.8k
Ruling the World: When Life Gets Gamed
codingconduct
0
250
YesSQL, Process and Tooling at Scale
rocio
174
15k
The Art of Programming - Codeland 2020
erikaheidi
57
14k
Lightning talk: Run Django tests with GitHub Actions
sabderemane
0
200
The Illustrated Children's Guide to Kubernetes
chrisshort
51
52k
Jess Joyce - The Pitfalls of Following Frameworks
techseoconnect
PRO
1
170
Effective software design: The role of men in debugging patriarchy in IT @ Voxxed Days AMS
baasie
0
410
Art, The Web, and Tiny UX
lynnandtonic
304
22k
Designing for Performance
lara
611
70k
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.