zoukankan      html  css  js  c++  java
  • Vue 源码之 updateStyle

    创建周期和更新周期中,都会用到,以创建周期为例(更新周期的道理是一样的)

    在组件节点嵌套的情况下,从嵌套的最里端开始,每一个组件在创建的时候都会调用。逻辑是先递归收集当前组件子组件style的属性并合并覆盖,在收集当前组件style的属性并合并,在递归收集父组件并合并。

    这样会出现一个问题如下:

    <body>
    <div id="app">
        <shop style="background-color: white">app</shop>
    </div>
    </body>
    <script>
        new Vue ({
            el: '#app',
            components: {
                shop: {
                    template: '<book style="color: blue">shop</book>',
                    components: {
                        book: {
                            template: '<div style="color: brown">book</div>',
                        }
                    }
                }
            },
        })
    </script>

    在上面的代码中,显示的文字是最里层的book,颜色为brown,但是如果shop节点的 style="background-color: white" 这句话去掉,颜色就是blue

    也就是说,一个毫不相关的背景颜色的改动,会影响到字体颜色。

    道理是这样的,组件节点的嵌套中,父组件在最后调用updateStyle,会覆盖之前子组件的updateStyle方法中对真实节点style的更改,style="background-color: white"这句话存在的话,根节点在生成shop节点实例的过程中调用updateStyle方法,依次递归收集book节点和div节点的属性并合并,所以此时是先给color赋值blue,再赋值brown,当然如果此时shop节点的color属性有值,根据上面说的原则,会再进行覆盖,不过这里只有背景颜色,没有字体颜色,所以用的是brown。

    把style="background-color: white"这句话去掉之后,因为shop节点没有staticStyle和style,所以进入updateStyle之后会直接返回,实际上起作用的父节点是book节点,那么先递归调用子节点的brown,再用blue覆盖。

  • 相关阅读:
    属性绑定与双向数据绑定
    vue基础
    tp5提交留言入库
    tp5表单提交
    TP5分页
    TP5模板与数据组合
    vue3.x使用Proxy做双向数据绑定总结
    vue2.x响应式原理总结
    HTML5移动端自适应解决方案
    springMVC实现文件上传
  • 原文地址:https://www.cnblogs.com/chuliang/p/11751386.html
Copyright © 2011-2022 走看看