React 基礎入門,基礎知識介紹

来源:http://www.cnblogs.com/leolovexx/archive/2016/10/12/5953024.html
-Advertisement-
Play Games

React不管在demo渲染還是UI上,都是十分方便,本人菜鳥試試學習一下,結合阮一峰老師的文章,寫下一點關於自己的學習react的學習筆記,有地方不對的地方,希望各位大牛評論指出; PS:代碼包下載: react包引入,在標簽里引入包; 首先,最後一個 <script> 標簽的 type 屬性為  ...


React不管在demo渲染還是UI上,都是十分方便,本人菜鳥試試學習一下,結合阮一峰老師的文章,寫下一點關於自己的學習react的學習筆記,有地方不對的地方,希望各位大牛評論指出;

PS:代碼包下載

react包引入,在標簽里引入包

<html>
  <head>
    <script src="../build/react.js"></script>
    <script src="../build/react-dom.js"></script>
    <script src="../build/browser.min.js"></script>
  </head>
  <body>
    <div id="example"></div>
    <script type="text/babel">
      // ** Our code goes here! **
    </script>
  </body>
</html>

首先,最後一個 <script> 標簽的 type 屬性為 text/babel 。這是因為 React 獨有的 JSX 語法,跟 JavaScript 不相容。凡是使用 JSX 的地方,都要加上 type="text/babel" 。

其次,上面代碼一共用了三個庫: react.js 、react-dom.js 和 Browser.js ,它們必須首先載入。其中,react.js 是 React 的核心庫,react-dom.js 是提供與 DOM 相關的功能,Browser.js 的作用是將 JSX 語法轉為 JavaScript 語法,這一步很消耗時間,實際上線的時候,應該將它放到伺服器完成。

 

當然 在最後編譯的時候 可以直接使用JSx ,引入一個 JSXTransformer.js    就可以直type中看使用text/Jsx  這樣的好處是在我的編譯器(webstorm)中有關鍵詞的顏色區分;

<html>
<head>
<script src="../build/react.js"></script>
<script src="../build/react-dom.js"></script>
<script src="../build/JSXTransformer.js"></script>
</head>
<body>
<div id="example"></div>
<script type="text/jsx">
ReactDOM.render(
<h1>Hello, world! </h1>,
document.getElementById('example')
);
</script>
</body>
</html>

 

1.基礎語法:

ReactDom.render 工三個參數,第一個元素 ,第二個是綁定的元素,第三個是回調函數

JSX語法:遇到<>開頭用 HTML語法解析,遇到{} javascript 解析;

 

 

 ReactDom.render(

 <div>

  {

names.map(function (name) {

//這裡可以定義變數

      return <div>Hello, {name}!</div>

    })

  }

  </div>,

  document.getElementById('example')

)

 

 

2.組件

var NewString = React.createClass({
    render: function () {
 var s=<h1 className="two" id="two">
     <i id="one" >MMMMMM{this.id},{this.props.name},{this.props.id},{this.props.className}
     </i></h1>;
        return s;
    }
})

組件的屬性可以在組件類的 this.props 對象上獲取

就是 class 屬性需要寫成 className ,for 屬性需要寫成 htmlFor ,

必須包括一個且 只能包括一個頂層標簽;

 

 

組件可使用單雙標簽,沒區別,但是當需要獲取組件的子元素的時候,必須使用雙標簽。

 

雙標簽獲取組件下麵的子類:

我們可以用 React.Children.map 來遍歷子節點,而不用擔心 this.props.children 的數據類型是 undefined 還是 object

var NotesList = React.createClass({
    render: function () {
        return (
                <p>
                    {
                    React.Children.map(this.props.children, function (child) {
                       console.log(child)
                        return <p>{child}</p>;
                    })
                }
                </p>
        );
    }
});
ReactDOM.render(
        <NotesList>
       <span id="children">hello</span>
          <span>world</span>
        </NotesList>,
        document.getElementById('example')
);

 

 

3.PropTypes

var MyTitle = React.createClass({

  propTypes: {

    title: React.PropTypes.string.isRequired,

  },

 

  render: function() {

     return <h1> {this.props.title} </h1>;

   }});

 

上面的Mytitle組件有一個title屬性。PropTypes 告訴 React,這個 title 屬性是必須的,而且它的值必須是字元串。現在,我們設置 title 屬性的值是一個數值。

這樣一來,title屬性就通不過驗證了 

 

4.getDefaultProps

  getDefaultProps : function () {

    return {

      title : 'Hello World'

    };

  },

 

  render: function() {

     return <h1> {this.props.title} </h1>;

   }});

 

getDefaultProps 設置預設title的值。  

ReactDOM.render(

  <MyTitle />,

  document.body);

當組件上沒有titlethis.props.title的值等於預設值  Hello World

ReactDOM.render(

  <MyTitle title=New title/>,

  document.body);

當組件上有titlethis.props.title的值  New title

 

5、獲取真實的DOM節點ref

var MyComponent = React.createClass({
  handleClick: function() {
    this.refs.myTextInput111.focus();
    this.refs.pp.style.color="red";
  },
  output:function(){
    alert("wo xtet")
  },
  getDefaultProps : function () {
    return {
      title : 'Hello World'
    };
  },
  render: function() {
    return (
      <div>
        <input type="text" ref="myTextInput111"  onClick={this.output} />
        <input type="button" value="Focus the text input" onClick={this.handleClick}/>
        <p ref="pp">{this.props.title}</p>
      </div>
    );
  }
});

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

文本輸入框必須有一個 ref 屬性,然後 this.refs.[refName] 就會返回這個真實的 DOM 節點。並且可以操作這個DOM,和原生操作Js一樣

