iiiiiiiiiiice 2022-10-14 20:32 采纳率: 100%
浏览 13
已结题

修改真实dom时,虚拟dom改变了吗?新的虚拟dom到底是依赖于谁生成的?依赖于data?最近刚学习vue,请求指导


<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>基本列表</title>
    <script src="./js/vue.js"></script>
    <script src="./js/jquery-3.6.1.min.js"></script>
</head>
<body>
<div id="root">
    <h2>人员列表</h2>
    <button @click.once="add">添加一个老刘</button>
    <ul>
        <li v-for="(person, index) in persons" :key="index">
            {{person.name}} - {{ person.age }}
            <input type="text" />
        </li>
    </ul>
</div>
<script type="text/javascript">
      
    setTimeout(function() {
        var ele = document.querySelectorAll('li');
        ele[1].innerHTML='王八 - 80 <input type="text" />';
        
    },1000);
    Vue.config.productionTip = false;
    const vm = new Vue({
        el: '#root',
        data: {
            //数组
            persons: [
                {id: '001', name: '张三', age: 18},
                {id: '002', name: '李四', age: 19},
                {id: '003', name: '王五', age: 20}
            ],
            
        },
        methods:{
            add(){
                
                //往数组的头添加元素
                this.persons.unshift({
                    id:'004',
                    name:'老刘',
                    age: 40
                })
            }
        }
    })
</script>
</body>
</html>


img

img

img

vue遍历列表,然后我用定时器修改了一次真实dom,把真实dom中的李四改成了王八,vue中的data没有变,然后我再添加一个对象到vue中的对象数组中,此时真实dom中的王八,依然存在,而且张三消失,李四回到真实dom中,而且data只是多了个老刘,我想知道,修改真实dom时,虚拟dom改变了吗?新的虚拟dom到底是依赖于谁生成的?依赖于data?那为什么新虚拟dom与旧虚拟dom对比,没有把王八给替换掉?最近刚学习vue,请求指导

  • 写回答

2条回答 默认 最新

  • 飞鱼爱吃米 2022-10-15 10:03
    关注

    根据执行顺序来,先执行了定时器,直接修改了视图上面第二个li的内容,所以出现李四被王八替换的情况。
    你页面的li是根据data里面的persons数组作为数据源渲染的,你上面定时器执行的操作并没有更改数据源,所以persons数组还是data中定义的那个没有被改变。
    至于你add方法,使用了数组的unshift方法,该方法会改变原数组,所以你执行添加一个老刘操作的时候persons数组被改变,页面上渲染的persons数组内容也就随之变化。
    vue是MVVM框架,所以页面跟数据挂钩的时候关注的是数据本身,虚拟dom和真实dom的关系重点在于页面的重绘上(也就是视图层),减少未更改的节点渲染耗时。
    可以了解一下vue的设计模式、双向绑定、虚拟dom。
    关于虚拟dom:https://www.cnblogs.com/ldld/p/14037487.html

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 10月25日
  • 已采纳回答 10月17日
  • 创建了问题 10月14日

悬赏问题

  • ¥15 如何能达到用ping0.cc检测成这样?如图
  • ¥15 关于#DMA固件#的问题,请各位专家解答!
  • ¥15 matlab生成的x1图不趋于稳定,之后的图像是稳定的水平线
  • ¥15 请问华为OD岗位的内部职业发展通道都有哪些,以及各个级别晋升的要求
  • ¥20 微信小程序 canvas 问题
  • ¥15 系统 24h2 专业工作站版,浏览文件夹的图库,视频,图片之类的怎样删除?
  • ¥15 怎么把512还原为520格式
  • ¥15 MATLAB的动态模态分解出现错误,以CFX非定常模拟结果为快照
  • ¥15 求高通平台Softsim调试经验
  • ¥15 canal如何实现将mysql多张表(月表)采集入库到目标表中(一张表)?