react入門到進階(一)

来源:http://www.cnblogs.com/firefish1/archive/2017/11/30/7905015.html
-Advertisement-
Play Games

這篇博文主要涉及到初學React時所總結的內容,也是我從最開始的認識React到後面的逐漸深入學習的歷程,而這篇是開始,當然不會是結束。 ...


一、何為react

Facebook在F8會議上首次提出這個概念,一套全新的框架就此誕生。

  • React 不是一個完整的 MVC、MVVM 框架,其只負責 View 層
  • React 跟 Web Components 不衝突
  • React 的特點就是“輕”,數據單向綁定,獨立、小巧、快速、創新
  • 組件化的開發思路,小組件構成大組件,高度可重用

而react則廣泛應用於

  • 複雜場景下的高性能
  • 重用組件庫,組件組合

二、react組件基礎

1、react虛擬dom概念

當一個數據改變時,而你又需要將它實時反應到UI上時,你就需要對DOM進行操作,但是複雜或頻繁的DOM操作通常是性能瓶頸產生的原因,於是我們在app源碼DOM之間加入了虛擬DOM(Virtual DOM)。
所以在React中,render執行的結果得到的並不是真正的DOM節點,結果僅僅是輕量級的JavaScript對象,我們稱之為virtual DOM
虛擬DOM是React的一大亮點,具有batching(批處理)和高效的Diff演算法這讓我們可以無需擔心性能問題而”毫無顧忌”的隨時“刷新”整個頁面,由虛擬 DOM來確保只對界面上真正變化的部分進行實際的DOM操作。如果沒有 Virtual DOM,簡單來說就是直接重置 innerHTML。這樣操作,在一個大型列表所有數據都變了的情況下,還算是合理,但是,當只有一行數據發生變化時,它也需要重置整個 innerHTML,這時候顯然就造成了大量浪費。

2、react組件

先來個小例子看看什麼是react組件,創建一個js文件

import React from 'react';
import ReactDom  from 'react-dom';

export default class ComponentHeader extends React.Component{
  render(){
    return(
      <header>
        <h1>yondu is a good father</h1>
      </header>
    )
  }
}

這個文件就創建了一個名為ComponentHeader 的組件,值得註意的是export default是可以讓這個組件外用。

然後我們在一個項目的入口文件里引用這個組件

var React = require('react');
var ReactDOM = require('react-dom');
import ComponentHeader from './components/header';//組件文件的相對位置

class Index extends React.Component {
    render(){
        return(
            <ComponentHeader/>
        );
    }
}//創建可以用ComponentHeader組件的組件Index
    ReactDOM.render(<Index/>,document.getElementById('example'));//把你創建的組件在id為example的dom中使用

當然在render中,你也可以用一個參數的形式,它的作用是可以用於判斷,例如

var component = <ComponentHeader/>//在render中,就可以直接用component代替<ComponentHeader/>
//所以可以有以下形式
if(ture){
    component = <ComponentHeader/>
}
else{
    component = <ComponentFooter/>
}

以上例子就是創建一個組件然後使用的過程,需要註意的地方是

  • 組件的return函數里返回的html節點只能是一個,如有多個,可以在外麵包一個<div></div>
  • 如果想讓組件外用,加上export default

3、JSX內置表達式

三元表達式是JSX裡面經常使用的一種語法,我們先來看一看

render(){
    var text="不為空";
    return(
        <p>{text == "" ? "內容為空" : "內容為"+text}/p>
    )
}

首先表達式要用{}包裹,然後三元表達式主要是看三元運算符,語法是 條件 ? 結果1 : 結果2;. 這裡你把條件寫在問號(?)的前面後面跟著用冒號(:)分隔的結果1和結果2。滿足條件時結果1否則結果2。

(b == 5) ? a="true" : a="false";

在JSX中用動態綁定時,參數需要用{}包裹,而且外面不需要用引號,例如

render(){
    var bool=true;
    var name="點一下";
    return(
        <input type="button" value={name} disabled={bool}>
    )
}

