且看这段代码,并不符合我们认识的javascript语法,好像在javascript中加载了html(xml),但是它却能(经过babel的解析)正确工作.

  1. class HelloWorld extends React.Component {
  2. render(){
  3. return <div>{msg}</div>
  4. }
  5. }

这种语法我们称为JSX,是一个 JavaScript 的语法扩展。我们建议在 React 中配合使用 JSX,JSX 可以很好地描述 UI 应该呈现出它应有交互的本质形式。JSX 可能会使人联想到模板语言,但它具有 JavaScript 的全部功能。

JSX中嵌入表达式

在JSX中,我们可以在**{}**中书写表达式. 我们列举几种情况,来说明 JSX中的语法规则. JSX应该嵌入js表达式,什么是表达式呢?

表达式是由运算符构成,并运算产生结果的语法结构 .

例子1:
声明变量,没有返回值,无法正确渲染:

  1. class HelloWorld extends React.Component {
  2. render(){
  3. return (
  4. <div>
  5. { var a = 10 }
  6. </div>
  7. )
  8. }
  9. }

直接使用,或者三元表达式,可以正确渲染:

  1. class HelloWorld extends React.Component {
  2. render(){
  3. return (
  4. <div>
  5. { 10 }
  6. </div>
  7. )
  8. }
  9. }
  10. class HelloWorld extends React.Component {
  11. render(){
  12. return (
  13. <div>
  14. { 1>0?10:20 }
  15. </div>
  16. )
  17. }
  18. }

例子2:
直接渲染对象,和直接渲染函数,都会报错:

  1. class HelloWorld extends React.Component {
  2. render(){
  3. return (
  4. <div>
  5. { new Date() }
  6. </div>
  7. )
  8. }
  9. }
  10. class HelloWorld extends React.Component {
  11. render(){
  12. return (
  13. <div>
  14. { ()=>2 }
  15. </div>
  16. )
  17. }
  18. }

image.png
image.png
获得转换后的结果,返回字符串类型,可以正确渲染:

  1. class HelloWorld extends React.Component {
  2. render(){
  3. return (
  4. <div>
  5. { new Date().getTime() }
  6. </div>
  7. )
  8. }
  9. }

例子3:
for循环没有产生结果,所以不是表达式:

  1. class HelloWorld extends React.Component {
  2. render(){
  3. return (
  4. <ul>
  5. for(var i = 0 ; i < 10 ; i ++){
  6. <li>{i}</li>
  7. }
  8. </ul>
  9. )
  10. }
  11. }

如果采用map,本身会返回内容,则可以正确渲染:
这里为了避免报错,key暂且使用下标.

  1. class HelloWorld extends React.Component {
  2. render(){
  3. return (
  4. <ul>
  5. {
  6. Array(10).fill(null).map((item,index)=>(
  7. <li key={index}>{index}</li>
  8. ))
  9. }
  10. </ul>
  11. )
  12. }
  13. }

例子4:
if逻辑判断语句,没有返回内容,则不会正确渲染:

  1. class HelloWorld extends React.Component {
  2. render(){
  3. return (
  4. if(true){
  5. <div>今天好心情!</div>
  6. }else{
  7. <div>今天很生气!</div>
  8. }
  9. )
  10. }
  11. }

三元运算符,会产生结果,可以正确渲染:

  1. class HelloWorld extends React.Component {
  2. render(){
  3. return (
  4. 1>2? (<div>今天好心情!</div>): (<div>今天很生气!</div>)
  5. )
  6. }
  7. }

例子4:
对象渲染,采用forEach对属性进行遍历,因为forEach返回值为undefined,所以无法得到正确结果:

  1. var user = {
  2. name: '张三',
  3. age: 20,
  4. sex: '男'
  5. }
  6. // 直接渲染对象会报错
  7. class HelloWorld extends React.Component {
  8. render(){
  9. return (
  10. <div>
  11. { user }
  12. </div>
  13. )
  14. }
  15. }
  16. // 或者
  17. class HelloWorld extends React.Component {
  18. render(){
  19. return (
  20. <div>
  21. {
  22. Object.keys(user).forEach(item=>{
  23. <p>{item}</p>
  24. })
  25. }
  26. </div>
  27. )
  28. }
  29. }

采用map,可以得到返回值,可以正确渲染:

  1. var user = {
  2. name: '张三',
  3. age: 20,
  4. sex: '男'
  5. }
  6. class HelloWorld extends React.Component {
  7. render(){
  8. return (
  9. <div>
  10. {
  11. Object.keys(user).map(item=>(
  12. <p>{item}</p>
  13. ))
  14. }
  15. </div>
  16. )
  17. }
  18. }

例子5:
数组可以直接渲染:

  1. var arr = [1,2,3,4];
  2. class HelloWorld extends React.Component {
  3. render(){
  4. return (
  5. <div>
  6. { arr }
  7. </div>
  8. )
  9. }
  10. }

JSX的样式

style行内样式:
style是个双{},因为首先需要定义一个js表达式作用域,然后style属性接收一个对象类型.样式名需要转换为驼峰形式.

  1. var arr = [1,2,3,4];
  2. class HelloWorld extends React.Component {
  3. render(){
  4. return (
  5. <div style={{color: 'red',fontSize: '20px'}}>
  6. { arr }
  7. </div>
  8. )
  9. }
  10. }
  11. // 或者
  12. var arr = [1,2,3,4];
  13. var style = {color: 'green',fontSize: '20px'};
  14. class HelloWorld extends React.Component {
  15. render(){
  16. return (
  17. <div style={style}>
  18. { arr }
  19. </div>
  20. )
  21. }
  22. }

class样式:
在JSX中,属性不应该采用关键词,比如class,if,for等,样式应该书写在 className中:

  1. <style>
  2. .danger{
  3. color: red;
  4. }
  5. .large{
  6. font-size: 30px;
  7. }
  8. </style>
  9. class HelloWorld extends React.Component {
  10. render(){
  11. return (
  12. <div className={'danger large'}>
  13. { arr }
  14. </div>
  15. )
  16. }
  17. }

JSX中的注释

  1. // 这种注释是不行的
  2. class HelloWorld extends React.Component {
  3. render(){
  4. return (
  5. <div className={'danger large'}>
  6. // className和class属性是一样的,而且必须是驼峰
  7. { arr }
  8. </div>
  9. )
  10. }
  11. }
  12. // 必须把注释部分变成表达式作用域,再注释
  13. class HelloWorld extends React.Component {
  14. render(){
  15. return (
  16. <div className={'danger large'}>
  17. { /* className和class属性是一样的,而且必须是驼峰 */ }
  18. { arr }
  19. </div>
  20. )
  21. }
  22. }

JSX中的属性
JSX中的属性,必须采用驼峰命名: