《深入React技术栈》-- 读书笔记

2020-06-28  本文已影响0人  ZoranLee

React

搭配

Virtual DOM

image.png

函数式编程

JSX 语法

基于DOM的封装


1、原始DOM
<button class="btn btn-blue"> 
 <em>Confirm</em> 
</button>
2、转化成json对象:
{ 
 type: 'button', 
 props: { 
 className: 'btn btn-blue', 
 children: [{ 
 type: 'em', 
 props: { 
 children: 'Confirm' 
 } 
 }] 
 } 
}
3、封装成组件
const Button = ({ color, text }) => { 
 return { 
 type: 'button', 
 props: { 
 className: `btn btn-${color}`, 
 children: { 
 type: 'em', 
 props: { 
 children: text, 
 }, 
 }, 
 }, 
 }; 
}

4、jsx语法:

const DeleteAccount = () => ( 
 <div> 
 <p>Are you sure?</p> 
 <DangerButton>Confirm</DangerButton> 
 <Button color="blue">Cancel</Button> 
 </div> 
);

将 HTML 语法直接加入到 JavaScript 代码中,再通过翻译器转换到纯
JavaScript 后由浏览器执行。JSX 在产品打包阶段都已经编译成纯 JavaScript

DeleteAccount 组件通过 Babel 转译成 React 可以执行的代码

var DeleteAccount = function DeleteAccount() { 
 return React.createElement( 
 'div', 
 null, 
 React.createElement( 
 'p', 
 null, 
 'Are you sure?' 
 ), 
 React.createElement( 
 DangerButton, 
 null, 
 'Confirm' 
 ), 
 React.createElement( 
 Button, 
 { color: 'blue' }, 
 'Cancel' 
 ) 
 );

元素属性

1、展开属性
const component = <Component name={name} value={value} />;

2、设置 props
const component = <Component />; 
component.props.name = name; 
component.props.value = value;

3、
const data = { name: 'foo', value: 'bar' }; 
const component = <Component name={data.name} value={data.value} />;

等价于

const data = { name: 'foo', value: 'bar' }; 
const component = <Component {...data} />;

1、原始DOM
<div d="xxx">content</div>

2、要使用 data- 前缀
<div data-attr="xxx">content</div>

3、自定义标签中任意的属性都是被支持的
<x-my-component custom-attr="foo" />

属性表达式

1、 输入(JSX)
const person = <Person name={window.isLoggedIn ? window.name : ''} />;

2、// 输出(JavaScript):
const person = React.createElement( 
 Person, 
 {name: window.isLoggedIn ? window.name : ''} 
);

转义 解决办法

<div dangerouslySetInnerHTML={{__html: 'cc &copy; 2015'}} />

React 组件的构建方法

1、React.createClass ( 0.14 版本发布)

const Button = React.createClass({ 
 getDefaultProps() { 
 return { 
 color: 'blue', 
 text: 'Confirm', 
 }; 
 }, 
 render() { 
 const { color, text } = this.props; 
 return ( 
 <button className={`btn btn-${color}`}> 
 <em>{text}</em> 
 </button> 
 ); 
 } 
});

2、ES6 classes
import React, { Component } from 'react';

class Button extends Component { 

 constructor(props) { 
 super(props); 
 }

 static defaultProps = { 
 color: 'blue', 
 text: 'Confirm', 
 };

 render() { 
 const { color, text } = this.props; 
 return ( 
 <button className={`btn btn-${color}`}> 
 <em>{text}</em> 
 </button> 
 ); 
 } 
}
a、React 的所有组件都继承自顶层类 React.Component
b、声明了 props、context、refs等,原型上定义了 setState 和
forceUpdate 方法

3、无状态函数 ( 0.14 版本之后新增,官方颇为推崇)
function Button({ color = 'blue', text = 'Confirm' }) { 
 return ( 
 <button className={`btn btn-${color}`}> 
 <em>{text}</em> 
 </button> 
 ); 
}

a、无状态组件只传入 props 和 context 两个参数
b、它不存在 state,也没有生命周期方法

React 数据流

import React, { Component } from 'react'; 

class Counter extends Component { 

 constructor(props) { 
 super(props); 
 this.handleClick = this.handleClick.bind(this); 
 this.state = { 
 count: 0, 
 }; 
 }

 handleClick(e) { 
 e.preventDefault();
 this.setState({ 
 count: this.state.count + 1, 
 }); 
 } 
 render() { 
 return ( 
 <div> 
 <p>{this.state.count}</p> 
 <a href="#" onClick={this.handleClick}>更新</a> 
 </div> 
 ); 
 } 
}

props

与父组件通信

propTypes


static propTypes = { 
 classPrefix: React.PropTypes.string, 
 className: React.PropTypes.string, 
 defaultActiveIndex: React.PropTypes.number, 
 activeIndex: React.PropTypes.number, 
 onChange: React.PropTypes.func, 
 children: React.PropTypes.oneOfType([ 
 React.PropTypes.arrayOf(React.PropTypes.node), 
 React.PropTypes.node, 
 ]), 
};

生命周期

挂载:

卸载

更新

如果组件自身的 state 更新了,那么会依次执行 shouldComponentUpdate、componentWillUpdate 、render 和 componentDidUpdate。

image.png image.png
上一篇下一篇

猜你喜欢

热点阅读