持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第23天,点击查看活动详情。
今天主要学习的是react中的JSX,以及DOM的一点知识点。
什么是JSX
JSX是JavaScript的一种语法扩展,并拥有JavaScript的全部功能。
JSX生产React元素,可以将任何的JavaScript表达式封装在花括号里面,然后将其嵌入到JSX中,在编译完成后,JSX表达式就变成了常规的JavaScript对象,这意味着可以在if语句和for循环内部使用JSX,将它赋值给变量,接受它作为参数,并从函数中返回它,利用JSX实现虚拟DOM。
示例:一个简单的JSX语法示例
import React from "react";
class App extends React.Component {
render() {
let name = "张三";
let content = "<span>你好</span>"
return <div className="App">{ name }
<div dangerouslySetInnerHTML={{__html:content}}></div>
</div>;
}
}
export default App;
如何获取DOM
在react中要想获取元素的dom结构:this.refs['name'].innerHTML
import React from "react";
class App extends React.Component {
// 页面初始化后加载数据
componentDidMount() {
console.log(document.getElementById('goods').innerHTML) // 原生js获取
console.log(this.refs['name'].innerHTML)
}
render() {
let name = "张三";
return <div className="App">
<div ref="name">{name}</div>
</div>;
}
}
export default App;
这样写只能获取当前页面的DOM,当引入组件获取组件中元素的DOM的时候就不能使用ref来获取,还是要用原生js来获取,否则会报错:
不过这样获取的话,是没有触发虚拟dom的,性能就会低!这时候就用到react中的一个方法
ReactDom:
import React from "react";
import ReactDom from "react-dom";
import HeaderComponent from "./components/header";
class App extends React.Component {
// 初始化加载数据
componentDidMount() {
// console.log(this.refs["headerText"].innerHTML);
// console.log(document.getElementById('headerText'))
let header = ReactDom.findDOMNode(document.getElementById("headerText"));
console.log(header);
}
render() {
let name = "张三";
return (
<div className="App">
{name}
<HeaderComponent></HeaderComponent>
</div>
);
}
}
export default App;
面试中常涉及到的面试题
虚拟DOM的原理
虚拟dom相当于在js和真实dom中间加了一个缓存,将真实的dom转换成json对象,利用dom diff算法避免了没有必要的dom操作,从而提高性能。
react diff的原理
一个diff函数有两个参数,一个是真实dom,一个是虚拟dom,使用递归对:组件,文本节点,非文本节点,属性做比较,如果相同不更新,如果不相同则更新。
对比子节点:子节点和之前的不同,子节点是一个数组,它们可能改变了顺序,或者数量有所变化,我们很难确定要和虚拟dom哪一个作对比,所以我们要给他设置一个key,如果有key, 就使用key查找子节点(性能高),如果没有key则按照dom类型进行查找(性能低)。
接下来继续学习react的知识点~