国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

React jsx 語法解析 & 轉(zhuǎn)換原理

這篇具有很好參考價值的文章主要介紹了React jsx 語法解析 & 轉(zhuǎn)換原理。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報違法"按鈕提交疑問。

jsx介紹

jsx是一種JavaScript的語法擴(kuò)展(eXtension),也在很多地方稱之為JavaScript XML,因?yàn)榭雌鹁褪且欢蝀ML語法,用于描述UI界面,并且可以和JavaScript代碼結(jié)合使用。

比起vue中的模板語法,更加靈活,且不需要學(xué)習(xí)模板語法中的特定標(biāo)簽,比如:v-if、v-for、v-bind等,而是直接使用JavaScript語法就可以實(shí)現(xiàn)這些標(biāo)簽的功能。

為何React中編寫UI界面需要使用jsx語法呢?

因?yàn)樵鷋tml和js兩者是密不可分的兩個部分,比如操作html元素時:

  1. 使用js選中元素,然后修改元素;
  2. 元素上綁定有事件時,需要綁定對應(yīng)的事件函數(shù);
  3. js中某些數(shù)據(jù)發(fā)生變化時,需要修改html元素。

索性,React直接將兩者組合在一起進(jìn)行管理。

jsx語法

書寫規(guī)范

  1. 頂層只允許有一個根元素,和vue2類似;
  2. 為了方便閱讀,通常在外層包裹一個 ();
  3. 可以使用單標(biāo)簽和雙標(biāo)簽,但是單標(biāo)簽一定要包含結(jié)束符號,如:<button/>。
// 定義App根組件
class App extends React.Component {
  render() {
	{/* 2.return外層,最好包裹一個() */}
	return (
	  {/* 1.頂層只允許有一個根元素 */}
	  <div>
		  {/* 3.支持單標(biāo)簽和雙標(biāo)簽 */}
		  <h2>h2</h2>
		  <br/>
		</div>
	  </div>
	)
  }
}

基本使用

1.添加注釋

在jsx中,添加注釋使用這樣的格式:

{/* 注釋內(nèi)容 */}

2.使用變量

  1. 當(dāng)變量是Number、String、Array類型時,可以直接顯示
  2. 當(dāng)變量是null、undefined、Boolean類型時,內(nèi)容顯示為空,如果需要顯示,需要轉(zhuǎn)換為字符串;
  3. Object對象類型不能作為子元素(not valid as a React child)
class App extends React.Component {
	constructor() {
	  super()
	  this.state = {
		// Number/String/Array類型
		name: 'easylee',
		age: 18,
		movies: ['xxx', 'xxx'],
	
		// null/undefined/boolean類型
		varNull: null,
		varUndefined: undefined,
		varBoolean: true,
	
		// Object對象
		friends: { name: 'foo' },
	  }
	}
	
	render() {
	  const { name, age, movies } = this.state
	  const { varNull, varUndefined, varBoolean } = this.state
	  const { friends } = this.state
	
	  return (
		<div>
		  {/* 正常顯示 */}
		  <h2>name: {name}</h2>
		  <h2>age: {age}</h2>
		  <h2>movies: {movies}</h2>
	
		  {/* 顯示為空 */}
		  <h2>null: {varNull}</h2>
		  <h2>undefined: {varUndefined}</h2>
		  <h2>Boolean: {varBoolean}</h2>
	
		  {/* 顯示為字符串 */}
		  <h2>null: {varNull + ''}</h2>
		  <h2>undefined: {String(varUndefined)}</h2>
		  <h2>Boolean: {varBoolean.toString()}</h2>
	
		  {/* 對象不允許直接作為子元素,必須具體到對象的屬性 */}
		  {/* <h2>friends: {friends}</h2> */}
		  <h2>friends: {friends.name}</h2>
		</div>
	  )
	}
}
const root = ReactDOM.createRoot(document.querySelector('#root'))
root.render(<App />)

3.使用表達(dá)式

和vue中使用模板語法一樣,只有可以放在 return 后的語句,都是表達(dá)式,可以直接在jsx中使用。

主要包含:

  1. 運(yùn)算表達(dá)式;
  2. 三元表達(dá)式;
  3. 可執(zhí)行函數(shù)。
class App extends React.Component {
	constructor() {
	  super()
	  this.state = {
		firstName: 'easy',
		lastName: 'lee',
		age: 18,
		movies: ['foo', 'bar'],
	  }
	}
	
	getMovies() {
	  return this.state.movies
	}
	
