玩转Reactjs第二篇-渲染和JSX

2024-03-20 10:18

本文主要是介绍玩转Reactjs第二篇-渲染和JSX,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、前言

前一章我们搭建了Reactjs的标准工程,本章节我们基于标准工程的demo应用,了解react的 渲染和JSX语法。

二、渲染

1、在标准工程的public/index.html下

<div id="root"></div>

该div是我们整个应用的根节点,所有的DOM节点都挂载在该节点下,可以看成web容器。

2、再看src/index.js代码

//1、引入相关包
import React from 'react';
import ReactDOM from 'react-dom';
import './index.css';
import App from './App';
import * as serviceWorker from './serviceWorker';//2、将app定义节点挂载到root节点下
ReactDOM.render(<App />, document.getElementById('root'));// If you want your app to work offline and load faster, you can change
// unregister() to register() below. Note this comes with some pitfalls.
// Learn more about service workers: https://bit.ly/CRA-PWA
serviceWorker.unregister();

(1)、引入相关的组件和包,其中"react","react-dom"是react的基本包,App是应用节点组件。

(2)、ReactDOM.render将App定义的节点挂载到root节点下,root下的所有节点都在React的作用域中。可以类比Vue的入口方法new Vue()。

3、继续看src/App.js

import React from 'react';
import logo from './logo.svg';
import './App.css';function App() {return (<div className="App"><header className="App-header"><img src={logo} className="App-logo" alt="logo" /><p>Edit <code>src/App.js</code> and save to reload.</p><aclassName="App-link"href="https://reactjs.org"target="_blank"rel="noopener noreferrer">Learn React</a></header></div>);
}export default App;

定义App方法然后导出,App方法返回一段类似html的代码段,该代码段最终渲染成如下dom节点

我们看相似度达到99%,DOM结构以及标签相同,但是也有不同的地方

(1)class属性名,在代码段中为className,

(2)img的src的为引用的表达式。

这就是我们接下来要隆重介绍的JSX。

三、什么是JSX

     熟悉Vue的同学知道(后面我们会经常与vue比较,理解两者的异同点),UI和JS是分开的,UI采用的Template模式,对于使用原生态前端的同学更容易掌握。在Reactjs中,一般采用将UI嵌套在js表达式中,即JSX(Javascript XML),虽然从形式上看类似HTML,但是实质上是javascript表达式,是javascript的一种扩展形式。有以下特点:

1、引用表达式

既然JSX是js表达式,那当然可以引用表达式了,比如demo中的img的src的属性值就是使用了表达式,需要注意的是表达式放置在{}中。

可以使用对象表达式,如下面的user

...
const user = {firstName: 'ma',lastName: 'jack'
};function App() {return (<div className="App"><header className="App-header"><img src={logo} className="App-logo" alt="logo" /><p>hello,{user.firstName},Edit <code>src/App.js</code> and save to reload.</p>...</header></div>);
}export default App;

也可以使用函数表达式,如下面的formatName

...
const user = {firstName: 'ma',lastName: 'jack'
};function formatName(user){return user.lastName+" "+user.firstName;
}
function App() {return (<div className="App"><header className="App-header"><img src={logo} className="App-logo" alt="logo" /><p>hello,{formatName(user)},Edit <code>src/App.js</code> and save to reload.</p>....</header></div>);
}

还可以支持三元表达式,但不支持if else,for的条件表达式。

<div><h1>{i == 1 ? 'True!' : 'False'}</h1>
</div>

2、样式

(1)采用className标签设置样式,如demo中,在App.css中定义样式,将文件导入到App.js中,使用className属性调用

(2)内联样式,如下面的style

...
const style={fontSize: 100, color: '#FF0000'
}
function App() {return (<div className="App"><header className="App-header"><img src={logo} className="App-logo" alt="logo" /><p style ={style}>Edit <code>src/App.js</code> and save to reload.</p>...</header></div>);
}

