JSX 是一個 JavaScript 的語法擴展,它不是字符串,也不是 HTML。
JSX 可以很好地描述 UI 交互的本質形式,它具有 JavaScript 的全部功能。JSX 可以生成 React “元素”。
基本使用
\src\index.js
- importReactfrom'react'
- importReactDomfrom'react-dom'
- //看上去是HTML,但是實際是JSX
- consttitle=@lt;h1@gt;HelloReact@lt;/h1@gt;
- //調用ReactDom.render方法,傳入jsx和節點對象
- ReactDom.render(title,document.getElementById('root'))
在使用 JSX 時,可以簡單直接的按照 HTML 的規則來使用(你需要牢記它并不是 html ),那么有多行代碼時,需要使用括號 () 包裹。
- importReactfrom'react'
- importReactDomfrom'react-dom'
- //使用括號包裹jsx,可以換行,代碼更加整潔
- consttitle=(
- @lt;div@gt;
- @lt;h1@gt;HelloReact@lt;/h1@gt;
- @lt;span@gt;嘿嘿嘿@lt;/span@gt;
- @lt;/div@gt;
- )
- ReactDom.render(title,document.getElementById('root'))
設置 VS Code 編輯器,讓 JSX 代碼補全:
- 文件--首選項--設置--用戶設置
- 在用戶設置添加
- @quot;emmet.includeLanguages@quot;:{
- @quot;javascript@quot;:@quot;javascriptreact@quot;
- }
如下圖所示:
JSX 表達式
前面說到 JSX 具有 JavaScript 的全部功能,而在具體使用時可以直接套用 HTML 的規則。換句話說,在 HTML 規則里,如何展現 JS 的能力呢?
先來一點簡單的常常甜頭,JSX 中的能夠進行:
- 動態顯示數據 {}
- 調用方法: 自定義 + 內置
- 支持表達式, 支持三元表達式
- 模板字符串
接下來,我們開始搞它:
- importReactfrom'react';
- importReactDOMfrom'react-dom';
- constname='西嶺老濕'
- functionsayHello(){
- return'大家好'
- }
- constobj={
- name:'劉備',
- age:100
- }
- constflag=true
- //請開始你的表演====
- consttitle=(@lt;h2@gt;嘿嘿@lt;/h2@gt;)//JSX本身也是可直接食用的值喲
- constApp=(
- @lt;div@gt;
- {/*注釋在jsx中是這么個熊樣子*/}
- @lt;p@gt;name@lt;/p@gt;{/*這就鴛鴦(原樣)展示了*/}
- @lt;p@gt;{name}@lt;/p@gt;{/*動態獲取變量數據*/}
- @lt;p@gt;{sayHello()}@lt;/p@gt;{/*調用個函數違法嗎?不*/}
- {/*執行原生JS不合理嗎?合理*/}
- @lt;p@gt;{console.log('1111')}@lt;/p@gt;
- @lt;p@gt;{Math.random()}@lt;/p@gt;
- @lt;p@gt;{JSON.stringify(obj)}@lt;/p@gt;
- {/*三元運算讓你吃醋了?沒有*/}
- @lt;p@gt;{flag?'登錄的狀態':'執行登錄'}@lt;/p@gt;
- {/*模板字符下,字符串和變量結婚,可以嗎?可以*/}
- @lt;p@gt;{`hello,${name}`}@lt;/p@gt;
- {/*JSX也是可直接食用的值喲*/}
- @lt;div@gt;{title}@lt;/div@gt;
- @lt;/div@gt;
- )
- ReactDOM.render(App,document.getElementById('root'));
- JSX 本身就一個表達式
- JSX 添加屬性:
字符串屬性,直接使用雙引號包裹
動態屬性,不用雙引號,直接使用 {} class={xxx}
- JSX 添加子元素
JSX 只有一個父元素
- 單標簽必須閉合
- //01jsx本身就是一個表達式
- constnames=@lt;h3@gt;西嶺老濕@lt;/h3@gt;
- //02添加屬性
- constage=99
- //03jsx添加子元素(JSX只有一個父元素)
- //04單標簽必須閉合
- //組件
- functionApp(){
- return(
- //返回中只能有一個JSX塊
- //@lt;p@gt;@lt;/p@gt;//報錯
- @lt;div@gt;
- {/*jsx本身就是一個表達式*/}
- {names}
- {/*添加屬性*/}
- @lt;page=@quot;age@quot;@gt;用戶年齡屬性@lt;/p@gt;{/*字符串屬性*/}
- @lt;page={age}@gt;用戶年齡屬性@lt;/p@gt;{/*動態屬性*/}
- {/*單標簽必須閉合*/}
- {/*@lt;img@gt;*/}{/*報錯*/}
- {/*單標簽正確寫法*/}
- @lt;img/@gt;
- @lt;/div@gt;
- );
- }
- exportdefaultApp;
最后,JSX 最好使用一個小括號 () 包裹。
事件綁定
事件處理函數和事件綁定
- //事件處理函數
- constevent1=function(){
- alert('嘿嘿React')
- }
- functionApp(){
- return(
- @lt;div@gt;
- @lt;h1@gt;事件綁定@lt;/h1@gt;
- {/*事件名使用駝峰法命名、直接使用函數賦值,不是函數調用*/}
- @lt;buttononClick={event1}@gt;你點啊@lt;/button@gt;
- @lt;/div@gt;
- )
- }
- exportdefaultApp
事件傳參
事件處理函數和事件綁定
因為事件綁定需要接收函數本身,作為事件處理,不能直接調用。
- //事件傳參
- constevent1=function(name,age){
- alert(name)
- alert(age)
- }
- functionApp(){
- return(
- @lt;div@gt;
- @lt;h1@gt;事件綁定@lt;/h1@gt;
- {/*因為事件綁定需要接收函數本身,作為事件處理,不能直接調用*/}
- {/*因此傳參需要使用箭頭函數返回事件處理函數,而不能是函數調用*/}
- @lt;buttononClick={()=@gt;{event1('西嶺',16)}}@gt;你點啊@lt;/button@gt;
- @lt;br/@gt;
- {/*或者使用bind等其方式,將函數本身作為返回值傳入*/}
- @lt;buttononClick={event1.bind(null,'嬴政',999)}@gt;你再點一下試試@lt;/button@gt;
- {/*再次強調JSX就是JS擴展,就是JS*/}
- @lt;/div@gt;
- )
- }
- exportdefaultApp
因此傳參需要使用箭頭函數返回事件處理函數,而不能是函數調用,或者使用 bind 等其方式,將函數本身作為返回值傳入。
再次強調 JSX 就是 JS 擴展,就是 JS。
事件對象傳參
01 函數無傳參:
事件對象默認傳入,因此直接在事件處理函數中形參接收即可。
02 箭頭函數傳參:
因為事件對象有默認傳入,而使用箭頭函數時,則需要在箭頭函數中傳入后,再在箭頭函數返回的函數中傳入。
03 bind 等其方式:
將函數本身作為返回值傳入,事件對象默認會添加在最后一個參數中。
無論有無參數傳入,事件對象都不需要寫,事件處理函數按順序接收即可。
- //事件對象傳參
- constevent1=function(ev){
- console.log(ev);
- }
- functionApp(){
- return(
- @lt;div@gt;
- @lt;h1@gt;事件綁定@lt;/h1@gt;
- {/*01函數無傳參*/}
- {/*事件對象默認傳入,因此直接在事件處理函數中形參接收即可*/}
- @lt;buttononClick={event1}@gt;點一下?@lt;/button@gt;@lt;br/@gt;
- {/*02箭頭函數傳參
- 因為事件對象有默認傳入,而使用箭頭函數時,則需要在箭頭函數中傳入后
- 再在箭頭函數返回的函數中傳入*/}
- @lt;buttononClick={(ev)=@gt;{event1(ev,'西嶺',16)}}@gt;你點啊@lt;/button@gt;@lt;br/@gt;
- {/*03bind等其方式
- 將函數本身作為返回值傳入,事件對象默認會添加在最后一個參數中
- 無論有無參數傳入,事件對象都不需要寫,事件處理函數按順序接收即可*/}
- @lt;buttononClick={event1.bind(null)}@gt;你再點一下試試@lt;/button@gt;
- @lt;/div@gt;
- )
- }
- exportdefaultApp
列表渲染
JSX 默認會對數組進行結構,因此可以直接在 JSX 中展示數組的值。
- constitem1=[1,3,5]
- functionApp(){
- return(
- @lt;div@gt;
- {/*JSX默認會對數組進行結構*/}
- @lt;h1@gt;{item1}@lt;/h1@gt;
- @lt;/div@gt;
- )
- }
- exportdefaultApp
同理,如果數組元素值也是 JSX,同樣可以進行直接使用。
- constitem1=[1,3,5]
- constitem2=[
- @lt;p@gt;item1@lt;/p@gt;,
- @lt;p@gt;item1@lt;/p@gt;,
- @lt;p@gt;item1@lt;/p@gt;
- ]
- functionApp(){
- return(
- @lt;div@gt;
- {/*JSX默認會對數組進行結構*/}
- @lt;h1@gt;{item1}@lt;/h1@gt;
- {/*數組值為jsx同樣可以直接使用*/}
- @lt;div@gt;
- {item2}
- @lt;/div@gt;
- @lt;/div@gt;
- )
- }
- exportdefaultApp
而在項目中,大部分獲取到的數組元素是對象數據,要對其進行結構展示,就需要對數組進行循環操作后使用。
- //數組數據
- constarr=[
- {id:1,name:'癡心絕對'},
- {id:2,name:'像我這樣的人'},
- {id:3,name:'南山南'}
- ]
- //===數據遍歷===
- functionloops(){
- vara2=[]
- //循環遍歷數據
- for(vari=0;i@lt;arr.length;i++){
- //將數組內容結構為JSX數組
- a2.push(@lt;h1key={arr[i].id}@gt;{arr[i].name}@lt;/h1@gt;)
- }
- returna2
- }
- functionApp(){
- return(
- @lt;div@gt;
- {/*調用遍歷函數,獲取JSX數組展示*/}
- {loops()}
- @lt;/div@gt;
- )
- }
- exportdefaultApp
這樣的方式因為過于繁瑣,并不推薦使用。
但是,基本思路是不變的,因為 JSX 可以自動結構數組結構,我們只需要將數據的數據遍歷為 JSX 數據形式使用就可以了,因此,我們可以選擇一種更為優雅的遍歷方式map() 函數。
- //數組數據
- constarr=[
- {id:1,name:'絕對癡心'},
- {id:2,name:'像我這樣帥的人'},
- {id:3,name:'南山難'}
- ]
- functionApp(){
- return(
- @lt;div@gt;
- {/*map方法遍歷數組*/}
- {arr.map(item=@gt;@lt;h3@gt;{item.id}--{item.name}@lt;/h3@gt;)}
- @lt;/div@gt;
- )
- }
- exportdefaultApp
樣式設置
內聯樣式
樣式需要以對象形式展示:
- //聲明樣式對象
- conststyles={
- color:'red',
- //樣式的屬性名需要處理,要么
- //font-size:'20px',//直接使用報錯
- fontSize:'30px',//轉大寫√
- 'background-color':'pink'//引號包裹√
- }
- functionApp(){
- return(
- @lt;div@gt;
- {/*內聯樣式需要以對象形式展示*/}
- @lt;h3style={{color:@quot;red@quot;}}@gt;西嶺老濕@lt;/h3@gt;
- @lt;pstyle={styles}@gt;真的很帥@lt;/p@gt;
- @lt;/div@gt;
- )
- }
- exportdefaultApp
外聯樣式
創建對應的 CSS 文件,使用模塊化語法規則引入樣式文件。
創建 CSS 文件 \src\App.css
- body{
- background-color:skyblue;
- color:blue;
- }
- .box{
- font-size:30px;
- }
\src\App.js
- //引入外聯樣式文件
- import'./App.css'
- functionApp(){
- return(
- @lt;div@gt;
- @lt;h3@gt;小藍同學@lt;/h3@gt;
- @lt;pclassName=@quot;box@quot;@gt;胖藍@lt;/p@gt;
- @lt;/div@gt;
- )
- }
- export default App
條件渲染
條件渲染就是函數調用。
- importReactfrom'react'
- importReactDomfrom'react-dom'
- varf=false
- constfun1=()=@gt;{
- if(f){
- return(@lt;h1@gt;哈哈哈哈@lt;/h1@gt;)
- }else{
- return(@lt;h2@gt;嘿嘿@lt;/h2@gt;)
- }
- }
- consttitle=(
- //使用括號,可以換行,代碼更加整潔
- @lt;div@gt;
- {fun1()}
- @lt;/div@gt;
- )
- ReactDom.render(title,document.getElementById('root'))
原文鏈接:https://mp.weixin.qq.com/s/5o7cieCgHXy2dxDHvxLSMA