react与虚拟DOM、JSX

博客介绍了React的相关知识,采用组件化模式和声明式编码,可在React Native中进行移动端开发,使用虚拟DOM和diff算法减少与真实DOM交互。还讲解了虚拟DOM操作页面、与真实DOM的区别,以及JSX的基本用法和小练习,强调了表达式和语句的区分。

1、采用组件化模式、声明式编码,提高开发效率及组件复用率

2、在React Native中可以使用React语法进行移动端开发

3、使用虚拟DOM+diff算法,减少与真实Dom的交互

用虚拟dom操作页面

<!-- 准备好容器 -->
<div id="test"></div>
<!-- 引入react核心库 -->
<script src="../js//react.development.js"></script>
<!-- react-dom 支持react操作DOM -->
<script src="../js/react-dom.development.js"></script>
<!-- babel 用于将jsx转换为js -->
<script src="../js//babel.min.js"></script>
<script type="text/babel">
    const VDOM = <h1>5555555</h1>
    ReactDOM.render(VDOM, document.getElementById('test'))
</script>

虚拟dom和真实dom的区别

<!-- 准备好容器 -->
<div id="test"></div>
<div id="demo"></div>
<!-- 引入react核心库 -->
<script src="../js//react.development.js"></script>
<!-- react-dom 支持react操作DOM -->
<script src="../js/react-dom.development.js"></script>
<!-- babel 用于将jsx转换为js -->
<script src="../js//babel.min.js"></script>
<script type="text/babel">//这里必须使用babel
    // 获取虚拟DOM
    const VDOM = <h1>5555555</h1>
    // 渲染虚拟DOM到页面
    ReactDOM.render(VDOM, document.getElementById('test'))
    // 真实DOM
    const TDOM=document.getElementById('demo')
    console.log('VDOM',VDOM);
    console.log('TDOM',TDOM);
    debugger
    // 关于虚拟DOM
    // 1、本质是object对象
    // 2、虚拟DOM比较轻,真实DOM比较重,因为虚拟DOM是React内部在用,无需真实DOM那么多属性
    // 3、虚拟DOM最终会被React转化为真实DOM,呈现在页面上

jsx一些基本用法

jsx等于js+xml

XML早期用于存储和传输数据

jsx语法规则

1、定义虚拟DOM时不要加引号

2、标签中混入js表达式时要用{}

3、样式的类名指定要用className

4、内联样式,要用style={{key:value}}的形式去写

5、只有一个根标签

6、标签必须闭合

7、标签首字母

(1)若小写字母开头,则将标签转为html中同名元素,若html没有该元素,会报错

(2)若大写字母开头,react会渲染对应组件,若组件没有定义,会报错

<div id="test"></div>
<script src="../js/react.development.js"></script>
<script src="../js/react-dom.development.js"></script>
<script src="../js/babel.min.js"></script>
<script type="text/babel">
    let myId = 55
    let redC = 'red'
    const VDOM = (<div>
        <h4 id={myId}>{myId}</h4>
        <span style={{ color: redC }}>999</span>
        <span className='fdf'>666</span>
        <input type="text" />
    </div>)
    ReactDOM.render(VDOM, document.getElementById('test'))
</script>

jsx小练习:把数组渲染到页面

重点:{里面只能放表达式}

一定注意区分【js语句(代码)】【js表达式】

1、表达式:一个表达式会产生一个值,可以放在任何一个需要值得地方

(1)a

(2)a+b

(3)fn(1)

(4)arr.map()

(5)function test(){}

2、语句(代码)

(1)if(){}

(2)for(){}

(3)switch(){case:xxxx}

<script type="text/babel">
    const data = ['vue', 'react', 'angular']
    const VDOM = (
        <div>
            <h1>前端框架</h1>
            <ul>
                {data.map((num,index)=>{
                    return <li key={index}>{num}</li>
                })}
            </ul>
        </div>
    )
    ReactDOM.render(VDOM, document.getElementById('test'))
</script>

### React 虚拟 DOM 的工作原理及实现方式 #### 1. 虚拟 DOM 的基本概念 虚拟 DOM 是一种轻量级的 JavaScript 对象,它是真实 DOM 的副本。在 React 中,所有的 DOM 更新操作首先会在虚拟 DOM 上完成,随后通过高效的 Diff 算法计算出需要更新的真实 DOM 部分并进行同步[^2]。 #### 2. 虚拟 DOM 的创建 JSX 编译 当开发者使用 JSX 编写组件时,这些 JSX 代码会被 Babel 自动编译为 `React.createElement` 方法调用的形式。例如: ```javascript let element = ( <h1 id="test" className="testClass"> test </h1> ); ``` 上述 JSX 代码会被编译为如下形式: ```javascript let element = React.createElement( "h1", { id: "test", className: "testClass" }, "test" ); ``` 这表明,在底层实现中,JSX 只是一个语法糖,而真正的核心逻辑是由 `React.createElement` 构建虚拟 DOM 节点[^3]。 #### 3. 虚拟 DOM 的更新流程 React 使用双缓冲策略管理界面状态的变化。每当组件的状态或属性发生变化时,React 会重新构建整个组件树对应的虚拟 DOM,并将其之前的虚拟 DOM 进行对比(即 Diff 算法)。Diff 算法的主要目标是以最有效的方式找到两棵虚拟 DOM 树之间的差异[^1]。 以下是虚拟 DOM 更新的核心步骤: - **重建虚拟 DOM**:基于最新的数据结构生成新的虚拟 DOM。 - **执行 Diff 算法**:比较新旧两个虚拟 DOM 树,找出它们之间存在的差异。 - **更新真实 DOM**:仅针对有变化的部分对真实 DOM 进行最小化的修改,从而减少不必要的重绘和回流操作[^5]。 #### 4. 性能优化的关键点 尽管虚拟 DOM 提供了显著的性能优势,但在某些情况下仍需注意潜在的性能瓶颈。为了进一步提升应用效率,可以采取以下措施: - 减少无意义的重新渲染次数,合理使用 `shouldComponentUpdate` 或函数式组件中的 `React.memo` 来控制子组件的更新行为。 - 利用 Immutable 数据结构避免深层对象比较带来的额外开销。 - 合理拆分子组件,使每次更新影响范围尽可能缩小。 --- ### 示例代码展示虚拟 DOM 创建过程 下面展示了如何手动模拟简单的虚拟 DOM 和其更新机制: ```javascript // 手动定义一个简易版的虚拟 DOM 结构 function createVNode(type, props, children) { return { type, props, children }; } // 初始化虚拟 DOM const vdomOld = createVNode("div", {}, [ createVNode("span", {}, ["Hello"]), ]); // 新的虚拟 DOM const vdomNew = createVNode("div", {}, [ createVNode("span", {}, ["World"]), ]); // 模拟 Diff 算法 function simpleDiff(vdomOld, vdomNew) { if (vdomOld.type !== vdomNew.type || vdomOld.props !== vdomNew.props) { console.log("Detected changes in node structure or attributes."); } if (JSON.stringify(vdomOld.children) !== JSON.stringify(vdomNew.children)) { console.log("Children have changed."); } } simpleDiff(vdomOld, vdomNew); // 输出检测到的内容变更信息 ``` 此示例简化了真实的虚拟 DOM 差异检测逻辑,但足以说明其实现思路。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值