React基礎——安裝、JSX、組件、生命週期

https://react.docschina.org/docs/hello-world.htmlReact教程

二、基本使用

webpack、Vue中的一、二搭建webpack環境

(1)安裝

npm install --save react react-dom 安裝
react:用於創建組件和虛擬DOM,包括組件的生命週期。
react-dom:將組件和虛擬DOM放到頁面展示,ReactDOM.render()。

(2)導入包

接收的成員名稱必須寫爲React和ReactDOM。

// index.js
import React from 'react'
import ReactDOM from 'react-dom'

(3)創建虛擬DOM元素

參數1:字符串,表示創建的標籤名稱;
參數2:對象(包括null),表示創建元素的屬性節點;
參數(3~N):子節點,包括其它虛擬DOM或文本子節點。

// index.js
const myh1 = React.createElement('h1', { title: '我是h1', id: 'myh1' }, '首頁')
const mydiv = React.createElement('div', null, '外面的div', myh1) // 嵌套h1
/* <div>
  '外面的div'  
  <h1 title="我是h1" id="myh1">首頁</h1>
</div> */

上述方式繁瑣,創建虛擬DOM元素最好的方式是寫html代碼,即JSX。 

(4)渲染虛擬DOM元素

React元素都是不可變的,即當元素被創建後,無法改變其內容或屬性,一個元素代表應用界面在某一時間點的樣子。

參數1:要渲染的虛擬DOM對象
參數2:指定容器的DOM對象

// index.js
ReactDOM.render(mydiv, document.getElementById('app'))

(5)根DOM節點

使用React創建的虛擬DOM元素,會被渲染到這個指定的容器中。用React開發應用時一般只會定義一個根節點。

<!-- index.html -->
<div id="app"></div>

三、JSX簡介

JSX,一種JavaScript的語法擴展,符合XML規範(比HTML嚴格)的JavaScript。推薦在React中使用JSX來描述用戶界面。JSX不是模版語言,它完全是在JavaScript內部實現的,運行時轉爲React.createElement轉爲普通JS對象,不會直接把JSX渲染至頁面上。

可以使用babel來轉換JSX。webpack、Vue中的四搭建babel環境,npm install --save-dev @babel/preset-react,webpack.config.js中的test:/\.js$/改爲test:/\.js|.jsx$/,.babelrc中增加"presets": ["@babel/preset-react"]

注意:
(1)書寫JSX時一般都會帶上換行和縮進,增強代碼的可讀性。
(2)推薦在JSX代碼的外面擴(),防止分號自動插入的bug。
(3)如果JSX標籤是閉合式的,那麼你需要在結尾處用/>。
(4)React DOM使用camelCase小駝峯命名來定義屬性的名稱,而不是使用HTML的屬性名稱,如class對應className,tabindex對應tabIndex,label的for屬性對應htmlFor。
(5)註釋。推薦使用{/* 註釋 */},對於{// 註釋}後括號要換行
(6)創建DOM時,所有的節點必須有唯一的根元素。

編譯JSX代碼時,遇到<把它當作HTML代碼去編譯,遇到{}把其內部的代碼當作普通JS代碼去編譯。

1、表達式

JSX本身就是一種表達式,因爲編譯後,JSX會被轉化爲普通的JavaScript對象。可以在if或for語句使用、賦值給變量、當作參數傳入、作爲返回值等。

JavaScript表達式:可以任意地在JSX中使用JavaScript表達式,表達式包含在{}中。如2+2,user.firstName,formatName(user)等。{}中可以包含數字、字符串、對象(函數)、JSX元素等,布爾值和undefined不在界面顯示。

let a=10;
let str="Hello World!"
let flag=true;
let ud=undefined;
const h1=<h1>這是h1</h1>
const arr=[ //Warning: Each child in an array or iterator should have a unique "key" prop.
  <h2>這是h2</h2>,
  <h3>這是h3</h3>
]

ReactDOM.render(
  <div>
    {a+5}<hr />
    {str}<hr />
    {flag?'flag爲真':'flag爲假'}<hr />
    {String(ud)}<hr />
    {h1}<hr />
    {arr}
  </div>,
  document.getElementById('app')
);

JSX屬性:使用引號來定義以字符串爲值的屬性,或使用大括號來定義以JavaScript表達式爲值的屬性。

<div tabIndex="0"></div>
<img src={user.avatarUrl} />

例,將普通字符串數組,轉爲JSX數組。

const arrStr=["毛利蘭","柯南"]
const arrJSX=arrStr.map(item=><h3>{item}</h3>) // Warning: Each child in an array or iterator should have a unique "key" prop.

2、防注入攻擊

可以放心地在JSX中使用用戶輸入。React DOM在渲染之前默認會過濾所有傳入的值,所有的內容在渲染之前都被轉換成了字符串,有效防止XSS攻擊。

const title = response.potentiallyMaliciousInput;
// 直接使用是安全的:
const element = <h1>{title}</h1>;

四、組件

組件從概念上看像是函數,它可以接收任意的輸入值(props),返回一個需要在頁面上展示的React元素。

1、定義組件

組件名稱必須以大寫字母開頭。

組件的返回值只能有一個根元素。

(1)使用JavaScript函數

function Welcome(props) {
  return <h1>Hello, {props.name}</h1>;
}

(2)使用ES6 class

class Welcome extends React.Component {
  render() {
    return <h1>Hello, {this.props.name}</h1>;
  }
}

2、組件渲染

當React元素是用戶自定義的組件,它會將JSX屬性(也可以使用...傳遞一個對象,即多個JSX屬性)作爲單個對象傳遞給該組件,這個對象稱爲“props”。props是隻讀的。

// 通過屬性傳值
const element = <Welcome name="Sara" />;
ReactDOM.render(
  element,
  document.getElementById('root')
);

// 或傳遞對象
var obj={
  name:"hsg",
  age:25
}

ReactDOM.render(
  <div>
    <Welcome {...obj}></Welcome>
  </div>,
  document.getElementById('app')
);

3、組合與提取組件

組件可以在它的輸出中引用其它組件,讓我們用同一組件來抽象出任意層次的細節。在React應用中,按鈕、表單、對話框、整個屏幕的內容等通常都被表示爲組件。

可以將組件切分爲更小的組件,便於複用。

function App() {
  return (
    <div>
      <Welcome name="Sara" />
      <Welcome name="Cahal" />
      <Welcome name="Edite" />
    </div>
  );
}

4、將組件封裝爲.jsx文件

注意使用babel轉換.jsx

// Welcome.jsx
import React from 'react'

export default function Welcome(props){
  return <h1>Hello! {props.name}</h1>
}

// index.js
import Welcome from './components/Welcome.jsx' // 想省略.jsx需配置

五、State&生命週期

使用JS函數定義的組件,是無狀態組件;使用class關鍵字定義的組件,是有狀態組件。“有狀態”即有私有數據(this.state) 和 生命週期函數,運行效率比無狀態組件稍低。

1、

 

React中,把key添加給被forEach或map或for循環直接控制的元素

https://blog.csdn.net/yaocong1993/article/details/83119256#%E5%85%AB%E3%80%81%E5%88%97%E8%A1%A8%E6%B8%B2%E6%9F%93v-for%E5%92%8Ckey%E5%B1%9E%E6%80%A7

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章