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
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
壊れたパーサから始める関数型設計と構成的なパーサ #fp_matsuri
raiga0310
2
410
吝嗇家のためのAI活用 / AI development for miser - ChatGPT + Issue Driven Development
tooppoo
0
200
なぜ関数型プログラミングで「型」と「証明」が語られるのか #fp_matsuri
kajitack
3
1k
そこに3びきプロダクトがいるじゃろう——生成AI時代における“価値が届かない理由”の構造
kosuket
0
200
PHPだって関数型したい 〜できること、できないこと〜 / fp-in-php
jsoizo
1
250
分散システム、なんですぐ死んでしまうん?耐障害性を高めたいあなたのためのレジリエンスパターン入門
mshibuya
7
7k
ビデオ通話が繋がる0.2秒で何が起きているのか
supurazako
2
150
AIが無かった頃の素敵な出会いの話
codmoninc
1
260
エンジニアにデザインハーネスを 〜デザインプロセスを規定するためのハーネス〜 / Design harness from an engineer's perspective
rkaga
2
1.8k
生成AI導入の「期待外れ」を乗り越える ー 開発フロー改革が目指す、真の組織変革
starfish719
0
2.5k
Generative UI & AI-Assistants for Your Angular Solutions
manfredsteyer
PRO
1
230
えっ!!コードを読まずに開発を!?
hananouchi
0
270
Featured
See All Featured
Marketing to machines
jonoalderson
1
5.6k
Agile Leadership in an Agile Organization
kimpetersen
PRO
0
190
How to Build an AI Search Optimization Roadmap - Criteria and Steps to Take #SEOIRL
aleyda
1
2.1k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
133
19k
How Software Deployment tools have changed in the past 20 years
geshan
0
34k
Prompt Engineering for Job Search
mfonobong
0
380
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
12
1.2k
Leveraging Curiosity to Care for An Aging Population
cassininazir
1
430
Taking LLMs out of the black box: A practical guide to human-in-the-loop distillation
inesmontani
PRO
3
2.3k
Code Review Best Practice
trishagee
74
20k
Scaling GitHub
holman
464
140k
Building a A Zero-Code AI SEO Workflow
portentint
PRO
0
640
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.