	render() {
	  const { firstName, lastName, age } = this.state
	
	  return (
		<div>
		  {/* 表達(dá)式 */}
		  <h2>{1 + 1}</h2>
		  <h2>{firstName + ' ' + lastName}</h2>
		  <h2>{age >= 18 ? '成年' : '未成年'}</h2>
		  <h2>{this.getMovies()}</h2>
		</div>
	  )
	}
}

4.綁定屬性

給html元素或者組件添加屬性,和直接使用變量類似,都使用{}包裹即可,綁定 classstyle 有一點(diǎn)不同:

  1. 基本屬性,直接綁定即可;
  2. class屬性,需要使用 className 代替 class ,因?yàn)閏lass在js中也表示類;
  3. style屬性,需要傳遞一個對象。
class App extends React.Component {
	constructor() {
	  super()

	  this.state = {
		title: 'title',
		imgUrl: 'http://xxx.xxx.xxx',
		isActive: true,
		objStyle: { color: 'red', fontSize: '20px' },
	  }
	}

	render() {
	  const { title, imgUrl, isActive, objStyle } = this.state
	  const className = `foo ${isActive ? 'active' : ''}`
	  return (
		<div>
		  {/* 基本屬性綁定 */}
		  <h2 title={title}>h2</h2>
		  <img src={imgUrl} />

		  {/* 綁定class屬性 */}
		  <h2 className='className'>h2</h2>

		  {/* 綁定style屬性,objStyle必須是一個對象 */}
		  <h2 style={objStyle}>h2</h2>
		</div>
	  )
	}
}

5.綁定事件

React中綁定事件需要使用小駝峰格式。

class App extends React.Component {
	constructor() {
	  super()

	  this.state = {
		name: 'easylee',
	  }
	}
	btnClick() {
	  console.log('btnClick')
	}
	btnClick2() {
	  this.setState({
		name: 'easy',
	  })
	}
	btnClick3(event, name, age) {
	  console.log(event, name, age)
	}
	render() {
	  return (
		<div>
		  {/* 事件綁定基本使用 */}
		  <button onClick={this.btnClick}>按鈕</button>
		  <button onClick={() => this.btnClick2()}>按鈕</button>
		  <h2>{this.state.name}</h2>

		  {/* 傳遞參數(shù) */}
		  <button onClick={event => this.btnClick3(event, 'easylee', 18)}>按鈕</button>
		</div>
	  )
	}
}

上例代碼中,當(dāng)我們綁定的函數(shù)體內(nèi)部使用了this,傳遞給onClick的函數(shù)需要綁定指定的this,通常有下面幾種方式進(jìn)行綁定,原因和解決方法具體可以看:https://www.cnblogs.com/easy1996/p/17952054。

同時,給綁定函數(shù)傳遞參數(shù)時,onClick會默認(rèn)給綁定的函數(shù)第一個參數(shù)傳遞 event 參數(shù)。

6.條件渲染

jsx中條件渲染可以使用多種方式:

  1. 直接使用JavaScript if進(jìn)行條件判斷;
  2. 使用三元運(yùn)算符;
  3. 使用邏輯運(yùn)算符。
class App extends React.Component {
	constructor() {
	  super()

	  this.state = {
		isOk: true,
		friend: { name: 'foo' },
	  }
	}
	render() {
	  const { isOk, friend } = this.state
	  let showContent = null
	  if (isOk) {
		showContent = <h2>正常</h2>
	  } else {
		showContent = <h2>異常</h2>
	  }

	  return (
		<div>
		  {/* 1.使用if進(jìn)行判斷,注意渲染函數(shù)中不能使用if判斷,應(yīng)該寫在render()外 */}
		  <h2>{showContent}</h2>

		  {/* 2.三元運(yùn)算符 */}
		  <h2>{isOk ? <span>正常</span> : <span>異常</span>}</h2>

		  {/* 3.&&邏輯與判斷,為空或者undefined時,就會默認(rèn)不顯示 */}
		  <h2>{friend && <span>{friend.name}</span>}</h2>
		</div>
	  )
	}
}

7.列表渲染

列表渲染通常使用高階函數(shù),比如 map、filter等,通過前面的介紹,我們知道表達(dá)式可以直接在 {} 中使用,直接使用這些高階函數(shù)即可渲染列表。

class App extends React.Component {
	constructor() {
	  super()

	  this.state = {
		list: [
		  {
			name: 'easylee',
			age: 18,
		  },
		  {
			name: 'foo',
			age: 20,
		  },
		],
	  }
	}
	render() {
	  const { list } = this.state
	  return (
		<ul>
		  {list.map(item => {
			return (
			  <li key={item.name}>
				<h2>name: {item.name}</h2>
				<h2>age: {item.age}</h2>
			  </li>
			)
		  })}
		</ul>
	  )
	}
}

