React入门 - 07(说一说 JSX 中的语法细节)

这篇具有很好参考价值的文章主要介绍了React入门 - 07(说一说 JSX 中的语法细节)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

本章内容

上一节内容我们完成了一个简单的TodoList案例。到现在为止我们已经知道怎么在 JSX中使用 “js 表达式”和”列表渲染“了,本节我们继续使用之前的工程项目来编写代码,补充在 React使用 JSX语法的一些细节。

1、js 表达式

  • JSX中使用表达式: { JS 表达式 }
  • 可使用的 js表达式有:

字符串、数值、布尔值、null、undefined、数组、对象
函数: add(1, 2)
js运算: 1+2、'abc'.split('') 等
...

  • 注意:if..elseswitch..case等是 js语句,不是表达式,不能出现在 {}
// App.js 文件中,注释之前的代码,换成以下代码,运行并打开浏览器观察显示结果

import React, { Component } from 'react'
class App extends Component {
 constructor(props) {
  super(props)
  this.obj = {name: 'bob', age: 12}
 }

 // 加法
 add(a, b) {
    return a+b
  }
 // 减法
  minus (a, b) { 
    return a-b
  }
  
 render() {
  return (
   <div className="App">
    <p>字符串: { 'str' }</p>
    <p>数值: { 111 }</p>
    <p>布尔值: { true ? 'true': 'false' }</p>
    <p>null{ null }</p>
    <p>undefined{ undefined }</p>
    <p>数组: { [1, 2, 3, 4] }</p>
    <p>对象: { this.obj.name} - {this.obj.age }</p>
    <p>函数:{ this.add(1, 2)}, {this.minus(10, 1)}</p>
    <p>计算: { 1+3333 }</p>
   </div>
  )
 }
  
}
export default App

React入门 - 07(说一说 JSX 中的语法细节),react.js,javascript,前端

2、列表渲染

  • TodoList案例中,我们已经了解到列表的渲染可以使用 map实现。
  • 渲染过程中需要指定 key, 这是 React内部用于性能优化的,我们后面会详细讲一下.
// App.js 文件中,注释之前的代码,换成以下代码,运行并打开浏览器观察显示结果

import React, { Component } from 'react'
 class App extends Component {
 constructor (props) {
  super(props)
  
  this.userList = [
   { name: 'bob', age: 22 },
   { name: 'liii', age: 18 },
   { name: 'mary', age: 19 },
   { name: 'tom', age: 31 }
   ]

   this.lower20List = this.userList.filter(item => item.age < 20)
 }

 render() {
  return (
   <div className="App">
    <p>展示用户列表数据:</p>
    <ul>
     {
      this.userList.map((item, index) => <li>{item.name} --- {item.age}</li>)
     }
    </ul>
 
 
    <p>展示20岁以下的用户数据</p>
    <ul>
     {
      this.lower20List.map((item, index) => <li key={index}>{item.name} --- {item.age}</li>)
     }
    </ul>
   </div>
  )
 }
  
 }
 export default App

React入门 - 07(说一说 JSX 中的语法细节),react.js,javascript,前端

3、条件渲染

官网这里详细介绍了在 JSX中如何进行条件渲染。具体的方式有:

  • 使用 if表达式语句、switch语句
  • 使用三目运算 ( condition ? a : b)
  • 使用 { condition && a }或者 {condtion || a}
// App.js 文件中,注释之前的代码,换成以下代码,运行并打开浏览器观察显示结果

import React, { Component } from 'react'
function ShowScoreMessage(props){ // 注意组件函数的命名需要使用大驼峰方式
 if (props.score < 60) {
  return (
   <div>
    <p>你的分数是: {props.score}</p>
    <div>不及格!!!</div>
   </div>
  )
 } else {
  return (
   <div>
    <p>你的分数是: {props.score}</p>
    <div>及格!!!</div>
   </div>
  )
 }
}

class App extends Component {
 contructor() {
  this.sex = 'male' // 1.1 定义一个性别的变量
  this.score = 99 // 2.1 定义一个score,根据 score 显示不同的提示组件
   this.isEdit = true // 3.1 定义一个isEidt 变量,用于表示当前是否是编辑状态
 }

 render() {
  return (
   <div>
    {/* 1.2 使用三目运算进行条件渲染 */}
    {this.sex==='male' ? ' 我是一个男孩': '我是一个女孩'}
    { false ? <span>this is span</span> : null}

    {/* 2.2 使用 if 语句进行条件渲染 */}
    <ShowScoreMessage score={this.score}></ShowScoreMessage>

    {/* 3.2 使用 && 运算符显示数据 */}
    { this.isEdit && '现在是编辑状态'}
   </div>
  )
 }
}
export default App

React入门 - 07(说一说 JSX 中的语法细节),react.js,javascript,前端

4、className

  • 在传统的前端编程中,如果想给一个 HTML元素添加类名,只需要给其 class属性进行赋值即可

  • 但是在 ReactJSX语法里,如果想给一个 HTML元素赋值类名,必须使用 className。如果使用 class关键字,React 会认为它是 E6中的类。为了避免歧义,React建议我们将 HTML属性 class改写成 className.

  • 当然了,如果你硬要使用 class来添加类名,确实能生效,但是仔细观察会发现浏览器的控制台会有个错误警告

