开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第2天,点击查看活动详情
该系列文章,是本人在系统复习前端相关知识时,对学习内容提炼、思考、总结的记录。 本人现有知识水平有限,如存在片面和错误的地方,请留言批评指正。
本文思考总结三个方面的知识点:
一、为什么用React,React的优势
二、React的语法基础--JSX语法
三、React组件的三大属性
一、为什么用React,React的优势
Ⅰ、结构更加清晰
React采用
模块化
和组件化
的编程思想, 使页面的组织更加清晰模块: 向外提供特定功能的js程序,一般就是一个js文件
组件: 用来实现局部功能效果的代码和
资源的集合
(html/css/js/img等等)
Ⅱ、更加高效
模块化和组件化
一方面: 模块化和组件化, 提高了代码的复用率, 简化项目编码, 提高运行效率
虚拟DOM和Diffing算法
另一方面:
React使用
虚拟(virtual)DOM
,不总是直接操作页面真实DOM且React的中的
DOM Diffing算法
,可以实现最小化页面重绘
注意
:React并不会提高渲染速度,反而可能会增加渲染时间,真正高效的原因是它能有效减少渲染次数
二、React的语法基础--JSX语法
Ⅰ、JSX定义
JSX定义
:
- JSX是一种JavaScript的语法扩展(eXtension),也在很多地方称之为
JavaScript XML
,因为看起就是一段XML语法
- 它用于描述我们的UI界面,并且其完成可以和JavaScript融合在一起使用
Ⅱ、JSX本质解析
本质
:jsx 仅仅只是 React.createElement(component, props, ...children) 函数的语法糖
,所有的jsx最终都会被转换成React.createElement的函数调用。
createElement函数需要传递
三个参数
, 而jsx的语法规则,其实是与这些规则对应的
- 参数一:type
- 参数二:config
- 参数三:children
Ⅲ、JSX语法规则
1、语法规则
定义虚拟DOM时,不要写引号
标签中混入JS表达式时要用{}
样式的类名指定不要用class,要用
className
内联样式,要用style={{key:value}}的形式(
双{{}}代表对象,单{}代表表达式
)去写
{{ color: 'white' }}
--- value需要加引号
,否则会默认去查找某个变量
{{ fontSize: '29px' }}
--- key需要按照小驼峰的形式书写只有一个根标签(整个虚拟DOM在外层有且仅有一个容器包裹)
标签必须闭合 ---
<input type="text" />
标签首字母
若
小写字母开头
,则将该标签转为html中同名元素,若html中无该标签对应的同名元素,则报错
若
大写字母开头
,react就去渲染对应组件,若组件没有定义,则报错
<style> .title { background-color: orange; width: 200px; } </style> <!-- 准备好一个“容器” --> <div id="test"></div>
const myId = 'aTgUigu' const myData = "HelLo,rEacT" //1.创建虚拟DOM const VDOM = ( <div> <h2 className="title" id={myId.toLocaleLowerCase()}> <span style={{ color: 'white', fontSize: '29px' }}>{myData.toLocaleLowerCase()}</span> </h2> <h2 className="title" id={myId.toLocaleUpperCase()}> <span style={{ color: 'white', fontSize: '29px' }}>{myData.toLocaleLowerCase()}</span> </h2> <input type="text" /> <good>无对应html标签,会报错</good> <Good>无对应组件,会报错</Good> </div> ) //2.渲染虚拟DOM到页面 ReactDOM.render(VDOM, document.getElementById('test'))
2、区分【js语句(代码)
】与【js表达式
】
表达式
:一个表达式会产生一个值,可以放在任何一个需要值的地方下面这些都是表达式
- a
- a+b
- demo(1)
- arr.map()
- function test(){}
语句
:不能放在创建虚拟dom语句中
- if(){}
- for(){}
- switch(){case:xxxx}
三、React组件的三大属性
Ⅰ、三大属性职能理解
React的核心作用是管理页面的交互变化——DOM操作
DOM操作的过程中,需要以下要素:
变化对象
:哪个元素需要发生变化 ----ref
标识需要做哪些变化
:将元素变化的各自信息存储在总站中 ----state
状态管理怎么做到变化的
:将信息变化的具体操作放在自定义的方法中,并传递给操作者 ----props
传递数据
Ⅱ、三大属性使用
1、组件三大属性1 — state
① 理解
- state是组件对象最重要的属性,值是
对象
(可以包含多个key:value
的组合)- 组件被称为
状态机
,通过更新组件的state
来更新对应的页面显示(重新渲染组件
)
② 注意
组件中的render方法中的this为组件实例对象
组件自定义方法中this为undefined,如何解决?
a) 强制绑定this:通过函数对象的bind()
b) 箭头函数
推荐
状态数据,不能直接修改或者更新
2、组件三大属性2 — props
① 理解
- 每个组件对象都会有props(properties的简写)属性
- 组件标签的所有属性都保存在props中
② 作用
- 通过标签属性
从组件外向组件内传递变化的数据
- 注意:组件内部不要修改props数据
3、组件三大属性3 — refs
① 理解
组件内的标签可以定义ref来标识自己
② ref的几种形式:
a、字符串形式的ref(不推荐,将被淘汰
)
字符串形式的ref存在效率问题,不推荐使用
b、回调形式的ref
ref={c => this.input1=c}
相当于将ref当前所处的节点直接挂在了实例自身(
this
)上,并且取了个名字为input1
对于回调函数形式的ref,React将会自动调用该回调函数,并将ref所处的
当前节点作为参数传入回调函数
c、createRef创建ref容器 -- 最推荐的
React.createRef
调用后可以返回一个容器
,该容器可以存储
被ref所标识的节点
,该容器是“专人专用
”的 --- 只能给一个节点用