JSX的基本使用

1.JSX简介

JSXJavaScript XML的简写,表示了在Javascript代码中写XML(HTML)格式的代码

优势:声明式语法更加直观,与HTML结构相同,降低学习成本,提高开发效率。

1.1 JSX是react的核心内容

注意:JSX 不是标准的 JS 语法,是 JS 的语法扩展。脚手架中内置的 @babel/plugin-transform-react-jsx 包,用来解析该语法。

在这里插入图片描述

1.2 createElement的问题

  • 繁琐不简洁
  • 不直观,无法一眼看出所描述的结构
  • 不优雅,开发体验不好

在这里插入图片描述

1.3 createElement的问题

  • 导入react和reactDOM
// 导入react和react-dom
import React from 'react'
import ReactDOM from 'react-dom'
  • 创建react元素
// 创建元素
const title = <h1 title="哈哈"></h1>
  • 渲染元素
// 渲染元素
ReactDOM.render(title, document.getElementById('root'))

1.4 JSX注意点

  • 只有在脚手架中才能使用jsx语法

    • 因为JSX需要经过babel的编译处理,才能在浏览器中使用。脚手架中已经默认有了这个配置。
  • JSX必须要有一个根节点, <></> <React.Fragment></React.Fragment>

  • 没有子节点的元素可以使用/>结束

  • JSX中语法更接近与JavaScript

    • class =====> className
    • for========> htmlFor
  • JSX可以换行,如果JSX有多行,推荐使用()包裹JSX,防止自动插入分号的bug

2 使用prettier插件格式化react代码

在这里插入图片描述
在这里插入图片描述

// 保存到额时候用使用prettier进行格式化
"editor.formatOnSave": true,
// 不要有分号
"prettier.semi": false,
// 使用单引号
"prettier.singleQuote": true,
// 默认使用prittier作为格式化工具
"editor.defaultFormatter": "esbenp.prettier-vscode",

3 JSX中嵌入JavaScript表达式

在jsx中可以在{}来使用js表达式

  • 基本使用
const name = 'zs'
const age = 18
const title = (
  <h1>
    姓名:{name}, 年龄:{age}
  </h1>
)
  • 可以访问对象的属性
const car = {
    brand: '玛莎拉蒂'
}
const title = (
  <h1>
    汽车:{car.brand}
  </h1>
)
  • 可以访问数组的下标
const friends = ['张三', '李四']
const title = (
  <h1>
    汽车:{friends[1]}
  </h1>
)
  • 可以使用三元运算符
const gender = 18
const title = (
  <h1>
    性别:{age >= 18? '是':'否'}
  </h1>
)
  • 可以调用方法
function sayHi() {
  return '你好'
}
const title = <h1>姓名:{sayHi()}</h1>
  • JSX本身
const span = <span>我是一个span</span>
const title = <h1>盒子{span}</h1>
  • JSX中的注释
{/* 这是jsx中的注释 */}   推荐快键键 ctrl + /
  • 不要出现语句,比如if for
    例子:
import ReactDOM from 'react-dom'
const username = '吴签'
const address = '监狱'
const car = {
  brand: '小黄车',
}
const friends = ['罗xx', '吴xx']
const age = 18

const fn = () => {
  return (
    <div>
      <p>你看这面,它又大又宽</p>
      <p>你看这牢,它又大又方</p>
    </div>
  )
}

const element = (
  <div>
    <h1>jsx的表达式</h1>
    <div>姓名:{username + '大碗牢饭'}</div>
    <div>地址:{address}</div>
    <div>车:{car.brand}</div>
    <div>朋友:{friends[0]}</div>
    <div title={car.brand}>喜好:{age > 18 ? '成年' : '未成年'}</div>

    <div>{fn()}</div>
    <hr />

    {/* <div>{for()}</div> */}
  </div>
)

ReactDOM.render(element, document.getElementById('root'))

在这里插入图片描述

4 条件渲染

在react中,一切都是javascript,所以条件渲染完全是通过js来控制的

  • 通过判断if/else控制