这里样式属性的key值需要使用驼峰命名方式,而不是css的短连接模式。本质上,JSX的内联样式使用的字面量对象,而不是字符串,也可以这样写:

<p style ={{fontSize: 100,  color: '#FF0000'}}>

实际上,除了样式,Reactjs在JSX中实现了一套完整的DOM表达方式,所有的特性和属性都是采用小驼峰命名方式。

四、为什么要用JSX

   如果初学JSX,特别之前使用html,js原生态写前端的同学,非常不习惯将UI与JS糅合在一起的写法。那么为什么Reactjs推荐使用,按照官方说法,总结起来:

  • JSX 执行更快,因为它在编译为 JavaScript 代码后进行了优化。
  • 它是类型安全的,在编译过程中就能发现错误。
  • 使用 JSX 编写模板更加简单快速。

第三点,有点王婆卖瓜,自卖自夸的意思,只能说仁者见仁,智者见智。我们重点看下前两点。

1、JSX执行更快

我们先来看下JSX的编译过程,官网上给了一个如下的例子。

const element = (<h1 className="greeting">Hello, world!</h1>
);

Babel会把 JSX 转译成一个名为 React.createElement() 函数调用

const element = React.createElement('h1',{className: 'greeting'},'Hello, world!'
);

createElement实际上创建一个如下的树型结构,称之为"React元素"

// 注意:这是简化过的结构
const element = {type: 'h1',props: {className: 'greeting',children: 'Hello, world!'}
};

   了解Vue的同学应该很快知道,这就是Vue中所说的Vnode(VUE源码学习第九篇--编译(generate)),他们的原理都是相似的,通过这种React元素,最终构建VDOM,以保持随时更新。

在VUE源码学习第七篇--编译(parse),我们梳理了vue的编译过程:

通过正则匹配对Template进行解析,最终生成render表达式,这个过程是非常耗时的,而JSX本来就是JS,无需这一步,大大提高了编译效率。

2、安全性

     这里主要是说的是XSS(Cross Site Script,跨站脚本攻击),它指的是恶意攻击者往Web页面里插入恶意脚本代码,而程序对于用户输入内容未过滤,当用户浏览该页之时,嵌入其中Web里面的脚本代码会被执行,从而达到恶意攻击用户的特殊目的。

   比如以下面一段

const username = "jack ma";
....
<h1>{username}</h1>

username可以是从某个地方获取的(如input),这里为了简化,直接写死来演示。

有人故意篡改了内容

const username = "<img onerror='alert(\"hi!\")' src='invalid-image' />";

当我们运行应用,此时页面正常显示了这段文字,并没有弹出"hi"。

这是应该Reactjs将所有的内容在渲染之前都被转换成了字符串,这样就有效的防止了XSS。

有同学说,我就是希望转义成html,打印hi,怎么办,可以使用dangerouslySetInnerHTML(类似原生的innerHtml)。

const username =  "<img onerror='alert(\"hi!\")' src='invalid-image' />'}";
...
<h1 ><div dangerouslySetInnerHTML = {{"__html":username}} /></h1>

五、总结

本章节点主要阐述了渲染以及JSX,重点对JSX的语法,以及使用JSX的优势进行了详细介绍。

JSX虽然形式上类似html语法,但实际上是javascript的表达式,是javascript的扩展形式。

JSX的优点在于编译快,安全性高,以及编写速度快。

这篇关于玩转Reactjs第二篇-渲染和JSX的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/829141

相关文章

详解如何在React中执行条件渲染

《详解如何在React中执行条件渲染》在现代Web开发中,React作为一种流行的JavaScript库,为开发者提供了一种高效构建用户界面的方式,条件渲染是React中的一个关键概念,本文将深入探讨... 目录引言什么是条件渲染?基础示例使用逻辑与运算符(&&)使用条件语句列表中的条件渲染总结引言在现代

秒变高手:玩转CentOS 7软件更换的方法大全

