react入門(上)

来源:https://www.cnblogs.com/ntbww93/archive/2018/09/21/9687093.html
-Advertisement-
Play Games

7.JSX語法 1 <script type="text/babel"> 2 //定義內部標題組件 3 class Welcome extends React.Component { 4 render() { 5 return <h2>Welcome {this.props.name}!</h2>; ...


1. ReactJS是什麼?
1). Facebook開源的一個js庫
2). 一個用於動態構建用戶界面的js庫
2. React的特點
* Declarative(聲明式編碼)
* Component-Based(組件化編碼)
* Learn Once, Write Anywhere(支持客戶端與伺服器渲染)
* 高效
* 單向數據流
3. React高效的原因
1). 虛擬(virtual)DOM, 不總是直接操作DOM
2). 高效的DOM Diff演算法, 最小化頁面重繪
4. 模塊與組件的概念
* 模塊: 向外提供特定功能的js程式, 一般就是一個js文件
作用: 簡化js的編寫, 閱讀, 提高運行效率
* 組件: 用來實現特定功能效果的代碼集合(html/css/js)
作用: 復用, 簡化項目編碼, 提高運行效率
5. 模塊化與組件化
* 模塊化:
當應用的js都以模塊來編寫的, 這個應用就是一個模塊化的應用
* 組件化:
當應用是以多組件的方式實現功能, 這個應用就是一個組件化的應用
6.入門案例
react.js: React的核心庫
react-dom.js: 提供操作DOM的擴展庫
babel.min.js: 解析JSX語法代碼轉為純JS語法代碼的庫
在頁面中導入js
編碼
<script type="text/babel"> //必須用babel
 1 <div id="demo"></div>
 2 
 3 <script type="text/javascript" src="../js/react.js"></script>
 4 <script type="text/javascript" src="../js/react-dom.js"></script>
 5 <script type="text/javascript" src="../js/babel.min.js"></script>
 6 <script type="text/babel">
 7   //頁面中的真實容器元素
 8   var containDiv = document.getElementById('demo');
 9   //react的虛擬DOM對象
10   var vDom = <div id="demo">Hello, React!</div>;  //不是字元串, 不能加引號
11   //將虛擬DOM對象渲染到頁面元素中
12   ReactDOM.render(vDom, containDiv);
13   //頁面結果: <div id="demo"><div id="demo">Hello, React!</div></div>
14 </script>

7.JSX語法

JSX 即JavaScript XML,它是一種在React 組件內部構建標簽的類XML語法,使用JSX可以提高組件的可讀性,因此推薦使用。JSX最終會被轉換為JavaScript。
1⃣️React組件只能渲染一個根節點,這是由於js的特性,即return語句只能返回單個的值,解決辦法是將要返回的值都包含在一個根對象中。
2⃣️JSX不能使用if語句,可使用三元表達式替代,或者將條件語句移動到JSX外部。
<script type="text/babel">
  //初始化動態數據
  var title = 'I Love you!';
  var myName = 'bww';
  //創建虛擬dom : JSX
  var vDOM = <h1 id="myTitle" name={myName}>{title}</h1>;
  //將虛擬dom渲染中頁面元素中
  ReactDOM.render(vDOM, document.getElementById('example1'));
</script>
8. 自定義組件(Component) :
1). 定義組件
//方式1: 工廠(無狀態)函數(最簡潔, 推薦使用)
function MyComponent1() {
return <h1>自定義組件標題11111</h1>
}
//方式2: ES6類語法(複雜組件, 推薦使用)
class MyComponent3 extends React.Component {
render () {
return <h1>自定義組件標題33333</h1>
}
}
//方式3: ES5老語法(不推薦使用了)
var MyComponent2 = React.createClass({
render () {
return <h1>自定義組件標題22222</h1>
}
})
2). 渲染組件標簽
ReactDOM.render(<MyComponent/>, document.getElementById('example'));
註意:
1). 返回的組件類必須首字母大寫
2). 虛擬DOM元素必須只有一個根元素
3). 虛擬DOM元素必須有結束標簽
ReactDOM.render()渲染組件標簽的基本流程
1). React內部會創建組件實例對象
2). 得到包含的虛擬DOM並解析為真實DOM
3). 插入到指定的頁面元素內部
9.組件實例對象3大屬性之一: props屬性
1. 每個組件對象都會有props(properties的簡寫)屬性
2. 組件標簽的所有屬性都保存在props中
3. 內部讀取某個屬性值: this.props.propertyName
4. 作用: 通過標簽屬性從組件外向組件內傳遞數據(只讀)
5. 對props中的屬性值進行類型限制和必要性限制
Person.propTypes = {
name: React.PropTypes.string.isRequired,
age: React.PropTypes.number.isRequired
}
6. 擴展屬性: 將對象的所有屬性通過props傳遞
<Person {...person}/>
7. 預設屬性值
Person.defaultProps = {
name: 'Mary'
};
8. 組件類的構造函數
constructor (props) {
super(props);
console.log(props); // 查看所有屬性
}


 //缺失時設置預設屬性
 Person.defaultProps = {
    sex: '男',
    age: 18
  };  
  //初始化數據
  let person = {name: 'atguigu', sex: '女', age: 3};
  //根據數據動態渲染組件標簽
  /*ReactDOM.render(<Person name={person.name} age= 
  {person.age} sex={person.sex}/>,
      document.getElementById('example'));*/
  ReactDOM.render(<Person {...person}/>,
      document.getElementById('example'));

  const person2 = {name: 'kobe', sex: '女'};
  ReactDOM.render(<Person {...person2}/>, 
  document.getElementById('example2'));



 1 <script type="text/babel">
 2 //定義內部標題組件
 3   class Welcome extends React.Component {
 4     render() {
 5       return <h2>Welcome {this.props.name}!</h2>;
 6     }
 7   }
 8   Welcome.propTypes = {
 9     name: React.PropTypes.string.isRequired
10   };
11   //定義外部應用組件
12   class App extends React.Component {
13     render() {
14       return (
15         <div>
16           {
17             this.props.names.map(
18               (name, index) => <Welcome name={name} key={index}/>
19             )
20           }
21         </div>
22       );
23     }
24   }
25   App.propTypes = {
26     names: React.PropTypes.array.isRequired
27   };
28 
29   /**********************************************************/
30 
31   var names = ['Tom', 'Jack', "Bob"];
32   ReactDOM.render(<App names={names}/>, document.getElementById('example'));
33 </script>
View Code
10. 組件實例對象的3大屬性之二: refs屬性
1). 組件內的標簽都可以定義ref屬性來標識自己
2). 在組件中可以通過this.refs.refName來得到對應的真實DOM對象
3). 作用: 用於操作指定的ref屬性的dom元素對象(表單標簽居多)
* <input ref='username' />
* this.refs.username //返回input對象
事件處理
1). 通過onXxx屬性指定組件的事件處理函數(註意大小寫)
* React使用的是自定義(合成)事件, 而不是使用的DOM事件
* React中的事件是通過委托方式處理的(委托給組件最外層的元素)
2). 通過event.target得到發生事件的DOM元素對象
<input onFocus={this.handleClick}/>
handleFocus(event) {
event.target //返回input對象
}
強烈註意
1). 組件內置的方法中的this為組件對象
2). 在組件中自定義的方法中的this為null
* 強制綁定this
* 箭頭函數(ES6模塊化編碼時才能使用)



 1 class RefsTest extends React.Component {
 2       constructor (props) {
 3        super(props);
 4 
 5         this.showMsg = this.showMsg.bind(this); // 強制給showMsg()綁定this(組件對象)
 6         this.handleBlur = this.handleBlur.bind(this);
 7       }
 8 
 9       showMsg() {
10         // console.log(this); //this預設是null, 而不組件對象
11         const input = this.refs.msg;
12         alert(input.value);
13       }
14 
15       handleBlur(event) {
16         const input = event.target;
17         alert(input.value);
18       }
19 
20       render () {
21         return (
22           <div>
23             <input type="text" ref="msg"/>
24             <button onClick={this.showMsg}>提示輸入數據</button>
25             <input type="text" placeholder="失去焦點提示數據" onBlur={this.handleBlur}/>
26           </div>
27         );
28       }
29     }
View Code

11.組件實例對象3大屬性之: state屬性
1). 組件被稱為"狀態機", 通過更新組件的狀態值來更新對應的頁面顯示(重新渲染)
2). 初始化狀態:
constructor (props) {
super(props)
this.state = {
stateProp1 : value1,
stateProp2 : value2
}
}
3). 讀取某個狀態值
this.state.statePropertyName
4). 更新狀態---->組件界面更新
this.setState({
stateProp1 : value1,
stateProp2 : value2
})
12.受控組件
class TwoWay extends React.Component {
    constructor(props) {
      super(props)
      this.state = {
        msg: 'atguigu'
      }
      this.handleChange = this.handleChange.bind(this)
    }

    handleChange(event) {
      let msg = event.target.value
      this.setState({msg})
    }

    render() {
      return (
        <div>
          <input type="text" value={this.state.msg} onChange={this.handleChange}/>
          <p>{this.state.msg}</p>
        </div>
      )
    }
  }

 

 

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

-Advertisement-
Play Games
更多相關文章
  • 前言 這裡主要介紹一下Xcode10 版本主要更新的內容。 隨著iOS12的發佈,Xcode10已經可以從Mac App Store下載。 Xcode10包含了iOS12、watchOS 5、macOS10.14以及tvOS 12的SDK。另外,開發者可以從Xcode中看到當前Deployment ...
  • 什麼是小程式·雲開發 小程式·雲開發是微信團隊和騰訊雲團隊共同研發的一套小程式基礎能力,簡言之就是:雲能力將會成為小程式的基礎能力。整套功能是基於騰訊雲全新推出的雲開發(Tencent Cloud Base)所研發出來的一套完備的小程式後臺開發方案。 小程式·雲開發為開發者提供完整的雲端流程,簡化後 ...
  • JavaScript比較和邏輯運算符 JavaScript比較和邏輯運算符 比較和邏輯運算符用於測試true或者false。 比較運算符 比較運算符在邏輯語句中使用,以測定變數或值是否相等 可以在條件語句中使用比較運算符,對值進行比較,然後根據結果採取行動。 例如:if(age > 18) { al ...
  • "阮一峰ES6入門" let 作用域 let命令用來聲明變數,但聲明的變數只在let命令所在的代碼塊內有效。 for迴圈 上圖代碼中i是var聲明的,在全局範圍內部有效,所以全局只有一個變數i。 每一次迴圈,變數i的值都會發生改變,而迴圈內被賦給數組a的函數內部的console.log(i),裡面的 ...
  • applyDefaultStyles: true,//應用預設樣式 scrollToBookmarkOnLoad:false,//頁載入時滾動到標簽 showOverflowOnHover:false,//滑鼠移過顯示被隱藏的,只在禁用滾動條時用。 north__closable:false,//可... ...
  • {{ item.com || "--"}} ...
  • Angular自定義表單驗證器 - 怎樣實現“再次輸入密碼”的驗證(兩個controller值相等)(equalTo) ...
  • 核心要點:3D物體碰撞是靠射線檢測,射線與碰撞器相撞獲取對應的碰撞點信息。 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...