关于v-model绑定未定义的对象属性的几个细节验证

首先先看下边这段代码

代码1

   <div id="app">
        <div id="my" style="height:20px;width:100px">{{myData.username}}</div>
        <input type="text" v-model="myData.username">
        <button @click="m1">给username属性赋值</button>
    </div>
    <script>
        var vm = new Vue({
            el:'#app',
            data(){
                return {
                    myData:{}
                }
            },
            methods:{
                m1(){
                    this.myData.username='tom'
                }
            }
            
        })
    </script>

id=my的div用插值表达式关联到了myData.username,input用v-model绑定了myData.username,但在data中并没有给myData声明username属性

在浏览器中打开这个页面

情况1 先在input框中输入值,此时发现上边的div中的内容会随着input的输入而发生变化,说明这个属性是响应式的,这个时候在点按钮给myData.username赋值tom,这个属性还是响应式的,div的内容会跟着变。

情况2 页面出来后先点按钮给myData.username属性赋值,这个时候会发现上边div的内容并没有更新,这个时候再给input框输入值上边的div内容也不会变,说明属性username不是响应时的。

通过这两种情况的对比得出结论,在data中没有生命的属性如果后期通过代码添加了该属性,它不是响应式的;但是如果不是通过代码添加了属性,而是用v-model给这个属性赋值,那么这个属性会是响应式的。

代码2

    <div id="app">
        <div style="height:20px;width:100px">{{myData.username}}</div>
        <input type="text" v-model="myData.username">
        <button @click="m1">给整个myData对象重新赋值</button>
    </div>
    <script>
        var vm = new Vue({
            el:'#app',
            data(){
                return {
                    myData:{}
                }
            },
            methods:{
                m1(){
                    this.myData={
                        username:'jerry'
                    }
                }
            }
            
        })
    </script>

这个时候,点击按钮给整个mydata对象重新赋值并添加新属性,该属性是响应式的,上边的div的内容也会跟着变化.

先点按钮还是先在input输入内容对结果没有影响。