在 CentOS 7 中更换软件源可以通过以下步骤完成。更换源可以加快软件包的下载速度,特别是当默认源速度较慢时。以下是详细步骤: 前言 为了帮助您解决在使用CentOS 7安装不了软件速度慢的问题,我们推出了这份由浪浪云赞助的教程——“CentOS7如何更换软件源加快下载速度”。 浪浪云,以他们卓越的弹性计算、云存储和网络服务受到广泛好评,他们的支持和帮助使得我们可以将最前沿的技术知识分

react笔记 8-16 JSX语法 定义数据 数据绑定

1、jsx语法 和vue一样  只能有一个根标签 一行代码写法 return <div>hello world</div> 多行代码返回必须加括号 return (<div><div>hello world</div><div>aaaaaaa</div></div>) 2、定义数据 数据绑定 constructor(){super()this.state={na

OpenGL ES 2.0渲染管线

http://codingnow.cn/opengles/1504.html Opengl es 2.0实现了可编程的图形管线,比起1.x的固定管线要复杂和灵活很多,由两部分规范组成:Opengl es 2.0 API规范和Opengl es着色语言规范。下图是Opengl es 2.0渲染管线,阴影部分是opengl es 2.0的可编程阶段。   1. 顶点着色器(Vert

【ReactJS】通过一个例子学习React组件的生命周期

源代码 <!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta http-equiv="X-UA-Compatible" content="ie=edge"><title>Reac

【ReactJS】困惑于text/babel与browser.js还是babel.js?

使用JSX   使用JSX,可以极大的简化React元素的创建,JSX抽象化了React.createElement()函数的使用,其语法风格类似于HTML语法风格。对比如下代码可以让你更好的理解这一点。 // 使用React.createElement()return React.createElement('div',null,'Hello',this.props.name);//使用J

【ReactJS】React项目构建的几种方式

前言: 构建React项目的几种方式: 构建:create-react-app 快速脚手架构建:generator-react-webpack构建:webpack一步一步构建 1)构建:create-react-app 快速脚手架 FaceBook官方发布了一个无需配置的、用于快速构建开发环境的脚手架工具create-react-app。 creat-react-app优点 无需配置:

全能AI神器!工作效率提升80倍!Zmo.ai带你玩转AI做图!

今天,我要给大家介绍一款神器:Zmo.ai。 这个平台简直是做图神器,集多种功能于一身,让你像专业人士一样轻松创建和编辑图像,不需要任何美术与设计基础,真的非常适合我们这些“手残党”! 我们只需单击按钮即可从文本或图像生成令人惊叹的 AI 艺术、图像、动漫和逼真的照片,最关键的是它的功能真的很全啊! Zmo.ai旗下产品分类: AI照片生成器 AI动漫生成器 AI照片编辑器 A

玩转Python Turtle库,实现满屏飘字的魔法!

前言     本文将教你如何使用Python的Turtle库,通过简单的编程实现满屏飘字的炫酷效果。无需复杂的编程知识,跟着我们的步骤,你也可以成为编程小达人! 效果展示 开发过程 一、准备工作 首先,确保你的电脑上已经安装了Python环境。然后,你需要安装或更新Turtle库(通常Python安装时自带了Turtle库)。 二、编写代码 接下来,我们将通过编写一个简单的P

【Oracle篇】全面理解优化器和SQL语句的解析步骤(含执行计划的详细分析和四种查看方式)(第二篇,总共七篇)

💫《博主介绍》:✨又是一天没白过,我是奈斯,DBA一名✨ 💫《擅长领域》:✌️擅长Oracle、MySQL、SQLserver、阿里云AnalyticDB for MySQL(分布式数据仓库)、Linux,也在扩展大数据方向的知识面✌️ 💖💖💖大佬们都喜欢静静的看文章,并且也会默默的点赞收藏加关注💖💖💖 SQL优化续新篇,第二篇章启幕时。 优化器内藏奥秘,解析SQL步