Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
React & Component
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
ningzbruc
January 01, 2016
Programming
63
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
68
去啊无线前端的一天
ningzbruc
1
210
阿里旅行去啊H5首页总结&Promise
ningzbruc
0
280
KISSY.Base - all about that Base
ningzbruc
0
140
Hammer.js
ningzbruc
1
360
淘宝旅行门票iPad版开发
ningzbruc
0
160
Travel on KISSY mini
ningzbruc
0
210
Events
ningzbruc
2
130
Why YUI3
ningzbruc
0
190
Other Decks in Programming
See All in Programming
React Native에 현대적인 빌드 도구 더하기: Rollipop 구현기
leegeunhyeok
0
170
月間100万人のサービス刷新で、 技術選定をHonoに振り切った話
yutobara
8
7.1k
Lambda durable functionsでHuman in the Loopを楽に…楽に……
har1101
2
240
Groovy as a human and AI friendly programming language
paulk
0
150
Augmenting AI with the Power of Jakarta EE
ivargrimstad
0
520
気持ちぃ〜角丸 Squircle
ryu1013
0
370
Web Framework Benchmark Battle 2026, Any%
a_matsuda
3
3.1k
조합이폭발하는디자인시스템이걸눈으로도테스트하라고요
giljongyu
0
660
Snowflake Openflow Connector利用の勘所 / 20261024developersio2026tokyo-snowflake-openflow
kasacchiful
PRO
0
260
Seven New Principles of Software Engineering
yegor256
0
400
graphql-ruby を Spinel で速くしようとした話
mtsmfm
0
130
SODA - FACT BOOK(EN)
sodainc
1
200
Featured
See All Featured
The AI Search Optimization Roadmap by Aleyda Solis
aleyda
2
6.4k
Unsuck your backbone
ammeep
672
58k
A Soul's Torment
seathinner
8
3.9k
Producing Creativity
orderedlist
PRO
348
41k
Skip the Path - Find Your Career Trail
mkilby
1
270
Highjacked: Video Game Concept Design
rkendrick25
PRO
1
510
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.9k
Navigating the moral maze — ethical principles for Al-driven product design
skipperchong
2
660
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
33
5.5k
Typedesign – Prime Four
hannesfritz
42
3.2k
Practical Orchestrator
shlominoach
192
12k
How to Ace a Technical Interview
jacobian
280
24k
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.