React学习(七)获取真实的DOM节点

本文介绍了如何在React中利用ref属性获取真实的DOM节点,并解释了为何需要这一操作。此外,还提供了一个示例,展示了如何在点击按钮时使文本输入框获得焦点。
组件并不是真实的 DOM 节点,而是存在于内存之中的一种数据结构,叫做虚拟 DOM (virtual DOM)。只有当它插入文档以后,才会变成真实的 DOM 。根据 React 的设计,所有的 DOM 变动,都先在虚拟 DOM 上发生,然后再将实际发生变动的部分,反映在真实 DOM上,这种算法叫做 DOM diff ,它可以极大提高网页的性能表现。

但是,有时需要从组件获取真实 DOM 的节点,这时就要用到 ref 属性

<html>
  <head>
    <meta charset="UTF-8" />
    <title>Hello React!</title>
    <script src="D:/ReactDom/build/react.min.js"></script>
    <script src="D:/ReactDom/build/react-dom.min.js"></script>
    <script src="D:/ReactDom/build/browser.min.js"></script>
  </head>
   <body>
    <div id="example"></div>
    <script type="text/babel">
var MyComponent = React.createClass({
  handleClick: function() {
    this.refs.myTextInput.focus();
  },
  render: function() {
    return (
      <div>
        <input type="text" ref="myTextInput" />
        <input type="button" value="Focus the text input" onClick={this.handleClick} />
      </div>
    );
  }
});

ReactDOM.render(
  <MyComponent />,
  document.getElementById('example')
);
    </script>
  </body>
</html>
上面代码中,组件 MyComponent 的子节点有一个文本输入框,用于获取用户的输入。这时就必须获取真实的 DOM 节点,虚拟 DOM 是拿不到用户输入的。为了做到这一点,文本输入框必须有一个 ref 属性,然后 this.refs.[refName] 就会返回这个真实的 DOM 节点。
需要注意的是,由于 this.refs.[refName] 属性获取的是真实 DOM ,所以必须等到虚拟 DOM 插入文档以后,才能使用这个属性,否则会报错。上面代码中,通过为组件指定 Click 事件的回调函数,确保了只有等到真实 DOM 发生 Click 事件之后,才会读取 this.refs.[refName] 属性。
React 组件支持很多事件,除了 Click 事件以外,还有 KeyDown 、Copy、Scroll 等,完整的事件清单请查看官方文档。

React里,把JSX转换为HTML DOM节点通常要经历以下步骤: 首先,JSX语法会借助Babel转化成JavaScript代码,以`React.createElement`函数的形式呈现。此函数会返回一个虚拟节点,多个虚拟节点嵌套就构成了虚拟DOM。示例如下: ```jsx // JSX代码 <div> <img src="avatar.png" className="profile" /> <Hello /> </div> // 转换后的代码 React.createElement( "div", null, React.createElement("img", { src: "avatar.png", className: "profile" }), React.createElement(Hello, null) ); ``` `createElement`函数会对`key`和`ref`等特殊的`props`进行处理,获取`defaultProps`来对默认`props`赋值,同时处理传入的子节点,最终构建成一个虚拟DOM对象[^1][^3]。 最后,利用`ReactDOM.render`方法将生成的虚拟DOM渲染到指定容器上,该方法采用了批处理、事务等机制,还针对特定浏览器做了性能优化,最终把虚拟DOM转换为真实的HTML DOM节点。示例代码如下: ```jsx import React from 'react'; import ReactDOM from 'react-dom/client'; // 定义一个简单的组件 function Hello() { return <h1>Hello, World!</h1>; } // JSX代码 const jsxElement = ( <div> <img src="avatar.png" className="profile" /> <Hello /> </div> ); // 获取DOM容器 const root = ReactDOM.createRoot(document.getElementById('root')); // 渲染JSX到DOM容器 root.render(jsxElement); ``` 在上述代码中,先定义了一个简单的组件`Hello`,接着创建了一个包含`img`标签和`Hello`组件的JSX元素`jsxElement`。之后,通过`ReactDOM.createRoot`获取DOM容器,最后使用`root.render`方法将JSX元素渲染到指定的DOM容器中,实现从JSX到HTML DOM节点的转换[^1][^3]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值