总结
知道组件,了解state
和props
,基本就可以知道react怎么工作了.
1 元素渲染
1.1 渲染到<div>
元素上
1 2 3 4 5 6
| <div id="example"></div> const element = <h1>Hello, world!</h1>; ReactDOM.render( element, document.getElementById('example') );
|
1.2 使用this.props
更新元素内容
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| class Clock extends React.Component { render() { return ( <div> <h1>Hello, world!</h1> <h2>现在是 {this.props.date.toLocaleTimeString()}.</h2> // 这里使用参数 </div> ); } }
function tick() { ReactDOM.render( <Clock date={new Date()} />, document.getElementById('example') ); }
setInterval(tick, 1);
|
2 jsx
react用来声明1个元素的语法, 元素是构成react应用的最小单位. 通常是外层1个<div>
.
1 2 3 4
| ReactDOM.render( <h1>Hello, world!: {1+1}</h1>, document.getElementById('example') );
|
3 组件
1个组件只有1个顶层标签, 声明后,就可以用 <Nickname ...>
使用这个组件了.
props
是组件参数,如果使用extends React.Component
定义的组件,需要用this.props
获取参数;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| function Name(props) { return <h1>网站名称:{props.name}</h1>; } class Url extends React.Component { render() { return <h1>网站地址:{this.props.url}</h1>; } }
function Nickname(props) { return <h1>网站小名:{props.nickname}</h1>; } function App() { return ( <div> <Name name="菜鸟教程" /> // 使用组件 <Url url="http://www.runoob.com" /> // 使用组件 <Nickname nickname="Runoob" /> // 使用组件 </div> ); }
ReactDOM.render( <App />, document.getElementById('example') );
|
4 state 状态
每个组件可以有不同的状态, 组件决定外观和动作,state
决定数据,相当于WPF的databinding. 更新state后, react会重新渲染界面;
状态是组件内部局部变量.父组件和子组件都不能知道组件内部状态. 数据自顶向下通过props
流动
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
| class Clock extends React.Component { constructor(props) { super(props); this.state = {date: new Date()}; }
componentDidMount() { this.timerID = setInterval( () => this.tick(), 1000 ); }
componentWillUnmount() { clearInterval(this.timerID); }
tick() { this.setState({ date: new Date() }); }
render() { return ( <div> <h1>Hello, world!</h1> <h2>现在是 {this.state.date.toLocaleTimeString()}.</h2> </div> ); } }
ReactDOM.render( <Clock />, document.getElementById('example') );
|
5 props
props
不可变,是一次性传入的, state
是可变的
6 事件处理
html使用小写
1
| <button onclick="activateLasers()"> 激活按钮 </button>
|
react使用jsx
1
| <button onClick={activateLasers}> 激活按钮 </button>
|
在react事件处理回调中绑定this
的三种方法
6.1 在constructor
中bind
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| class Toggle extends React.Component { constructor(props) { super(props); this.state = {isToggleOn: true};
this.handleClick = this.handleClick.bind(this); }
handleClick() { this.setState(prevState => ({ isToggleOn: !prevState.isToggleOn })); }
render() { return ( <button onClick={this.handleClick}> {this.state.isToggleOn ? 'ON' : 'OFF'} </button> ); } }
ReactDOM.render( <Toggle />, document.getElementById('example') );
|
6.2 使用属性初始化器语法–常用
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| class LoggingButton extends React.Component { handleClick = () => { console.log('this is:', this); }
render() { return ( <button onClick={this.handleClick}> Click me </button> ); } }
|
6.3 回调函数中使用箭头函数
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| class LoggingButton extends React.Component { handleClick() { console.log('this is:', this); }
render() { return ( <button onClick={(e) => this.handleClick(e)}> Click me </button> ); } }
|
7 列表
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| function NumberList(props) { const numbers = props.numbers; const listItems = numbers.map((number) => <li key={number.toString()}> {number} </li> ); return ( <ul>{listItems}</ul> ); }
const numbers = [1, 2, 3, 4, 5]; ReactDOM.render( <NumberList numbers={numbers} />, document.getElementById('example') );
|
8 react 组件api
- 设置状态:setState
- 替换状态:replaceState
- 设置属性:setProps
- 替换属性:replaceProps
- 强制更新:forceUpdate
- 获取DOM节点:findDOMNode
- 判断组件挂载状态:isMounted