上面代碼中,{} 內(nèi)通過高階函數(shù),獲取到一個 li 元素數(shù)組,然后直接渲染這個數(shù)組,即完成了列表的渲染。

當(dāng)然也可以把高階函數(shù)這塊代碼提取到其它地方或者創(chuàng)建一個函數(shù)專門生成 li 元素數(shù)組。

同時需要注意,和vue一樣,列表元素都需要設(shè)置一個 key ,以提高diff算法時的效率。

jsx轉(zhuǎn)換原理

jsx通過babel進(jìn)行轉(zhuǎn)換,僅僅是一個語法糖,本質(zhì)上,所有的jsx代碼最終都將轉(zhuǎn)換為 React.createElement(type, config, children)函數(shù),這個函數(shù)包含三個參數(shù):

  1. type:當(dāng)前元素的類型,比如div就傳div,組件就傳組件名;
  2. config:當(dāng)前元素的各種屬性,比如class屬性,src屬性等;
  3. children:當(dāng)前元素的下級元素,比如ul下的li,里面又是一個React.createElement(type, config, children)函數(shù),是嵌套的結(jié)構(gòu)。

以這段代碼為例:

class App extends React.Component {
	// ...
	render() {
	  return (
		<div>
		  <div className='header'>Header</div>
		  <ul className='Content'>
			<li>列表數(shù)據(jù)1</li>
			<li>列表數(shù)據(jù)2</li>
		  </ul>
		</div>
	  )
	}
}

render函數(shù)渲染中return的部分,最終會轉(zhuǎn)換為React.createElement函數(shù),直接放到return中,渲染結(jié)果一樣:

render() {
  return React.createElement(
	'div',
	null,
	React.createElement(
	  'div',
	  {
		className: 'header',
	  },
	  'Header',
	),
	React.createElement(
	  'ul',
	  {
		className: 'Content',
	  },
	  React.createElement('li', null, '\u5217\u8868\u6570\u636E1'),
	  React.createElement('li', null, '\u5217\u8868\u6570\u636E2'),
	),
  )
}

這個代碼,可以通過babel在線轉(zhuǎn)換查看:Babel · The compiler for next generation JavaScript

可以直接編寫 React.createElement 來生成UI界面,從而不使用babel轉(zhuǎn)換。

通過上面的 React.createElement 函數(shù),可以創(chuàng)建出一個 ReactElement對象,React利用ReactElement對象組成JavaScript的對象樹,這個對象樹就是虛擬DOM。

編寫jsx代碼,然后調(diào)用createElement函數(shù)創(chuàng)建ReactElement對象,react再經(jīng)過一些處理,最終使用JavaScript的createElement方法,再轉(zhuǎn)換為真實(shí)DOM。文章來源地址http://www.zghlxwxcb.cn/news/detail-776990.html

