分享web开发知识

注册/登录|最近发布|今日推荐

主页 IT知识网页技术软件开发前端开发代码编程运营维护技术分享教程案例
当前位置:首页 > 软件开发

ReactJS虚拟DOM一则例证

发布时间:2023-09-06 02:32责任编辑:郭大石关键词:DOMReact

疑问

https://github.com/ruanyf/react-demos/blob/master/demo08/index.html

在如下代码中的 18 行, 需要将本类中的 方法,进行绑定到this,即当前组件,但是render函数就不需要,为什么呢?

this.handleClick = this.handleClick.bind(this)
 1 <!DOCTYPE html> 2 <html> 3 ??<head> 4 ????<meta charset="UTF-8" /> 5 ????<script src="../build/react.development.js"></script> 6 ????<script src="../build/react-dom.development.js"></script> 7 ????<script src="../build/babel.min.js"></script> 8 ??</head> 9 ??<body>10 ????<div id="example"></div>11 ????<script type="text/babel">12 ??????class LikeButton extends React.Component {13 ????????constructor(props) {14 ??????????super(props)15 ??????????this.state = {16 ????????????liked: false17 ??????????}18 ??????????this.handleClick = this.handleClick.bind(this)19 ????????}20 ????????handleClick(event) {21 ??????????this.setState({ liked: !this.state.liked });22 ????????}23 ????????render() {24 ??????????var text = this.state.liked ? ‘like‘ : ‘haven\‘t liked‘;25 ??????????return (26 ????????????<p onClick={this.handleClick}>27 ??????????????You {text} this. Click to toggle.28 ????????????</p>29 ??????????);30 ????????}31 ??????}32 33 ??????ReactDOM.render(34 ????????<LikeButton />,35 ????????document.getElementById(‘example‘)36 ??????);37 ????</script>38 ??</body>39 </html>

实验

将上行例子中的18行注释后, 运行效果。

 1 <!DOCTYPE html> 2 <html> 3 ??<head> 4 ????<meta charset="UTF-8" /> 5 ????<script src="../build/react.development.js"></script> 6 ????<script src="../build/react-dom.development.js"></script> 7 ????<script src="../build/babel.min.js"></script> 8 ??</head> 9 ??<body>10 ????<div id="example"></div>11 ????<script type="text/babel">12 ??????class LikeButton extends React.Component {13 ????????constructor(props) {14 ??????????super(props)15 ??????????this.state = {16 ????????????liked: false17 ??????????}18 ??????????//this.handleClick = this.handleClick.bind(this)19 ????????}20 ????????handleClick(event) {21 ??????????this.setState({ liked: !this.state.liked });22 ????????}23 ????????render() {24 ??????????var text = this.state.liked ? ‘like‘ : ‘haven\‘t liked‘;25 ??????????return (26 ????????????<p onClick={this.handleClick}>27 ??????????????You {text} this. Click to toggle.28 ????????????</p>29 ??????????);30 ????????}31 ??????}32 33 ??????ReactDOM.render(34 ????????<LikeButton />,35 ????????document.getElementById(‘example‘)36 ??????);37 ????</script>38 ??</body>39 </html>

浏览器运行结果,控制台有报错:

思考

本来以为是 babel把es6翻译成es5特殊要求导致。

最后找到问题根因是,事件处理handler引入的特殊要求, 因为ReactJS使用了 virtual DOM, 生成的组件是虚拟的,并不是页面上真实显示的控件。

对于页面上真实存在的控件, 在事件处理的handler中, 使用this表示控件本身。

例如:

http://www.w3school.com.cn/tiy/t.asp?f=hdom_onclick

第一个输入框中添加click事件, 使用 this.value 获取控件的 当前值。

<html><body>Field1: <input type="text" id="field1" value="Hello World!" ?onclick="alert(this.value)"><br />Field2: <input type="text" id="field2"><br /><br />Click the button below to copy the content of Field1 to Field2.<br /><button onclick="document.getElementById(‘field2‘).value=document.getElementById(‘field1‘).value; alert(this.text)">Copy Text</button></body></html>

 但是 ReactJS设计上, 将UI DOM 和实际上的 virtual DOM进行分离, 实际逻辑在virtual DOM上, 对于本例子, 就是需要将 目标 事件 handler 绑定到 虚拟DOM上。

UI dom上视图组件,调用绑定过this的事件handler。

ReactJS虚拟DOM一则例证

原文地址:https://www.cnblogs.com/lightsong/p/10353181.html

知识推荐

我的编程学习网——分享web前端后端开发技术知识。 垃圾信息处理邮箱 tousu563@163.com 网站地图
icp备案号 闽ICP备2023006418号-8 不良信息举报平台 互联网安全管理备案 Copyright 2023 www.wodecom.cn All Rights Reserved