1. 程式人生 > 其它 >1.react的基礎知識

1.react的基礎知識

React 的基礎之:JSX 語法

react 使用 JSX 語法,js 程式碼中可以寫 HTML 程式碼。

let myTitle = <h1>Hello, World!</h1>;

JSX 語法解釋:

  (1) JSX 語法的最外層,只能有一個節點:

//錯誤
let myTitle = <p>Hello</p><p>World</p>

  (2) JSX 語法中可以插入 JavaScript 程式碼,使用大括號。

let myTitle = <p>{'Hello' + 'World'}</p>

Babel 轉碼器

  js 引擎(包括瀏覽器和 Node)都不認識 JSX,需要首先使用 Babel 轉碼,然後才能夠執行。

<script src="react.js"></script>
<script src="react-dom.js"></script>
<script src="babel.min.js"></script>
<script type="text/babel">
  // ** 這裡添寫程式碼! **
</script>

  React 需要載入兩個庫:React 和 React-DOM,前者是 React 的核心庫,後者是 React 的 DOM 適配庫。

  Babel 用來在瀏覽器轉換JSX語法,如果伺服器已經轉好了,瀏覽器就不需要載入這個庫。


React基礎之React元件

  React 允許使用者定義自己的元件,插入網頁。

示例:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8" />
    <title>菜鳥教程 React 例項</title>
    <script src="https://cdn.bootcss.com/react/15.4.2/react.js"></script>
    <script src="https://cdn.bootcss.com/react/15.4.2/react-dom.min.js"></script>
    <script src="https://cdn.bootcss.com/babel-standalone/6.22.1/babel.min.js"></script>
  </head>
  <body>
    <div id="example"></div>
    <script type="text/babel">
        class MyComponent extends React.Component {
            render() {
                return <h1>Hello world</h1>;
            }   
        };

        ReactDOM.render(
            <MyComponent/>,
            document.getElementById('example')
        );
    </script>
  </body>
</html>    

結果:

React元件的語法解釋

  • class MyComponent extends React.Component 是 ES 6語法,表示自定義一個 MyComponent 類,該類繼承了積累 React.Component 的所有屬性和方法。
  • React 規定,自定義元件的開頭字母必須大寫,比如 MyComponent 不能寫為 myComponent,以便於與內建的原生類相區分。
  • 每個元件都必須有 render 方法,定義輸出的樣式。
  • <MyComponent/> 表示生產一個元件類的例項,每一個例項一定要有閉合標籤,寫成 <MyComponent></MyComponent> 也可以。

元件的引數

元件可以從外部傳入引數,內部使用this.props獲取引數。

示例:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8" />
    <title>React 例項</title>
    <script src="https://cdn.bootcss.com/react/15.4.2/react.js"></script>
    <script src="https://cdn.bootcss.com/react/15.4.2/react-dom.min.js"></script>
    <script src="https://cdn.bootcss.com/babel-standalone/6.22.1/babel.min.js"></script>
  </head>
  <body>
    <div id="example"></div>
    <script type="text/babel">
        class MyComponent extends React.Component {
            render() {
                return <h1 style={{color: this.props.color}}>
                           {this.props.name}
                      </h1>;
            }   
        };

        ReactDOM.render(
            <MyComponent name='Hello world' color='red' />,
            document.getElementById('example')
        );
    </script>
  </body>
</html>    

 結果:

語法解釋

  • 元件內部通過this.props物件獲取引數。

元件的狀態

元件往往會有內部狀態,使用this.state表示

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8" />
    <title>React 例項</title>
    <script src="https://cdn.bootcss.com/react/15.4.2/react.js"></script>
    <script src="https://cdn.bootcss.com/react/15.4.2/react-dom.min.js"></script>
    <script src="https://cdn.bootcss.com/babel-standalone/6.22.1/babel.min.js"></script>
  </head>
  <body>
    <div id="example"></div>
    <script type="text/babel">
        class MyComponent extends React.Component {
            constructor(... args) {
                super(...args);
                this.state = {
                    test: 'Hello State',
                    isClicked: false
                };
            }

            handleClick() {
                let isClicked = !this.state.isClicked;
                this.setState({
                    isClicked : isClicked,
                    text: isClicked ?  'Hello State' : Date();
                });
           }

            render() {
                return <h1 onClick={this.handleClick.bind(this)}>
                              clikc to : {this.state.text}
                         </h1>
            }

        };

        ReactDOM.render(
            <MyComponent/>,
            document.getElementById('example')
        );
    </script>
  </body>
</html>                             

語法解釋

class MyTitle extends React.Component {
    constructor(...args) {
        super(...args);
        this.state = {   
           name: '訪問者'
        }
    }
}

constructor是元件的建構函式,會在建立例項時自動呼叫。...args表示元件引數,super(...args)是ES6規定的手法。this.state物件用來存放內部狀態,這裡是定義初始狀態。

<div>
    <input type="text" onChanges={this.handleChange.bind(this)}>
    <p>你好,{this.state.name}</p>
</div>

this.state.name表示讀取this.state的name屬性。每當輸入框有變動的時候,就會自動呼叫onChange指定的監聽函式,這裡是this.handleChange, .bind(this)表示該方法內部的this,綁定當前元件。

handleChange(e) {
    let name = e.target.value;
    this.setState({
        name: name
    });
}

this.setState方法用來重置this.state,每次呼叫這個方法,就會引發元件的重新渲染。


元件的生命週期

React為元件的不同生命週期,提供了近十個鉤子方法。

鉤子方法:是對於抽象方法或者介面的一個空實現。

現實中的一應用,想要實現某個介面中的一個方法(該介面中有多個方法),先用一個抽象類實現這個介面,然後用abstract修飾想要實現的方法,然後其他方法都使用空實現,然後子類繼承抽象類即可。這裡的空實現方法就是鉤子方法。

  • componentWillMount():元件載入前呼叫。
  • componentDidMount():元件載入後呼叫。
  • componentWillUpdate():元件更新前呼叫。
  • componentDidUpadte():元件更新後呼叫。
  • componentWillUnmont():元件解除安裝後呼叫。
  • componentWillReceiveProps():元件接受新引數時呼叫。