JSX语法
JSX语法
JSX是什么?
JSX是一种像下面这样的语法:
const element = <h1>Hello, world!</h1>
它是一种JavaScript语法扩展,在React中可以方便地用来描述UI
本质上,JSX为我们提供了创建React元素方法
React.createElement(component, props, ...children)
等价于:
var element = React.createElement( "h1", null, "Hello, world!" )
JSX代表JS对象
JSX本身也是一个表达式,在编译后,JSX表达式会变成普通的JavaScript对象。
你可以在if语句或for循环中使用JSX,你可以将它赋值给变量,你可以将它作为参数接收,你也可以在函数中返回JSX
function getGreeting(user) { if (user) { return <h1>Hello, {formatName(user)}!</h1>; } return <h1>Hello, Stranger.</h1> }
经过babel会变成下面的js代码:
function test(user) { if (user) { return React.createElement("h1", null, "Hello, ", formatStr(user), "!"); }; return React.createElement("h1", null, "Hello, Stranger."); }
在JSX中使用JavaScript表达式十分简单,直接在JSX中将JS表达式用大括号括起来即可。例如:
function formatName(user) { return user.firstName + ' ' + user.lastName; } const user = { firstName: 'Harper', lastName: 'Perez' }; const element = ( <h1>Hello, {formatName(user)}!</h1> ); ReactDOM.render(element, document.getElementById('root'))
在JavaScript中,表达式就是一个短语,JavaScript解释器会将其计算出一个结果,常量就是最简单的一类表达式。常用的表达式有:
需要注意的是,if语句以及for循环不是JavaScript表达式,不能直接作为表达式写在{}中,但可以先将其赋值给一个变量(变量是一个JavaScript表达式)
function NumberDescriber(props) { let description; if (props.number % 2 == 0) { description = <strong>even</strong>; } else { description = <i>odd</i> } return <div>{props.number} is an {description} number</div> }
JSX属性值
你可以使用引号将字符串字面量指定为属性值
const element = <div tabIndex="0"></div>;
或者将一个JavaScript表达式嵌在一个大括号中作为属性值:
const element = <img src={user.avatarUrl}></img>;
上面的代码将编译为:
const element = React.createElement("img", { src: user.avatarUrl });
JSX的Children
首先JSX可以是一个不包含Children的empty tag, 如:
1 | const element = <img src={user.avatarUrl} />; |
JSX也可以像HTML标签一样包含Children:
1 2 3 4 5 6 | const element = ( <div> <h1>Hello!</h1> <h2>Good to see you here.</h2> </div> ) |
tip: React DOM结点使用小驼峰拼写法给属性命名
例如:class写作className, tabindex写作tabIndex
另外关于JSX的children需要注意的是:
React自定义组件的children是不会像固有的HTML标签的子元素那样自动render的,
class Test extends React.Component { render() { return ( <div> Here is a list: <ul> <li>Item 1</li> <li>Item 2</li> </ul> </div> ) } } ReactDOM.render( <Test />, document.getElementById('test') )
参考:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理