React入門學習

如何渲染到容器

直接上代碼:javascript

//第一個參數是構造的組件,第二個參數是使用組件的容器
    ReactDom.render( <Avatar name='' link='' />, document.getElementByID(''));

render渲染頁面 將組件放到選定的元素裏面html

如何定義組件

使用React.createClass({render:function(){return ( 我是dom元素 )}})構建java

var ProfilePic = React.createClass({
          render: function() {
            //能夠在return前進行相關處理
            return (
                  <img src={this.props.link} /> 
            );
        }
    });

1.return()括號中只能填寫一個標籤,不然報錯
2.this.propsReactDOM.render中傳遞的屬性,是一個對象 對於組件套組件的方式能夠傳遞屬性值,以下面例子react

組件套組件

// 渲染到容器
    ReactDOM.render(
        <Avatar
            name="GuoYongfeng"
            link="https://avatars2.githubusercontent.com/u/8686869?v=3&s=460"
        />,
         document.getElementById('example')
    );
    
    var Avatar = React.createClass({
          render: function() {
            return (
                  <div>
                <ProfilePic link={this.props.link} /> //this.props包含了name和link的屬性,同時在ProfilePic組件中可使用this.props獲取link的值
                    <ProfileLink name={this.props.name} />
                  </div>
            );
          }
    });

如何設置某個變量的初始值

使用getInitialState:function(){return {}}聲明初始化變量,使用this.setState({鍵值對})修改getInitialState函數中的變量,經過this.state對象獲取屬性的值,代碼以下:git

var ClickApp = React.createClass({
    getInitialState:function(){
        return {
            clickCount: 0,                
        }
    },
    handleClick: function(e){
        this.setState({
            clickCount: this.state.clickCount + 1,
        });
    },
    render: function(){
        return (
            <div>
                <h2>點擊下面按鈕</h2>
                <button onClick={this.handleClick}>點擊我</button>
                <p>你一共點擊了:{this.state.clickCount}</p>
            </div>
        )
    }
    });

getInitialState在組件的生命週期內只會運行一次,用來設置組件的初始狀態。github

this.props.children

this.props 對象的屬性與組件的屬性一一對應,可是有一個例外,就是 this.props.children 屬性,它表示組件的全部子節點。
this.props.children的值有三種可能:若是當前組件沒有子節點,它就是 undefined ;若是有一個子節點,數據類型是 object;若是有多個子節點,數據類型就是 array。React 提供一個工具方法 React.Children 來處理 this.props.children 。咱們能夠用 React.Children.map 來遍歷子節點,而不用擔憂 this.props.children 的數據類型是 undefined 仍是 objectnpm

PropTypes

驗證組件提供的參數是否知足要求。如 propTypes: { title: React.PropTypes.string.isRequired },render:function(){return} 代碼的做用就是說明title是必須填寫的並且爲字符串。 使用 getDefaultProps來配置默認的字符串 getDefaultProps : function () { return { title : 'Hello World'};},gulp

組件的生命週期

生命週期分爲三個狀態:promise

  • Mounting:已插入真實 DOMbabel

  • Updating:正在被從新渲染

  • Unmounting:已移出真實 DOM
    React 爲每一個狀態都提供了兩種處理函數,will 函數在進入狀態以前調用,did 函數在進入狀態以後調用,三種狀態共計五種處理函數。

  • componentWillMount()

  • componentDidMount()

  • componentWillUpdate(object nextProps, object nextState)

  • componentDidUpdate(object prevProps, object prevState)

  • componentWillUnmount()

此外,React 還提供兩種特殊狀態的處理函數。

  • componentWillReceiveProps(object nextProps):已加載組件收到新的參數時調用

  • shouldComponentUpdate(object nextProps, object nextState):組件判斷是否從新渲染時調用

JSX轉化器