const isLoding = false
const loadData = () => {
  if (isLoding) {
    return <div>数据加载中.....</div>
  } else {
    return <div>数据加载完成,此处显示加载后的数据</div>
  }
}

const title = <div>条件渲染:{loadData()}</div>
  • 通过三元运算符控制
const isLoding = false
const loadData = () => {
  return isLoding ? (
    <div>数据加载中.....</div>
  ) : (
    <div>数据加载完成,此处显示加载后的数据</div>
  )
}
  • 逻辑运算符
const isLoding = false
const loadData = () => {
  return isLoding && <div>加载中...</div>
}

const title = <div>条件渲染:{loadData()}</div>

5 列表渲染

经常需要遍历一个数组来重复渲染一段结构。在react中,通过map方法进行列表的渲染。

  • 列表的渲染
const songs = ['温柔', '倔强', '私奔到月球']

const list = songs.map(song => <li>{song}</li>)

const dv = (
  <div>
    <ul>{list}</ul>
  </div>
)
  • 直接在JSX中渲染
const songs = ['温柔', '倔强', '私奔到月球']

const dv = (
  <div>
    <ul>{songs.map(song => <li>{song}</li>)}</ul>
  </div>
)
  • key属性的使用
const dv = (
  <div>
    <ul>
      {songs.map(song => (
        <li key={song}>{song}</li>
      ))}
    </ul>
  </div>
)

注意:列表渲染时应该给重复渲染的元素添加key属性,key属性的值要保证唯一

注意:key值避免使用index下标,因为下标会发生改变

例子:

import ReactDOM from 'react-dom'

const list = [
  { id: 1, name: '大娃', salary: 15000 },
  { id: 2, name: '二娃', salary: 13800 },
  { id: 3, name: '金刚娃', salary: 5000 },
]
const element = (
  <div>
    <ul>
      {list.map((item) => {
        return (
          <li key={item.id}>
            <h3>班级:{item.name}</h3>
            <p>工资: {item.salary}</p>
          </li>
        )
      })}
    </ul>
  </div>
)

ReactDOM.render(element, document.getElementById('root'))

在这里插入图片描述

6 样式处理

6.1 行内样式-style

import ReactDOM from 'react-dom'

const color = 'red'
const bgColor = 'pink'
// style标签,如果是长度单位,可以使用数字类型,省略px
const element = (
  <div>
    <h1 style={{ backgroundColor: bgColor, width: 400, height: 400 }}>
      通过style控制样式
    </h1>
    <p style={{ color }}>是金子总会花光的</p>
  </div>
)
ReactDOM.render(element, document.getElementById('root'))

在这里插入图片描述

6.2 类名-className

6.2.1 导入css样式文件

index.css

li {
  list-style: none;
}

.skyblue {
  background-color: skyblue;
}

.red {
  color: red;
}
.pink {
  background-color: pink;
}

.box {
  width: 400px;
  height: 400px;
  border: 1px solid #000;
}

import ReactDOM from 'react-dom'
import './index.css'
// style标签,如果是长度单位,可以使用数字类型,省略px
const isRed = true
const element = (
  <div>
    <h1 className={`${isRed ? 'red' : ''} box`}>通过style控制样式</h1>
    {/* <p className="red">是金子总会花光的</p> */}
  </div>
)

ReactDOM.render(element, document.getElementById('root'))

在这里插入图片描述

6.2.2 classname库

classname官网:https://www.npmjs.com/package/classnames
安装方式:
npm install classnames
bower install classnames
yarn add classnames

使用方法:
在这里插入图片描述

import ReactDOM from 'react-dom'
import './index.css'
import classnames from 'classnames'

const isRed = false
const isPink = true

// const classArr = ['box']
// if (isRed) classArr.push('red')
// if (isPink) classArr.push('pink')
// function classNames(obj) {
//   return Object.keys(obj)
//     .filter((key) => obj[key])
//     .join(' ')
// }

const element = (
  <div>
    <h1 className={classnames('box', { red: isRed, pink: isPink })}>
      我是标题
    </h1>
  </div>
)

ReactDOM.render(element, document.getElementById('root'))

