總體結構(與通常html不一樣的)html
<script src="../react.js"></script><!--react核心組件--> <script src="../react-dom.js"></script><!--react操做dom--> <script src="../browser.min.js"></script><!--將jsx語法轉化成js-->
script標籤須要加type="text/babel"
,用於寫JSX語法react
<body> <div class="example" id="example"></div> <script type="text/babel"> ReactDOM.render( //render方法渲染 <MyComponent />,//組件 document.getElementById('example')) </script> </body>
//組件,首字母大寫,用於輸出組件類,返回的只能包含一個頂級標籤 let PreList = React.createClass({///createClass用於生成組件類, render : function () {//必定有一個render方法 //arr預設key值,作diff let arr1 = [<h1 key="1">hello</h1>,<h1 key="2">bob</h1>,<h1 key="3">how are you?</h1>];//須要預設key,作diff對比時候用,要不報錯 const arr2 = [1,2,3]; //{}代碼塊,寫js,<>寫html標籤 return <div> <div> {arr1.map(function (val) { return val; })} </div> <ul> {arr2.map(function (val,index) { return <li key={index}>{val}</li>;//key值須要設,要不報錯 })} </ul> </div> } });
let Button = React.createClass({ getDefaultProps:function () {//默認屬性 return {name : 'click me'}; }, propTypes : {//屬性,驗證組件實例的屬性是否符合要求 name : React.PropTypes.string.isRequired }, loginClick :function () { alert('點擊生效') }, render:function () {//onClick={this.loginClick},用括號包裹 return <div> <button onClick={this.loginClick}>{this.props.name}</button> </div>//this指的組件 } });
let RealDom = React.createClass({ loginClick :function () {//click事件確保用戶點擊了真實dom,才觸發ref讀取 this.refs.pwd.focus();//this.refs獲取真實dom,有時候須要獲取用戶的輸入,就須要真實的dom才能拿到 alert(this.refs.pwd.value); }, render:function () { return <div> <input type="text" ref="pwd" name="pwd" title="pwd"/> <button onClick={this.loginClick}>{this.props.name}</button> </div>//this指的組件 } });
let InputChange = React.createClass({ getInitialState : function (){ return { value : 'hello!' //用戶填入表單中的屬性屬於可變,不能用props } }, changeInput:function (e) { this.setState({value : e.target.value}) }, render :function () { //onChange={this.changeInput}回調,用來讀取用戶輸入的值,input/textarea/select/radio都是 return <div> <input title="name" value={this.state.value} onChange={this.changeInput}/> <p>{this.state.value}</p> </div> } })
let Child = React.createClass({ render : function () { //this.props.children,表示組件全部子節點,三種可能(undefined--沒有,object--一個子節點,array--多個子節點) //React.Children來處理this.props.children; //React.Children.map遍歷子節點,就不用擔憂this.props.children的數據類型 return <ul> {React.Children.map(this.props.children,function (child) { return <li>{child}</li> })} </ul> } });
this.props:屬性,最開始定義好就再也不變化
this.state:會隨着用戶的變化而變化的狀態值babel
let LikeButton = React.createClass({ getDefaultProps:function () { return { bgColor : 'yellow'} }, getInitialState : function (){//默認狀態值設置 return { like : false, } }, changeLike : function () { this.setState({//修改狀態值,每次狀態值的修改,帶動render的從新自動渲染 like : !this.state.like }) }, render :function () { var text = this.state.like? "like":"don't like"; //{{background:this.props.bgColor}} ,方式設置樣式,React 組件樣式是一個對象,第一個{}表明這是js語法,第二個{}表明是樣式對象 return <div> <button onClick={this.changeLike} style={{background:this.props.bgColor}}>{text}</button> </div> } });
/*總的組件控制器,集合*/ let MyComponent = React.createClass({ //組件的生命週期,三種,will函數在以前調用,did在以後調用 /**componentWillMount() componentDidMount() componentWillUpdate(object nextProps, object nextState) componentDidUpdate(object prevProps, object prevState) componentWillUnmount() componentWillReceiveProps(object nextProps):已加載組件收到新的參數時調用 shouldComponentUpdate(object nextProps, object nextState):組件判斷是否從新渲染時調用*/ componentWillMount:function () { //插入真實dom前, alert('dom not ok') }, componentDidMount:function () { //插入真實dom後, alert('dom ok') }, render :function () { //若是不須要子節點,能夠不用謝閉合雙標籤,這樣<PreList/>就好 ////關於屬性:class 屬性須要寫成 className ,for 屬性須要寫成 htmlFor ,這是由於 class 和 for 是 JavaScript 的保留字。 return <div> <Button className="btn"/> <RealDom name="點擊"/> <PreList/> <Child> <span>test child1</span> <span>test child2</span> </Child> <LikeButton /> <InputChange /> </div> } });
1.阮一峯:React入門dom