1.內嵌的jsx代碼,須要在script標籤中要加上type="text/babel",並引入browser.min.js5.8.24文件,或者使用bower install babel --save-dev下載babel文件中獲取,將ES6轉化爲ES5
2.[已廢棄]使用react-tools模塊,將代碼轉化成線上代碼 使用npm install -g react-tools安裝,使用jsx --watch src/ build/轉化
3.能夠直接使用babel轉化,babel --presets react [es2015] src --watch --out-dir build,其中[es2015]是選填項,src是源文件路徑 build是編譯後的文件路徑
4.在gulp中使用gulp-react轉化

Html轉義

對於某些富文本內容,在頁面上顯示

var content='<strong>content</strong>';
    React.render(
        <div>{content}</div>,
        document.body
    );
    
    //會直接顯示 <strong>content</strong> 至關於ejs中<%= %>

Html默認會對Html文章轉義,如何不轉義

var content='<strong>content</strong>';    
    React.render(
        <div dangerouslySetInnerHTML={{__html: content}}></div>,
        document.body
    );

CDN文件

1.react
react 包括 React.createElementReact.createClassReact.ComponentReact.PropTypesReact.Children
react-dom 包括 ReactDOM.render.unmountComponentAtNode.findDOMNode
react-dom-server 包括.renderToString.renderToStaticMarkup
react-with-addons

HTML 標籤 vs. React 組件

React.render方法能夠渲染HTML結構,也能夠渲染React組件。JSX使用首字母大小寫來區分是本地組件類仍是Html標籤。
(1)渲染HTML標籤,聲明變量採用首字母小寫

var myDivElement = <div className="foo" />;
    React.render(myDivElement, document.body);

(2)渲染React組件,聲明變量採用首字母大寫

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

Small Tips

1.數據的傳遞都是須要至於{}之中,包括賦值<div {...other} className={fancyClass} />,{}中的變量都是能夠經過ReactDom.render時傳入
2.使用default爲前綴,加上Checked,Value等設置默認值,如defaultChecked,defaultValue等,在組件中使用已有的屬性。
3.this.refs引用對象集合,在Dom元素上添加了ref屬性後,就會將這個Dom元素添加到this.refs之中,在頁面中這個標籤的值是惟一的,this.refs.xxxx.value這種方式能夠獲取變量的值,ref是一種回調的原理,當子組件的該屬性值改變,相應的值會回調給父組件
4.在組件實現時,return(<div>{ }</div>)中的{}能夠加入大量的javascript處理函數,以下:

return (
      <ul>
        {
          this.props.list.map(function (child) {
            return <li>{child}</li> //注意這種寫法,<li>{child}</li>
          })
        }
      </ul>
    );

5.組件能夠直接當作Dom標籤同樣使用,像button,h1
6.與Javascript DOM中同樣的寫法,class對於className,html對應於htmlFor;另外,對於非html內置的屬性,必定要加上data-,如<div data-custom-attribute="foo" />
`
7.JSX 的基本語法規則

  • 遇到 HTML 標籤(以 < 開頭),就用 HTML 規則解析;

  • 遇到代碼塊(以 { 開頭),就用 JavaScript 規則解析

8.this.props 和 this.state不一樣點
因爲 this.propsthis.state 都用於描述組件的特性,可能會產生混淆。一個簡單的區分方法是,this.props表示那些一旦定義,就再也不改變的特性,而 this.state 是會隨着用戶互動而產生變化的特性。
9.組件中樣式的寫法:style="opacity:{this.state.opacity};"這種方式錯誤;使用 style={{opacity: this.state.opacity}}這種方式,第一重大括號表示這是 JavaScript 語法,第二重大括號表示樣式對象。
10.在componentDidMount中的設置請求返回的數據須要特別注意只有當數據返回回來纔有效,經過 this.isMounted() 判讀,或者直接使用promisethen方法.查看示例12

參考文檔

1.阮一峯老師的[react-demos](https://github.com/ruanyf/react-demos)

相關文章
相關標籤/搜索