在这里插入图片描述

小练习:
在这里插入图片描述
index.css

li {
  list-style: none;
}

.skyblue {
  background-color: skyblue;
}

.red {
  color: red;
}
.pink {
  background-color: pink;
}

.box {
  width: 400px;
  height: 400px;
  border: 1px solid #000;
}

import ReactDOM from 'react-dom'
import './index.css'

const list = [
  { id: 1, name: '刘德华', content: '给我一杯忘情水' },
  { id: 2, name: '五月天', content: '不打扰,是我的温柔' },
  { id: 3, name: '毛不易', content: '像我这样优秀的人' },
]

function render() {
  if (list.length === 0) {
    return <div>暂无数据</div>
  }
  return (
    <div>
      <ul>
        {list.map((item) => (
          <li key={item.id}>
            <h3 className="pink">评论人:{item.name}</h3>
            <p className="skyblue">评论内容:{item.content}</p>
          </li>
        ))}
      </ul>
    </div>
  )
}

ReactDOM.render(render(), document.getElementById('root'))

在这里插入图片描述

7 总结

  • JSX是React的核心内容

  • JSX表示在JS代码中书写HTML结构,是React声明式的体现

  • 使用JSX配合嵌入的JS表达式,条件渲染,列表渲染,可以渲染任意的UI结构

  • 结果使用className和style的方式给JSX添加样式

  • React完全利用JS的语言自身的能力来编写UI,而不是造轮子增强HTML的功能。(对比VUE)

