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