發(fā)布于:2021-02-01 15:50:20
0
136
0
在上一篇關(guān)于從頭開始學(xué)習(xí)React的博客文章中,我開始通過ReactJS.org的教程進(jìn)行工作。我通過復(fù)制和粘貼代碼構(gòu)建了我的第一個(gè)應(yīng)用程序……但是它起作用了!今天,我希望了解一些我運(yùn)行的代碼。讓我們開始吧。
這一點(diǎn)我想我明白了。React.Component
是一個(gè)基本組件類,我們創(chuàng)建了一個(gè)擴(kuò)展它的ShoppingList
類。我猜組件需要有一個(gè)render()
方法,它返回一些HTML元素來呈現(xiàn)。這個(gè)創(chuàng)建了一個(gè)帶有className
屬性的——這與HTMLclass
屬性類似嗎?--它包含一個(gè)標(biāo)題(<h1>)和一個(gè)無序列表(<ul>),其中列出了Mark想要購買的所有公司。
我猜,this.props.name
訪問this
的props
變量,我想它引用了ShoppingList
類的實(shí)例。它訪問name
,這是在示例中的類XML標(biāo)記中定義的。如果您可以任意定義這樣的屬性,那么這種語法非???。如果我們不把一個(gè)name
傳給ShoppingList
呢?代碼是否拋出錯(cuò)誤?或者只渲染{this.props.name}
應(yīng)該在的地方?
“當(dāng)我們的數(shù)據(jù)更改時(shí),React將有效地更新和重新呈現(xiàn)我們的組件?!?/span>
所以它是一個(gè)反應(yīng)式編程框架,就像我想的。這是有道理的,因?yàn)樗拿帧?/span>
“這里,ShoppingList是一個(gè)反應(yīng)組件類,或者反應(yīng)組件類型。組件接受名為props
(properties的縮寫)的參數(shù),并通過render
方法返回要顯示的視圖層次結(jié)構(gòu)?!?/span>
這或多或少是我的想法,但我不明白“視圖層次”是什么意思。教程中說,上面的代碼塊看起來很像HTML,也可以寫成:
React.createElement("div", { className: "shopping-list" },
React.createElement("h1", null, "Shopping List for ", props.name),
React.createElement("ul", null,
React.createElement("li", null, "Instagram"),
React.createElement("li", null, "WhatsApp"),
React.createElement("li", null, "Oculus")
)
);
這讓我想起了JavaFX與沒有FXML的區(qū)別。使用FXML構(gòu)建javagui時(shí),標(biāo)記更像XML。如果沒有它,它看起來更像上面的代碼塊,其中的函數(shù)和屬性是使用點(diǎn)(.)操作符訪問的。“API參考中對createElement
進(jìn)行了更詳細(xì)的描述”,教程中說,因此我點(diǎn)擊了該鏈接,希望找到一些規(guī)范的代碼:
文件看起來真不錯(cuò)。很容易理解。I thnik[props]
是屬性列表嗎?但是,當(dāng)我們在上面的代碼塊中使用它時(shí),我們用大括號({className: 'shopping-list'}
)將第二個(gè)參數(shù)發(fā)送到createElement
。當(dāng)我們把[...children]
的變量列表傳遞給createElement
時(shí),它并沒有用大括號括起來。。。我有點(diǎn)糊涂了。也許有兩種名單?一個(gè)是單子,一個(gè)是詞典(或地圖)?
因此,我們可以從較小的組件中逐個(gè)構(gòu)建應(yīng)用程序,在較大的組件中使用它們。下一步是檢查我在上一個(gè)條目中復(fù)制和粘貼的JavaScript代碼:
import React from 'react'; import ReactDOM from 'react-dom'; import './index.css'; class Square extends React.Component { render() { return ( <button className="square"> {/* TODO */} </button> ); } } class Board extends React.Component { renderSquare(i) { return <Square />; } render() { const status = 'Next player: X'; return ( <div> ...
這看起來不言自明。如教程所述,我們有一個(gè)Square
類和一個(gè)Board
類,它們?yōu)閠ic-tac-toe游戲呈現(xiàn)九個(gè)方塊。我猜有些事情還沒完成,我得去編碼了。
……沒錯(cuò)。下一步是填兩個(gè)小東西,我們嘗試一下
renderSquare(i) { return <Square />; }
至
renderSquare(i) { return <Square value={i} /> }
并改變
{/* TO-DO */}
至
{this.props.value}
這將傳遞要在按鈕上呈現(xiàn)的正方形的“值”。我更改此代碼并再次運(yùn)行npm start
。同樣,它需要非常長的時(shí)間來渲染。但它確實(shí)有用。。。
…所以這是一件事。
祝賀你!您剛剛“傳遞了一個(gè)道具”從父級Board到子級Square組件。傳遞道具是信息如何在React應(yīng)用程序中流動(dòng),從父類到子類。
接下來我們要做的是在Square
中的button
中添加一個(gè)onClick
方法,它將打開一個(gè)JavaScriptalert()
框。我在幾年前的JavaScript體驗(yàn)中見過這類東西,所以它們對我來說不是很難。
我們要做的下一件事是用“arrow函數(shù)”替換onClick
函數(shù),因?yàn)樗鼈冿@然是在JavaScript中調(diào)用的。我認(rèn)為大多數(shù)其他編程語言將它們稱為“l(fā)ambda函數(shù)”:
onClick={function() { alert('click'); }}
…變成…
onClick={() => alert('click')}
省去了一點(diǎn)打字。本教程一定要注意,我們需要向onClick
傳遞一個(gè)函數(shù)。如果我們只寫…
onClick={alert('click')}
…然后每次組件重新渲染時(shí)都會(huì)觸發(fā)警報(bào)。這大概不是我們想要的。
接下來,我們將state
添加到Square
類中,這樣它就可以“記住”它是否被點(diǎn)擊了。我認(rèn)為,這類似于大多數(shù)OOP語言中的實(shí)例/成員變量。看起來我們可以在類定義中的constructor
函數(shù)中設(shè)置React對象
class Square extends React.Component { constructor(props) { super(props); this.state = { value: null }; } }
這里有兩件事:
這個(gè)Square
類顯然是用super()
調(diào)用父類的構(gòu)造函數(shù)(React.Component
),將props
傳遞給父類構(gòu)造函數(shù)。
教程實(shí)際上在null
后面有一個(gè)逗號,我假設(shè)它是一個(gè)輸入錯(cuò)誤
在JavaScript類中,定義子類的構(gòu)造函數(shù)時(shí),始終需要調(diào)用super
。所有具有constructor
調(diào)用的React組件類都應(yīng)該以super(props)
調(diào)用開始。
看起來super(props)
在任何子類的constructor
中都是必需的。我想知道它是否一定是構(gòu)造器的第一行,就像Java。。。?上面的摘錄有點(diǎn)模棱兩可。
然后,我們使用setState()
更改button
的onClick
以更改按鈕的狀態(tài),這似乎很簡單。
onClick={() => alert('click')}
更改為
onClick={() => this.setState({value: 'X'})}
這聽起來像是一種被動(dòng)依賴。如果一個(gè)對象更新而其他對象依賴于它,那么這些依賴對象也會(huì)更新。
我要做的最后一件事是安裝React Developer Tools Chrome擴(kuò)展,以便在瀏覽器中檢查我的React代碼:
我已經(jīng)開始明白React是怎么工作的了??吹较耦?、構(gòu)造函數(shù)和lambda函數(shù)這樣熟悉的東西讓我更加自信,這是我能夠很容易學(xué)會(huì)的東西。到目前為止,我基本上只是在類固醇上做了些什么,所以我希望這個(gè)框架能做得更多。我期待著做一些很酷的互動(dòng)網(wǎng)頁!
作者介紹