<think>我们参考了多个引用,关于在JSX使用表达式的方法,可以总结如下: 1. **基本语法**:在JSX中,使用花括号`{}`包裹JavaScript表达式。这允许在JSX中嵌入动态内容。 2. **可嵌入的内容**: - **变量**:可以直接插入字符串、数字等基本类型的变量。 - **函数调用**:可以调用函数,并将返回值嵌入到JSX中。 - **三元运算符**:用于条件渲染,根据条件返回不同的JSX片段。 - **数组方法(如`map`)**:常用于列表渲染,将数组转换为JSX元素数组。注意,每个元素需要一个唯一的`key`属性。 - **逻辑与(`&&`)运算符**:用于条件渲染,当条件为真时渲染某个元素,否则不渲染。 3. **注意事项**: - **JS对象**:一般不能直接在花括号中渲染对象(除了在`style`属性中,因为`style`属性接收一个对象)。尝试渲染对象会导致错误。 - **语句**:不能在花括号中使用语句(如`if`、`for`等),只能使用表达式。因此,条件渲染通常使用三元运算符或逻辑与运算符来实现。 - **JSX自身也是表达式**:可以在花括号中放置JSX表达式。 下面是一个综合示例,展示了在JSX使用表达式的常见方法: ```jsx function App() { // 1. 变量 const name = 'React'; // 2. 函数 const getGreeting = (user) => `Hello, ${user}`; // 3. 条件渲染:三元运算符 const isLoggedIn = true; // 4. 列表数据 const fruits = ['Apple', 'Banana', 'Orange']; // 5. 对象(用于样式) const styleObj = { color: 'red', fontSize: '20px' }; return ( <div> {/* 1. 字符串字面量 */} <p>{'这是一个字符串'}</p> {/* 2. 变量 */} <p>{name}</p> {/* 3. 函数调用 */} <p>{getGreeting('Alice')}</p> {/* 4. 三元运算符 */} <p>{isLoggedIn ? '已登录' : '未登录'}</p> {/* 5. 逻辑与运算符(条件渲染) */} {isLoggedIn && <p>欢迎回来!</p>} {/* 6. 列表渲染(使用map) */} <ul> {fruits.map((fruit, index) => ( <li key={index}>{fruit}</li> ))} </ul> {/* 7. 使用对象(在style属性中) */} <p style={styleObj}>红色字体</p> {/* 8. 注意:不能直接渲染对象(会报错) */} {/* <p>{{ a: 1 }}</p> */} {/* 9. 注意:不能使用语句 */} {/* { if (true) { return <p>正确</p> } } */} </div> ); } export default App; ``` **关键点总结**: - 在JSX中,使用`{}`包裹任意JavaScript表达式。 - 常见的表达式包括:变量、函数调用、三元运算符、数组的`map`方法等。 - 避免在`{}`中直接放置对象(除了`style`属性),也不能使用语句(如`if`、`for`循环等)。 - 列表渲染时,必须为每个元素指定唯一的`key`属性(通常使用数据中的id,如果没有id且数据顺序不会改变,可以使用索引index,但需要注意潜在的性能和渲染问题)[^2][^3][^4]。 通过以上方式,可以在JSX中灵活地使用JavaScript表达式来构建动态的UI。 §§相关问题§§ 1.JSX中,如何渲染一个对象? 2. 为什么列表渲染时需要指定`key`属性?有什么作用? 3.JSX中,如何实现复杂的条件渲染(例如:多个条件)? 4.JSX使用表达式时,有哪些常见的错误需要避免? </think>### 在JSX使用表达式的方法 在JSX中嵌入JavaScript表达式是React的核心特性之一,主要通过花括号`{}`实现。以下是关键方法和注意事项: #### 一、基本使用方法 1. **变量渲染** 直接插入变量名: ```jsx const name = 'React'; return <h1>Hello, {name}!</h1>; // 输出:Hello, React! ``` 2. **函数调用** 调用函数获取返回值: ```jsx const getTime = () => new Date().toLocaleTimeString(); return <p>当前时间: {getTime()}</p>; // 输出:当前时间: 14:30:45 ``` 3. **三元运算符(条件渲染)** 简化if-else逻辑: ```jsx const isAdmin = true; return <div>{isAdmin ? '管理员面板' : '普通用户面板'}</div>; ``` 4. **逻辑与运算符(`&&`)** 条件成立时渲染元素: ```jsx const hasNotification = true; return <div>{hasNotification && <p>有新消息!</p>}</div>; ``` 5. **数组方法(列表渲染)** 使用`map()`渲染列表(必须加`key`): ```jsx const items = ['A', 'B', 'C']; return ( <ul> {items.map((item, index) => <li key={index}>{item}</li> // key用于性能优化 )} </ul> ); ``` #### 二、特殊注意事项 1. **对象渲染限制** 普通对象不能直接渲染(会报错),但可用于`style`属性: ```jsx // ✅ 允许(style属性接收对象) <div style={{ color: 'red', fontSize: 20 }}>文本</div> // ❌ 禁止(直接渲染对象) <p>{{ key: 'value' }}</p> // 错误! ``` 2. **禁止使用语句** `if`/`for`等语句不可出现在`{}`中,需转换为表达式: ```jsx // ❌ 错误示例 {if(true) { return <p>内容</p> }} // ✅ 正确替代(用三元运算符) {condition ? <p>内容</p> : null} ``` 3. **JSX本身也是表达式** JSX可以嵌套在表达式中: ```jsx const renderBlock = () => <div>动态区块</div>; return <section>{renderBlock()}</section>; ``` #### 三、完整示例 ```jsx function App() { const user = { name: "小明", age: 25 }; const scores = [90, 85, 95]; const isVIP = true; return ( <div> {/* 变量渲染 */} <h2>用户: {user.name}</h2> {/* 三元运算符 */} <p>状态: {isVIP ? "VIP会员" : "普通用户"}</p> {/* 函数调用 */} <p>平均分: {calculateAverage(scores)}</p> {/* 列表渲染 */} <ul> {scores.map((score, i) => ( <li key={i}>成绩{i+1}: {score}</li> ))} </ul> {/* 逻辑与运算符 */} {scores.length > 0 && <p>共{scores.length}项成绩</p>} </div> ); } // 辅助函数 function calculateAverage(arr) { return (arr.reduce((a, b) => a + b, 0) / arr.length).toFixed(1); } ``` > 关键原则:**花括号`{}`内只能包含表达式(返回值的代码),不能包含语句(如`if`/`for`)**。当需要复杂逻辑时,应先在组件外计算好值,或在JSX使用三元运算符等表达式实现[^1][^3][^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值