W3CTech美团react专场-Thinking in React

44
Thinking in React 美团技术团队 陈益国 美团 React 专场
  • date post

    12-Apr-2017
  • Category

    Engineering

  • view

    821
  • download

    2

Transcript of W3CTech美团react专场-Thinking in React

Page 1: W3CTech美团react专场-Thinking in React

Thinking in React美团技术团队 � 陈益国

美团 � React � 专场

Page 2: W3CTech美团react专场-Thinking in React

⺫⽬目录

1. 拥抱未来 2. 设计原则 3. ⾼高性能 4. ⽣生态圈

Page 3: W3CTech美团react专场-Thinking in React

拥抱未来

Page 4: W3CTech美团react专场-Thinking in React

React or Web Components

Page 5: W3CTech美团react专场-Thinking in React

Hello world of Web Component

<hello-world></hello-world>

Page 6: W3CTech美团react专场-Thinking in React

var HelloWorld = React.createClass({

Hello world of React

<HelloWorld></HelloWorld>

Page 7: W3CTech美团react专场-Thinking in React

Web Components React

• 封装性(Shadow DOM) • 可移植性(原⽣生⽀支持)

• ⾼高性能(Vitural DOM) • 松耦合

Page 8: W3CTech美团react专场-Thinking in React

React or + Web Components

Page 9: W3CTech美团react专场-Thinking in React

同构

“⼀一次编写,多处运⾏行”

Page 10: W3CTech美团react专场-Thinking in React

Client + Server Rendering

• 更好的⽤用户体验 • 可维护性 • SEO

Page 11: W3CTech美团react专场-Thinking in React

ES6(2015) & ES7(2016)

Page 12: W3CTech美团react专场-Thinking in React

Classes、static、Arrow Function

class HelloWorld extends React.Component { constructor (props) { super(props); this.state = { name: 'mxTeam' }; } sayHello = () => { console.log(`Hello ${this.state.name}`); } static defaultProps = { content: 'World!' }; render () { return ( <div onClick={this.sayHello}>Hello {this.props.content}</div> ) }};

Page 13: W3CTech美团react专场-Thinking in React

设计原则

Page 14: W3CTech美团react专场-Thinking in React

JSX

Page 15: W3CTech美团react专场-Thinking in React

var myDivElement = <div className="foo" />;

var MyComponent = React.createClass({/*...*/});var myElement = <MyComponent someProperty={true} />;

Render a HTML tag

Render a Component

Page 16: W3CTech美团react专场-Thinking in React

状态机

“抛弃繁琐的DOM操作,仅需维护数据的状态”

Page 17: W3CTech美团react专场-Thinking in React

⼀一个下拉菜单的两种状态

state: 收起 state: 展开

Page 18: W3CTech美团react专场-Thinking in React

visible: false

visible: true

click

setState

update UI

Page 19: W3CTech美团react专场-Thinking in React

初始化

渲染

装载

更新

卸载

⽣生命周期

Page 20: W3CTech美团react专场-Thinking in React

设计原则

• 化繁为简 • 可预测性 • 单向数据流

Page 21: W3CTech美团react专场-Thinking in React

⾼高性能

Page 22: W3CTech美团react专场-Thinking in React

当我们谈论 JavaScript 慢的时候,我们都在谈论些什么

Page 23: W3CTech美团react专场-Thinking in React

Virtural DOM

Page 24: W3CTech美团react专场-Thinking in React

Create ReactElement(Virutal DOM)

var root = React.createElement('div');

var root = ( <div></div> );

Page 25: W3CTech美团react专场-Thinking in React

ReactElement { type: 'div', ref: null, key: null, props: Object }

4 个简单的属性,没有 prototype

通过 React.render 将 ReactElement 渲染成常规的 DOM

Page 26: W3CTech美团react专场-Thinking in React

Diff

Page 27: W3CTech美团react专场-Thinking in React

同层级 diff

node类型 <div /> <span />

component类型 <Header /> <Content />

attribute <div foo=“bar” /> <div foo=“biz” />

style<div style={{color:’#666’}} />

<div style={{fontWeight:’bold’}} />

Page 28: W3CTech美团react专场-Thinking in React

列表 diff

<ul> <li>a</li> <li>b</li> <li>d</li> <li>e</li><ul>

<ul> <li>a</li> <li>b</li> <li>d</li> <li>e</li> <li>c</li><ul>

<ul> <li key=“a”>a</li> <li key=“b”>b</li> <li key=“c”>c</li> <li key=“d”>d</li> <li key=“e”>e</li><ul>

key is key

Page 29: W3CTech美团react专场-Thinking in React

Render

Page 30: W3CTech美团react专场-Thinking in React

this.state = { foo: null };

...

this.setState({ foo: 'bar' });

console.log(this.state.foo); // null

为什么 setState 是⼀一个异步操作

批量操作

Page 31: W3CTech美团react专场-Thinking in React

Render 流程

标记 dirty 重新 render ⼦子树

Page 32: W3CTech美团react专场-Thinking in React

shouldComponentUpdate: function (nextProps, nextState) { // return nextProps.id === this.props.id; // return nextState.id === this.state.id; }

shouldComponentUpdate

Page 33: W3CTech美团react专场-Thinking in React

更优的 事件代理

• 绑定⾄至⽂文档的根节点 • 仅迭代组件的根节点

Page 34: W3CTech美团react专场-Thinking in React

⽣生态圈

Page 35: W3CTech美团react专场-Thinking in React

双向绑定 VS 单向数据流

• 脏检查 & Object.observe • 复杂度⾼高,数据不可预测

• setState & immutable • 简单清晰,数据可预测

Page 36: W3CTech美团react专场-Thinking in React

Flux

Page 37: W3CTech美团react专场-Thinking in React

Flux 的流程结构

Page 38: W3CTech美团react专场-Thinking in React

• Action ⽤用户交互、数据交互都是⼀一个Action • Dispatcher 分发动作给 Store • Store 数据存储中⼼心,响应 Action,对数据进⾏行修改 • View 监听数据变化的事件,从 Store 获取数据,触发 Action

Page 39: W3CTech美团react专场-Thinking in React

• Flux • Reflux • Redux • …

Relay + GraphQL

Page 40: W3CTech美团react专场-Thinking in React
Page 41: W3CTech美团react专场-Thinking in React

class FriendInfo { statics = { queries: { user () { return graphql ` User { name, mutual_friends { count } } `; } } }; render () { var user = this.props.user; return ( <div> <span>{user.name}</span> <span>{user.mutual_friends.count} mutual friends</span> </div> ); }};

Page 42: W3CTech美团react专场-Thinking in React

跨平台/终端

• Web

Page 43: W3CTech美团react专场-Thinking in React

Thanks & End

Page 44: W3CTech美团react专场-Thinking in React

欢迎关注美团技术团队获取更多优质技术内容