React基础-JSX

一、React组件

React组件就是我们所说的React类组件或函数式组件

App - React组件(类、函数)

二、React元素

React元素指的是React组件实例化的对象

<App> - React元素(JSX元素)

三、JSX

什么是JSX?

JSX = JavaScript XML,这是React官方发明的一种JS语法(糖)

浏览器默认是不支持JSX的,所以jsx语法必须使用@babel/preset-react进行编译,编译的结果React.createElement()这种Api的代码。

示例:<div>Hello</div> ==>@babel/preset-react==> React.createElement('div',{},'Hello')

在React开发中,JSX语法是可选的(也就是你可以不使用JSX)。如果不使用JSX语法,React组件代码将变得特别麻烦(难以维护)。所以几乎所有React开发都用的是JSX语法。

JSX元素是变量,是对象(引用数据类型),它不是HTML字符串。

通常所说的JSX元素有两种,一种html的元素<div/>,另一种是自定义封装<Button/>

JSX语法中有三个不一样的属性

1.className(相当于html中class属性)

2.htmlFor(相当于html中的for属性)

3.tabIndex(相当于html中的tabindex属性)

JSX语法中新增了三个属性

1、key 渲染一个列表时,或者渲染一个数组时,都要加key,为了让“diff运算”更加高效。

2、 ref 用于快速地访问DOM对象或者访问JSX实例对象。

3、dangerouslySetInnerHTML 向JSX节点中插入一段可以参与渲染的HTML字符串(相当于Vue中的v-html)

JSX元素可任意嵌套

可以嵌套哪些内容呢?——基本数据类型、数组、JSX元素、函数调用。被嵌套的变量必须用 {} 包起来。这种{}语法是JSX的语法特色。在JSX中凡是被{}所包裹的东西,我们称之为表达式。

如果嵌套的变量是字符串、数值类型,JSX会把它们当作文本进行渲染。(v-text)

如果嵌套的变量是undefined、null、布尔值,JSX会忽略掉它们。

如果嵌套的变量是数组,JSX会把它们当作列表进行渲染(要加key)。(v-for)

如果嵌套的表达式是函数调用,这个函数的返回值必须是JSX支持的变量类型。

如果嵌套的变量是对象,在动态style等特殊语法环境下,是支持的。

ReactElement

也叫做“JSX元素”,例如<div/> <Modal/> 凡是被<>包起来的变量都叫做ReactElement。

ReactNode

也俗称“React节点”,它包括ReactElement、undefined、null、布尔值、string、number、函数调用等。

注意

注意1:JSX的{}中只能放置变量和表达式。{}中可以发生任何“运算”,但“运算”的结果必须返回的是ReactNode。不能返回void、Symbol、BigInt、Map、Set等其它数据类型。它默认具有防注入攻击(XSS)

注意2:建议不要在JSX的{}写JS语句。

注意3:在JSX中添加注释,示例:{/* something */}

当JSX元素的属性是动态变量时,也要用 {} 包起来。(v-bind)

示例1:<div title={}></div>

示例2:<Model footer={} />

动态属性和静态属性

动态属性:你可以理解一个属性的值与声明式变量(state)有关系的。

静态属性:你可以理解一个属性的值与声明式变量无关

JSX是不可变对象。怎么理解“不可变对象”?JSX元素(变量)一旦定义了,就不能再修改

简述声明式变量变化后的更新过程:当this.setState()修改声明式变量时,声明式变量发生变化后,我们更新视图的思路不是直接去修改JSX对象,而是让render()返回一个全新的JSX对象。此时,内存中就有了两个JSX对象(Fiber),React进而对它俩进行“协调”运算(协调运算的过程是可中断的),找出新旧JSX对象中的最小差异(脏节点),然后一次性“提交”更新DOM(不可中断的)。

结论:render()的返回值也是不可变对象。

React组件名的首字母必须大写。

正确示例:const Model = ()=>(<div />) // <Modal/>

正确示例:const model = ()=>(<div />) // { model() }

结论:自己封装React组件,或者使用第三方UI组件库,所有单词的首字母都是大写。

在JSX类型中使用点语法来实例化一个组件(注意模块命名都要首字母大家)

示例:<Qf.Model /> <Qf.Select />

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容