/* App.css 文件*/
.p1 {
  color: #f00;
}

.p2 {
  color: aqua;
}
// App.js 文件中,注释之前的代码,换成以下代码,运行并打开浏览器观察显示结果

import React, { Component } from 'react'
import './App.css'
 class App extends Component {
  render() {
   return (
   <div>
    {/* 你会发现使用 class 也生效,就是控制台会出现错误警告 */}
    <p class="p1">这是一个class 为 p1 的 p元素</p>

    {/* 建议使用 className 来赋值类名 */}
    <p className="p2">这是一个class 为 p2 的 p元素</p>

     {/* 如果的类名是动态的,仍然可以结合jsx 的表达式+条件渲染 */}
    <p className={false ? 'p1' : ''}>这个p元素的类名是动态的</p>
   </div>
   )
  }
 }
 export default App

React入门 - 07(说一说 JSX 中的语法细节),react.js,javascript,前端

5、jsx 中的样式处理

React中的样式处理,一般有三种方式:

  • 第一种方式是直接行内样式绑定
  • 第二种是将样式提取到一个变量中,再将变量绑定到 style属性上(常用)
  • 第三种是动态控制类名,不同类名里定义不同的样式
/* App.css 文件*/
.p1 {
  color: #f00;
}

.p2 {
  color: aqua;
}
import React, { Component } from 'react'
import './App.css'
 class App extends Component {

  constructor(props) {
    super(props)

    this.styleObj = {
      color: '#f00',
      fontSize: '16px'
    }

    this.isP1 = false
  }

  render() {
    return (
      <div>
       {/* 1、行内样式 */}
       <p style={{color: '#0f0', border: '1px solid #ccc'}}>字体绿色,边框1px</p>

       {/* 2、将样式提取到一个变量中,然后赋值变量到 style 属性上 */}
       <p style={this.styleObj}>字体红色, 字号16px</p>

       {/* 3、使用动态类名来控制样式 */}
       <p className={this.isP1 ? 'p1': 'p2'}>类名为p2的样式</p>
      </div>
    )
  }
}
export default App

React入门 - 07(说一说 JSX 中的语法细节),react.js,javascript,前端

6、dangeouslySetInnerHTML

  • 到现在为止,我们知道在 JSX中如果要渲染一个常规的字符串,可以将字符串赋值一个变量,然后直接使用 {}进行渲染。

  • 那现在假设一下,如果这个字符变量里存储的不是普通的字符串,而是一段 HTML,那要怎么才能正确显示这段 HTML呢?

  • 现在我们来实现一个需求:有个字符变量,内容为 <h1>这是一个 h1 标签</h1>, 希望在页面显示的结果是“一级标题”样式的 ”这是一个 h1 标签“,而不是 <h1> 这是一个 h1 标签</h1>

  • React中提供了 dangeouslySetInnerHTML属性,允许将 HTML插入到组件中。相当于 jsinnerHTMLdangeouslySetInnerHTML在使用时必须传递一个对象,该对象具有一个名为__html的属性,该属性包含您要插入到组件中的HTML字符串

  • 但要注意的是,就如同它的命名一样。它是危险的,由于不会转义,就意味着存在 XSS攻击或者其他安全问题

import React, { Component } from 'react'
 class App extends Component {
  constructor(props) {
    super(props)

    this.str = '<h1>这是一个 h1 标签</h1>'
  }
 render() {
  return (
   <div>
    {/* 直接渲染,你会发现界面显示的是: <h1>这是一个 h1 标签</h1>  */}
    {this.str}

    {/* 在 React 中可以使用 dangerouslySetInnerHTML 来实现直接将 HTML 插入到组件中 */}
    <p dangerouslySetInnerHTML={{__html: this.str}}></p>

   </div>
  )
 }
 }
 export default App

React入门 - 07(说一说 JSX 中的语法细节),react.js,javascript,前端

7、htmlFor

  • 需求:有个可以输入姓名的输入框,要求点击”姓名“时,input框也可以获得焦点
  • 传统的做法是,使用 label元素包裹 ”姓名“,然后其for属性绑定inputid属性,这样就可实现点击"姓名"后input框获得焦点
  • 如果我们直接按照传统方式在 React中写,会发现效果虽然实现了,但是控制台会有个错误警告
  • React如果你要使用 labelfor,那么要将 for改写成 htmlFor
<label for="username">姓名</label>
<input id="username" value="bob" name="username" type="text" />
import React, { Component } from 'react'
 class App extends Component {
 render() {
  return (
   <div>
      {/* 功能实现了,但是控制台会出现一个错误警告  */}
      <label for="username">姓名: </label>
      <input id="username" value="bob" name="username" type="text" />

      {/* 在 React 如果你要使用 label的 for ,那么要将 for 改写成 htmlFor */}
      <label htmlFor="username">姓名: </label>
      <input id="username" value="bob" name="username" type="text" />
   </div>
  )
 }
 }
 export default App

