React (二) 虚拟Dom介绍和非Dom的属性介绍

虚拟Dom介绍和非Dom的属性介绍

  • 虚拟Dom介绍和非Dom的属性介绍
      • 什么是虚拟 Dom(virtual Dom)
  • 非 Dom 属性以及如何使用
      • dangerouslySetInnerHTML
      • ref
      • key

虚拟Dom介绍和非Dom的属性介绍

什么是虚拟 Dom(virtual Dom)

虚拟 Dom 不是真实的 Dom。


class App extends React.Component {render() {return(<div className="App"><h1>Hello world1</h1></div>);}
}

上面是一个类组件,render 执行的结果不是一个真实 Dom,而是一个轻量级的 javascript 的对象。它最终会把 jsx 编译成 js 对象描述的形式如:

{type: "div", // 标签props: [[]] // 属性
}

这种就会称之为虚拟 Dom。React 对虚拟 Dom 做了一些优化,可以进行批处理,底层进行了 diff 算法这些操作。

操作 dom 的成本很高,每次修改 Dom 浏览器都要进行重绘或者重排,使用了虚拟 Dom,可以避免这些问题。

尽可能少的操作dom, 提高渲染效率

会对比dom哪里进行改变了,去单独修改修改了的部分,而不是真的你整个页面的重绘或者重排。

非 Dom 属性以及如何使用

dangerouslySetInnerHTML

dangerouslySetInnerHTML == 原生中 innerHTML

使用 dangerouslySetInnerHTML 要遵循规则

{__html:'

我是插入的html

'
}function App() {const divTitles = "我是react111";return (<div title={divTitles} className="App" tab-index="1"><h1>Hello world</h1><div dangerouslySetInnerHTML={{__html:"

我是插入的html

"
}}></div></div>); }

在网页中插入html,是很容易被xss攻击,在对插入的代码可以做一些转义的处理。

ref

ref == 原生中的id

可以访问到原生或者组件的实例

访问真实Dom

不能在函数组件上使用,可以在类组件上使用,

// 报错
function App() {const divTitles = "我是react111";const userRef = React.createRef();return (<div title={divTitles} className="App" tab-index="1"><h1 ref={userRef}>Hello world</h1></div>);
}// 不报错
class Footer extends React.Component {render() {const userRef = React.createRef();return(<div ref={userRef}><h1>我是一个类组件</h1></div>);}
}

ref 不能在函数组件上使用,但是可以在函数组件内部使用


function Component1(){// 创建一个refconst inputRef = React.createRef();function handClick() {inputRef.current.focus();};return (<div className="App" tab-index="1"><h1> Component1</h1><button onClick={handClick}>我是按钮</button><input type="text" ref={inputRef}></input></div>);
}

上面代码在点击事件之后,可以聚焦到 input 中

key

提高渲染性能,作用是唯一标准。帮助 React 识别那个元素改变了。如果不加 key 在比较 Dom 元素的时候比较范围会比较大,加了 key 值会缩小比较范围,甚至是直接定位到当前 Dom。


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部