到了這里,關(guān)于React jsx 語法解析 & 轉(zhuǎn)換原理的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【前端知識】React 基礎(chǔ)鞏固(七)——JSX 的基本語法

    JSX 是一種 JS 的語法擴(kuò)展(extension),也可以稱之為 JavaScript XML,因?yàn)榭雌饋砭褪且欢?XML 語法 它用于描述我們的 UI 界面,并且其可以和 JS 融合在一起使用 它不同于 Vue 中的模塊語法,不需要專門學(xué)習(xí)模塊語法中的指令 React 認(rèn)為 渲染邏輯 本質(zhì)上與 其他UI邏輯 存在內(nèi)在耦合

    2024年02月10日
    瀏覽(68)
  • 初識React: 基礎(chǔ)(概念 特點(diǎn) 高效原因 虛擬DOM JSX語法 組件)

    React是一個由Facebook開源的JavaScript庫,它主要用于構(gòu)建用戶界面。React的特點(diǎn)是使用組件化的思想來構(gòu)建界面,使得代碼的可復(fù)用性和可維護(hù)性大大提高。React還引入了虛擬DOM的概念,減少了對真實(shí)DOM的直接操作,加快了渲染速度。 React使用虛擬DOM,將頁面的渲染操作轉(zhuǎn)化為

    2024年02月14日
    瀏覽(23)
  • React【React是什么?、創(chuàng)建項(xiàng)目 、React組件化、 JSX語法、條件渲染、列表渲染、事件處理】(一)

    React【React是什么?、創(chuàng)建項(xiàng)目 、React組件化、 JSX語法、條件渲染、列表渲染、事件處理】(一)

    ? ? ? ?React是什么? 為什么要學(xué)習(xí)React? React開發(fā)前準(zhǔn)備? 創(chuàng)建React項(xiàng)目?

    2024年02月11日
    瀏覽(23)
  • React源碼解析18(1)------ React.createElement 和 jsx

    React源碼解析18(1)------ React.createElement 和 jsx

    我們知道在React17版本之前,我們在項(xiàng)目中是一定需要引入react的。 import React from “react” 即便我們有時候沒有使用到React,也需要引入。原因是什么呢? 在React項(xiàng)目中,如果我們使用了模板語法JSX,我們知道它要先經(jīng)過babel的轉(zhuǎn)譯。那babel會將JSX轉(zhuǎn)換成什么樣子的格式呢? 可

    2024年02月13日
    瀏覽(21)
  • 【前端知識】React 基礎(chǔ)鞏固(十四)——JSX 的轉(zhuǎn)換過程和聲明式編程

    jsx 僅僅只是 React.createElement(component, props, …children)函數(shù)的語法糖 所有的 jsx 最終都會被轉(zhuǎn)換成 React.createElement 的函數(shù)調(diào)用 createElement 需要傳遞三個參數(shù): type 當(dāng)前 ReactElement 的類型 如果是標(biāo)簽元素,那么就使用字符串表示 “div” 如果是組件元素,那么就直接使用組件的名稱

    2024年02月09日
    瀏覽(53)
  • 面試題-React(三):什么是JSX?它與常規(guī)JavaScript有什么不同?

    面試題-React(三):什么是JSX?它與常規(guī)JavaScript有什么不同?

    在React的世界中,JSX是一項(xiàng)引人注目的技術(shù),它允許開發(fā)者在JavaScript中嵌套類似HTML的標(biāo)簽,用于描述UI組件的結(jié)構(gòu)。本篇博客將通過豐富的代碼示例,深入探索JSX語法,解析其在React中的用法和優(yōu)勢。 一、JSX基礎(chǔ)語法 在React項(xiàng)目中,你會經(jīng)??吹筋愃艸TML的代碼塊,這就是JS

    2024年02月12日
    瀏覽(22)
  • 面試題-React(五):Babel解析JSX的過程?

    在React開發(fā)中,JSX已成為構(gòu)建用戶界面的重要語法。然而,瀏覽器無法直接理解JSX,需要通過Babel等工具將其轉(zhuǎn)換為瀏覽器可執(zhí)行的JavaScript代碼。 一、Babel和AST簡介 Babel是一個廣泛應(yīng)用的JavaScript編譯工具,用于將新版本的JavaScript代碼轉(zhuǎn)換為舊版本的代碼,以確保在不同瀏覽器

    2024年02月11日
    瀏覽(24)
  • 擁抱jsx,開啟vue3用法的另一種選擇??

    擁抱jsx,開啟vue3用法的另一種選擇??

    公司高級表單組件ProForm高階組件都建立在jsx的運(yùn)用配置上,項(xiàng)目在實(shí)踐落地過程中積累了豐富的經(jīng)驗(yàn),也充分感受到了jsx語法的靈活便捷和可維護(hù)性強(qiáng)大,享受到了用其開發(fā)的樂趣,獨(dú)樂樂不如眾樂樂,為了幫助大家更好的運(yùn)用jsx,開發(fā)提效,特此總結(jié)分享。 以往我們開發(fā)

    2024年02月08日
    瀏覽(92)
  • 【React】‘React‘ must be in scope when using JSX react/react-in-jsx-scope

    React 報錯: 意思是在使用 JSX 時,沒有引入 React ,比如像這樣: 在使用 import 引入時,沒有引入 React 。所以在被 Eslint 的 \\\"plugin:react/recommended\\\" 檢查時,就會報錯。 于是很多人就選擇引入的時候加上 React ,這樣 這樣確實(shí)不報錯了,但是他們忽略了一個版本事實(shí): 在 React@17

    2024年02月15日
    瀏覽(22)
  • jsx語法

    ? JSX是一種JavaScript的語法擴(kuò)展(eXtension),也在很多地方稱之為JavaScript XML,因?yàn)榭雌鹁褪且欢蝀ML語法; ? 它用于描述我們的UI界面,并且其完成可以和JavaScript融合在一起使用; ? 它不同于Vue中的模塊語法,你不需要專門學(xué)習(xí)模塊語法中的一些指令(比如v-for、v-if、v-el

    2024年02月15日
    瀏覽(14)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包