React入门 - 07(说一说 JSX 中的语法细节),react.js,javascript,前端

8、使用 jsx 的注意事项

  • JSX必须有一个根节点,如果没有根节点则使用<></>(幽灵节点)或者 Fragment代替根节点
  • 所有标签必须形成闭合,双标签闭合或者单标签闭合都可
  • JSX语法更贴近js语法,属性名采用驼峰命名法,例:className,htmlFor
  • JSX支持多行(换行),如需换行,可使用()包裹

到此,本章内容结束!文章来源地址https://www.toymoban.com/news/detail-797135.html

到了这里,关于React入门 - 07(说一说 JSX 中的语法细节)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • React基本引入和JSX语法

    英文官网: https://reactjs.org/ 中文官网: https://react.docschina.org/ 用于动态构建用户界面的 JavaScript 库(只关注于视图) 由Facebook开源 声明式编码 组件化编码 React Native 编写原生应用 高效(优秀的Diffing算法) 使用虚拟(virtual)DOM, 不总是直接操作页面真实DOM。 DOM Diffing算法, 最小化页面

    2024年02月10日
    浏览(40)
  • React jsx 语法解析 & 转换原理

    jsx是一种JavaScript的语法扩展(eXtension),也在很多地方称之为JavaScript XML,因为看起就是一段XML语法,用于描述UI界面,并且可以和JavaScript代码结合使用。 比起vue中的模板语法,更加灵活,且不需要学习模板语法中的特定标签,比如: v-if 、 v-for 、 v-bind 等,而是直接使用

    2024年02月03日
    浏览(44)
  • React【React是什么?、创建项目 、React组件化、 JSX语法、条件渲染、列表渲染、事件处理】(一)

           React是什么? 为什么要学习React  React开发前准备  创建React项目 

    2024年02月11日
    浏览(52)
  • 【前端知识】React 基础巩固(七)——JSX 的基本语法

    JSX 是一种 JS 的语法扩展(extension),也可以称之为 JavaScript XML,因为看起来就是一段 XML 语法 它用于描述我们的 UI 界面,并且其可以和 JS 融合在一起使用 它不同于 Vue 中的模块语法,不需要专门学习模块语法中的指令 React 认为 渲染逻辑 本质上与 其他UI逻辑 存在内在耦合

    2024年02月10日
    浏览(60)
  • 初识React: 基础(概念 特点 高效原因 虚拟DOM JSX语法 组件)

    React是一个由Facebook开源的JavaScript库,它主要用于构建用户界面。React的特点是使用组件化的思想来构建界面,使得代码的可复用性和可维护性大大提高。React还引入了虚拟DOM的概念,减少了对真实DOM的直接操作,加快了渲染速度。 React使用虚拟DOM,将页面的渲染操作转化为

    2024年02月14日
    浏览(56)
  • 【react从入门到精通】React JSX详解

    ✍创作者:全栈弄潮儿 🏡 个人主页: 全栈弄潮儿的个人主页 🏙️ 个人社区,欢迎你的加入:全栈弄潮儿的个人社区 📙 专栏地址:react从入门到精通 【分享几个国内免费可用的ChatGPT镜像】 【10几个类ChatGPT国内AI大模型】 【用《文心一言》1分钟写一篇博客简直yyds】 【用

    2024年02月05日
    浏览(51)
  • 前端react入门day01-了解react和JSX基础

     (创作不易,感谢有你,你的支持,就是我前行的最大动力,如果看完对你有帮助,请留下您的足迹) 目录 React介绍  React是什么 React的优势  React的市场情况  开发环境搭建  使用create-react-app快速搭建开发环境 尝试运行程序  react基本框架  index.js App.js JSX基础-概念和本质

    2024年02月08日
    浏览(76)
  • 什么是JSX以及在React中的使用

    JSX是一种JavaScript的语法扩展,它是一个看起来很像 XML 的 JavaScript 语法扩展。虽然它看起来像模板语言,但实际上它更接近于JavaScript的语法糖。JSX代码在运行时会被转译为普通的JavaScript对象。 以下是一个简单的JSX示例: 在上述代码中, h1Hello, JSX!/h1 就是一个JSX表达式,它将

    2024年01月21日
    浏览(39)
  • 美团一面:说一说Java中的四种引用类型?

    在JDK1.2之前Java并没有提供软引用、弱引用和虚引用这些高级的引用类型。而是提供了一种基本的引用类型,称为 Reference 。并且当时Java中的对象只有两种状态:被引用和未被引用。当一个对象被引用时,它将一直存在于内存中,直到它不再被任何引用指向时,才会被垃圾回收

    2024年03月22日
    浏览(46)
  • React中的setState使用细节和原理解析

    前面我们有使用过setState的基本使用, 接下来我们对setState使用进行详细的介绍 使用setState的原因 开发中我们并不能直接通过修改state的值来让界面发生更新 : 因为我们修改了state之后,希望React根据最新的State来重新渲染界面,但是 this.state 这种方式的修改React并不知道数据发

    2024年02月03日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包