JSX中的註釋是這樣{/*註釋*/}的形式

4、生命周期

可以利用生命周期函數做到鉤子函數(Hook)的很多功能

  1. 列表項
  2. component instantiated 組件初始化
    • getDefaultProps( ) 獲取預設屬性的生命周期函數
    • getInitialState( ) 獲取初始化State的函數
    • componentWillMount( ) 組件將要載入
    • render( ) 渲染
    • componentDidMount( ) 組件載入完畢(第一次render( )完畢後)
  3. props changed 屬性更改
    • componentWillReceiveProps( )
    • shouldComponentUpdate( )
    • componentWillUpdate( ) 組件將要更新
    • render( )
    • componentDidUpdate( ) 組件更新完畢(第一次render( )完畢,等組件載入完畢)
  4. setState( )
  5. component deleted
    • componentWillUnmount( ) 組件卸載函數 (第一次render( )完畢,等組件更新完畢)

我們可以看看

var React = require('react');
var ReactDOM = require('react-dom');
import ComponentHeader from './components/header';

class Index extends React.Component {
    componentWillMount(){
        //直接寫邏輯
        console.log("Index組件將要載入的時間");
    }
    render(){
        return(
            <ComponentHeader/>
        );
    }
    componentDidMount(){
        //直接寫邏輯
        console.log("Index組件載入完畢的時間");
    }
}
ReactDOM.render(<Index/>,document.getElementById('example'));

生命周期函數的運用如上就可見一斑了。


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

-Advertisement-
Play Games
更多相關文章
  • 上一章我們學習了裝飾者模式,這章LZ帶給大家的是單例模式。 首先單例模式是用來幹嘛的?它是用來實例化一個獨一無二的對象!那這有什麼用處?有一些對象我們只需要一個,比如緩存,線程池等。而事實上,這類對象只能有一個示例,如果製造多個示例,就會導致許多問題產生,比如程式的行為異常,資源使用過量。而單例模式 ...
  • ////發表時間(now) function p(s) { return s < 10 ? '0' + s : s; } var myDate = new Date(); //獲取當前年 var year = myDate.getFullYear(); //獲取當前月 var month = myD ...
  • 原文地址: "簡潔後臺管理模版" 之前給客戶開發一個簡單的後臺管理系統,本來準備套用AdminLTE的,但客戶嫌棄太臃腫,而且又需要有多tab頁面切換,於是從我代碼庫中找到好久前就寫過的管理後臺,根據需求重寫。這是基於jQuery,加上自己編寫基礎樣式,從零搭建起來的框架,在這個輕量級模版的基礎上進 ...
  • 網上找了很多版本嘗試都不行,最後在stackoverflow上找到一個,嘗試完美解決 具體操作步驟如下 1. 安裝jquery npm install jquery 2.安裝 type for jquery npm install -D @types/jquery 3.在組件中使用jquery im ...
  • 1.main.js 2.fs模塊,讀寫文件 3.http請求模塊 4.schedule.js, 任務調度模塊 5.sendQQemail.js,發送QQ郵件模塊 6.先簡單記錄下,以後有空再詳細說明 ...
  • MVVM是一種前端框架模式,框架模式主要是用來管理與組織代碼,在複雜應用中,利用高內聚低耦合的思想,將代碼分離組織到不同部分,每部分都有其關註點和職責,各部分間耦合度低,達到“關註點分離”目的,使整個應用更易管理、維護,每個部分可以單獨更新、替換以及復用,從而達到整個應用的模塊化。 一、概念 MVV ...
  • 在angular中,使用session處理 源碼如下: typescript import { Injectable } from '@angular/core'; import { AES, enc } from 'crypto js'; import { has, isNull, isUndef ...
  • 詳情:http://www.liu12fei08fei.top/ github個人博客綁定單獨阿裡功能變數名稱指南 起源 禁止微信重拍版 給github pages綁定功能變數名稱 獲取github pages的ip地址 配置阿裡雲功能變數名稱並解析(是功能變數名稱就行,是不是阿裡不重要) 配置github pages的custo ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...