6、This.state

在組件內可以定義狀態,當用戶改變這個狀態的時候,頁面會重新渲染。

getInitialState  是關鍵字,來定義組件狀態

var LikeButton = React.createClass({
  getInitialState: function() {
    return {
      liked11: false,
      love:true
    };
  },
  handleClick: function(event) {
    this.setState({liked11: !this.state.liked11});
    this.setState({love:!this.state.love})
  },
  render: function() {
    var text = this.state.liked11 ? 'like' : 'haven\'t liked';
   var text1=this.state.love?"love":"hate";
    return (
      <p>
        You {text} this. Click to toggle.
        <br/>
        <span onClick={this.handleClick}>you {text1} this.clcik to tpggle</span>
      </p>
    );
  }
});

當用戶點擊組件,導致狀態變化,this.setState 方法就修改狀態值,每次修改以後,自動調用 this.render 方法,再次渲染組件。

由於 this.props 和 this.state 都用於描述組件的特性,可能會產生混淆。一個簡單的區分方法是,this.props 表示那些一旦定義,就不再改變的特性,而 this.state 是會隨著用戶互動而產生變化的特性

 

7.表單

this.props.value 讀取組件的屬性(代碼黃色處),而要定義一個 onChange 事件的回調函數,通過 表單元素用 event.target.value

非表單用event.target.innerHTMl 操作節點一樣方式

    var num=12;
  var Input = React.createClass({
  getInitialState: function() {
    return {
    value: 'Hello!',
    value1:num,
    };
  },
  handleChange: function(event) {
    this.setState({value: event.target.value});
    this.setState({value1:this.state.value1+=1});
  },
  render: function () {
    var value = this.state.value;
    return (
      <div value="div111" id="ee" name="owow">
        <input id="mom" type="text" value={value} onChange={this.handleChange} />
        <div>{this.state.value1}</div>
        <p onChange={this.handleChange}>{value}</p>
       <span>{this.props.value}</span>
      </div>
    );
  }
});

ReactDOM.render(<Input value="!@21"/>, document.getElementById('example'));

8.組件的生命周期

組件的生命周期分成三個狀態:

  • Mounting:已插入真實 DOM
  • 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):組件判斷是否重新渲染時調用

 

附帶代碼:

   var Hello = React.createClass({
        getInitialState: function () {
          console.log(this);
          return {
            opacity: 1.0
          };
        },
        componentWillMount: function () {
          this.timer = setInterval(function () {
            var opacity = this.state.opacity;
            opacity -= .05;
            if (opacity < 0.1) {
              opacity = 1.0;
            }
            this.setState({
              opacity: opacity
            });
//bind(this) 你可以當做是 使用外部的this(React組件的)覆蓋函數中的this.
          }.bind(this), 100);
        },
        render: function () {
          return (
            <div style={{opacity: this.state.opacity}}>
              Hello {this.props.name}
            </div>
          );
        }
      });

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 需要準備:jQuery Bootstrap 天氣預報API(本文中使用API可能會失效請靈活運用) CSS樣式可以你自己去寫這裡只提出jQuery 請求數據和解析JSON數據 上面是要用到的JSON數據格式 搭建界面略過 根據JSON中數據添加到HTML中 解析數據到HTML中 其中一定要註意 跨域 ...
  • 目的 template綁定(模板綁定)使用渲染模板的結果填充關聯的DOM元素。 模板是一種簡單方便的方式來構建複雜的UI結構 。 下麵介紹兩種使用模板綁定的方法: 本地模板是支持foreach,if,with和其他控制流綁定的機制。 在內部,這些控制流綁定捕獲元素中包含的HTML標記,並將其用作模板... ...
  • 之前看別人寫的插件經常會用到RegExp對象來驗證輸入,並且獲取一些那時我並不曉得是什麼東西的數組,來取值進行自定義的邏輯處理。今天學習了一下RegExp類型。終於有了一個初步的瞭解,至少不會看一會就感覺蒙圈了,記錄分享一下 ECMAScript通過RegExp類型來支持正則表達式 語法如下 其中 ...
  • 這章與上一張《jQuery input 下拉框焦點事件》類似 這章講述div的焦點事件如何使用 div的焦點事件與input的焦點事件區別在於 需要多添加一個屬性:tabindex; (Safari可能不支持) 這個屬性是可以讓鍵盤獲取到焦點事件,當然,我們只是用這個屬性來讓div有焦點而已;為了不 ...
  • 一、HTML 二、最基本的HTML結構 三、最常用的HTML標簽 a、佈局標簽 div標簽定義文檔中的分區或節(division/section),可以把文檔分割為獨立的、不同的部分,主要用於佈局。 aside標簽的內容可用作文章的側欄,html5新增標簽。 header標簽定義頁面的頭部(介紹信息 ...
  • 一看就懂。走起! ...
  • <marquee>知識點 現在這個標簽不主張使用,因為不符合w3c標準(結構、樣式、行為)功能性分離。 1.behavior滾動的方式 【alternate】:表示在兩端之間來回滾動 【scroll】:表示由一端滾動到另一端,會重覆 【slide】:表示由一端滾動到另一端,不會重覆 2.direct ...
  • 首先上控制項的地址http://code.ciaoca.com/jquery/validation-engine/ 具體使用方式網站里說的很清楚,我寫這篇文章主要是用於記錄如何自己添加自定義正則表達式,這個問題折騰了幾次,剛剛纔會搞。網上也查了很多,都沒有說到點子上的,也許是我太笨沒看懂。 進入正題, ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...