What is React?
React is a declarative, efficient, and flexible JavaScript library for building user interfaces.
React Use JSX to replace custom JavaScript.
JSX looks like an XML version of JavaScript.
React的组件
React.Component
下面这段代码中,我们声明了一个名为"ShoppingList"的react组件类,pops存储了该组件的一些参数。render方法返回要显示的视图的层次(一个轻量级的描述),React负责渲染。
class ShoppingList extends React.Component { render() { return ( <div className="shopping-list"> <h1>Shopping List for {this.props.name}</h1> <ul> <li>Instagram</li> <li>WhatsApp</li> <li>Oculus</li> </ul> </div> ); } } // Example usage: <ShoppingList name="Mark" />
标签会被翻译为React方法createElement。所以上面的代码等价于
【注】:在JSX中,可以试用任何的javascript表达式。每个React元素都是真正的javascript对象。class ShoppingList extends React.Component { render() { return React.createElement('div', {className: 'shopping-list'},
React.createElement('h1', /* ... h1 children ... */),
React.createElement('ul', /* ... ul children ... */)
);
} }
在定义了ShoppingList类之后,我们可以像声明一个html标签一样,如div,轻松地声明ShoppingList类。注意区别。
Usage:<ShoppingList name="fish"/>
comparison:<div id="fish"></div>
例子
我作为一名前端小白,以前不明白为何要使用框架?手写每一行html与JS代码不是挺好的吗?为何框架又更新得如此快呢?通过一个简单具体的例子感受下框架的便捷高效。
这是一个很unremarkable的例子。创建一个九宫格。
在纯html代码中怎么做呢?很简单,就是写九行代码:<button></button>。然后在css中指定布局。
那么如果要创建一个99宫格呢?写99行一样冗余的代码?可以用纯javascript在99次循环中,完成这个任务。也只要写一行代码。
那么在React中怎么做呢?我们声明一个返回button的Square类,九宫格Board类的render方法返回九个Square的层次视图。
哎?好像React框架也没有比较方便啊?我也是这么想的。于是,我继续往下学习。
class Square extends React.Component { render() { return ( <button className="square"> {/* TODO */} </button> ); } } class Board extends React.Component { renderSquare(i) { return <Square />; } render() { const status = 'Next player: X'; return ( <div> <div className="status">{status}</div> <div className="board-row"> {this.renderSquare(0)} {this.renderSquare(1)} {this.renderSquare(2)} </div> <div className="board-row"> {this.renderSquare(3)} {this.renderSquare(4)} {this.renderSquare(5)} </div> <div className="board-row"> {this.renderSquare(6)} {this.renderSquare(7)} {this.renderSquare(8)} </div> </div> ); } } class Game extends React.Component { render() { return ( <div className="game"> <div className="game-board"> <Board /> </div> <div className="game-info"> <div>{/* status */}</div> <ol>{/* TODO */}</ol> </div> </div> ); } } // ======================================== ReactDOM.render( <Game />, document.getElementById('root') );
React的第一个强大之处:传参-props
props即properties的简写。传入的参数都成被封装入props对象中,称为它的一个属性。
修改Board的renderSquare方法,以把一个参数value传给Square类。
class Board extends React.Component { renderSquare(i) { return <Square value={i} />; }注意:我们把参数传给了一个声明的Square。于是,我们修改Square类,使它能够处理这个参数。
class Square extends React.Component { render() { return ( <button className="square"> {this.props.value} </button> ); } }
如你所见,参数value是props对象的一个属性。
在Board的render方法中,调用了renderSquare方法,把数字1-9作为参数。下面是修改后的结果:
交互性
下面这段代码中,我们为button绑定了一个onClick方法,与JS的onclick方法对应。当鼠标点击button,会跳出警告框,提示”click“
class Square extends React.Component { render() { return ( <button className="square" onClick={() => alert('click')}> {this.props.value} </button> ); } }
this.state
顾名思义,state属性存储react对象的某些状态,例如,可以存储传给Square的数字。
【注】:state在构造函数constructor中可直接设置
class Square extends React.Component { constructor(props) { super(props); this.state = { value: null, }; } render() { return ( <button className="square" onClick={() => alert('click')}> {this.props.value} </button> ); } }
state在其他方法中设置需调用setState方法
state属性可以作为props的补充,参数可以通过state直接传给声明的React类。方法如下:
Now change the Square render
method to display the value from the current state, and to toggle it on click:
- Replace the
() => alert()
event handler with() => this.setState({value: 'X'})
.
class Square extends React.Component { constructor(props) { super(props); this.state = { value: null, }; } render() { num=this.state.value; if (!num) num=this.props.value; return ( <button className="square" onClick={() => this.setState({value: 'X'})}> {num} </button> ); } }
现在,点击button,会调用setState方法,导致state的更新,导致重新渲染,进而会改变button的数字值为‘X’。
好了。我们一次完成了对React的一次overview。但依然还有问题没解决,我们下次再见。
code reference:https://reactjs.org/tutorial/tutorial.html#what-is-react