react大括号的用法
react里面為什么要使用大括號{}:
認識JSX
JSX是一種JavaScript的語法擴展(eXtension),也在很多地方稱之為JavaScript XML,因為看起就是一段XML語法
它用于描述我們的UI界面,JSX會被解析為ReactRenderObject,所以JSX本質就是JS對象, 所以JSX可以和JavaScript融合在一起使用
JSX其實是將HTML嵌入到JavaScript中的一種結構語法
// JSX本質就是對象,所以其可以作為變量來進行使用 const msg = <h2>Hello World</h2>ReactDOM.render(msg, document.getElementById('app'))React為什么使用JSX
React認為渲染邏輯本質上與其他UI邏輯存在內在耦合
- 比如UI需要綁定事件(button、a元素等等)
- 比如UI中需要展示數據狀態,在某些狀態發生改變時,又需要改變UI
他們之間是密不可分,所以React沒有講標記分離到不同的文件中,而是將它們組合到了一起,這個地方就是組件 (Component)。
書寫規范
嵌入值
JSX使用大括號語法來嵌入值,在大括號中可以書寫的是任意合法的JS變量或合法的JS表達式
變量
- 當變量是Number、String、Array類型時,可以直接顯示 ,當變量是null、undefined、Boolean類型時,內容為空
- 如果希望可以顯示null、undefined、Boolean,那么需要轉成字符串 例如使用toString,String,拼接空字符串
因為undefined和null是無法調用函數的,所以推薦使用拼接空字符串的方式來進行轉換
對于Boolean類型的值,無論值是true還是false,其都不會在界面上進行顯示 對象類型不能作為子元素(not valid as a React child) - JSX會轉換為React.createElement,而其第三個參數children即使當前元素所對應的子元素
- 而children數組中是不可以有對象的,也就是說對象不可以寫在大括號語法中。
react中大括號{}的基本用途:
綁定屬性
普通屬性
{/* 可以使用大括號語法來綁定普通屬性 */} <a href={ this.state.link }>google</a>class
{/*class是js的關鍵字,而JSX本質就是all in js所以為了避免HTML書寫和JS關鍵字沖突JSX為對應的HTML屬性起了別名class -> classNamefor -> htmlFor*/} <h2 className={`titile ${this.state.isActive && 'active'}`}>Lorem</h2>react內聯樣式是花括號應用之一
style
事件綁定
class App extends React.Component {constructor() {super()this.state = {count: 100}}// render方法在編譯后,是通過App組件的實例對象來進行調用的// 所以在render函數中,this的指向是正確的render() {return (<div><button onClick={ this.getCount }>click me</button></div>)}getCount() {// 在React中,對HTML生事件進行了二次封裝// 而HTML原生事件是所有組件都可以調用的// 所以React在封裝HTML原生事件的時候,并不知道具體的調用者// 所以React在執行傳入的原生事件回調的時候,使用了`call(undefined)`// 因此在React中 默認情況下原生HTML事件回調中的this是undefined// 我們在使用的時候,需要對this的指向進行修正console.log(this) // => undefined} }解決方法1 – 使用bind方法
{/*使用bind進行綁定的時候,可以返回一個擁有正確this指向的新函數但是如果在jsx中多次調用同樣函數的時候,需要多次重復使用bind方法來修正this指向 */} <button onClick={ this.getCount.bind(this) }>click me</button> <button onClick={ this.getCount.bind(this) }>click me</button> class App extends React.Component {constructor() {super()this.state = {count: 100}// 我們可以在構造函數中 一次性對某個方法進行this的修正// 但是這就意味著所有的函數都需要在構造器中使用bind方法修正this指向// 而實際開發中,組件內部的函數是很多的,如果都在構造器中修正this指向// 必然會導致構造函數過于繁瑣,不利于維護this.getCount = this.getCount.bind(this)}render() {return (<div><button onClick={ this.getCount }>click me</button><button onClick={ this.getCount }>click me</button></div>)}getCount() {console.log(this.state.count)} }解決方法二 – 使用class field
class App extends React.Component {constructor() {super()this.state = {count: 100}}render() {return (<div>{/* 綁定事件的時候,傳入的其實是對應事件的引用地址 */}<button onClick={ this.getCount }>click me</button></div>)}// 在定義函數的時候,使用class fields定義類的成員變量// 并且在定義函數的時候,使用箭頭函數// 而類中的方法,本質上都是通過類的實例去進行調用的// 所以類的成員變量的上層作用域是App類// 因此在這里, 我們可以獲取正確的this指向getCount = () => {console.log(this.state.count)} }解決方法三 – 使用箭頭函數 — 推薦
class App extends React.Component {constructor() {super()this.state = {count: 100}}render() {return (<div>{/*在調用函數的時候在外層包裹一層箭頭函數1. 如果在事件調用的時候傳入箭頭函數,其上層作用域是render函數,所以擁有正確的this指向2. 在箭頭函數的執行體中,是去調用我們實際需要執行的函數,此時不是引用地址,而是具體的函數調用所以使用這種方法進行事件的綁定 便于我們進行函數參數的傳遞*/}<button onClick={ () => { this.getCount() }}>click me</button></div>)}getCount() {console.log(this.state.count)} }參數傳遞
class App extends React.Component {constructor() {super()this.state = {count: 100}}render() {return (<div><button onClick={ this.handleClick }>click me</button>{/*使用箭頭函數修正this后,默認的事件對象是傳遞給外層的箭頭函數的所以在箭頭函數體中進行函數實際調用的時候,事件對象作為第幾個參數傳入還是不進行傳入就可以由我們自己進行主動控制*/}<button onClick={ e => { this.calcCount(2, e) }}>click me</button></div>)}// 默認情況下,JSX在進行事件綁定的時候,會默認將事件參數傳入// ps: 這個參數并不是原生事件對象,而是React基于原生事件對象二次封裝得到的合成對象// 原生的事件對象位于 e.nativeEventhandleClick(e) {console.log(e)}calcCount(step, e) {console.log(this.state.count * step)console.log(e)} }條件渲染
某些情況下,界面的內容會根據不同的情況顯示不同的內容,或者決定是否渲染某部分內容
模擬v-show
class App extends React.Component {constructor() {super()this.state = {isLogin: true}}render() {return (<div><button onClick={ () => this.changeLoginStatus() }>change login status</button><h2 style={{ display: this.state.isLogin ? 'block' : 'none' }} >登錄成功</h2></div>)}changeLoginStatus() {this.setState({isLogin: !this.state.isLogin})} }列表渲染
在React中,我們可以通過map,filter,slice等一系列的JavaScript函數來幫助我們實現列表渲染
具體參考簡書夏日夜的晚風博客,希望技術平臺都可以是開源平臺,供大家學習討論交流。
https://www.jianshu.com/p/a3cacda534e4
總結
以上是生活随笔為你收集整理的react大括号的用法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SAVI 技术(二)
- 下一篇: IAD,ATA 区别