本文不是Vue.js的教程,只是一邊看官網Vue的教程文檔一邊記錄並總結學習過程當中遇到的一些問題和思考的筆記。html
而在Angular裏是能夠支持的,由於angular採用髒檢查的方式實現雙向綁定,vue和avalon都是採用setter和getter實現雙向綁定vue
例,以下代碼在一秒後不會顯示出「xxcanghai」的字樣app
<div id="app"> <h1>{{obj.text}}</h1> </div> <script> var v = new Vue({ el: '#app', data: { obj:{} } }); setTimeout(function(){ v.obj.text="xxcanghai";//無效 },1000); </script>
若給定初始值,則可生效,以下:函數
<div id="app"> <h1>{{obj.text}}</h1> </div> <script> var v = new Vue({ el: '#app', data: { obj:{ text:"default Text" //給定初始值 } } }); setTimeout(function(){ v.obj.text="xxcanghai";//有效 },1000); </script>
不過Vue其中比avalon好的一點是,Vue在只是對初始化時不存在的屬性賦值無效,但顯示是不會報錯的。而avalon則根本沒法顯示,對於上述第一段代碼運行都會報錯(不知道最新的avalon是否修改此問題)學習
好在vue中提供了$set方法來解決這種賦值失敗的問題,以下:測試
<div i<div id="app"> <h1>{{obj.text}}</h1> </div> <script> var v = new Vue({ el: '#app', data: { obj: {} } }); setTimeout(function() { v.$set("obj.text", "xxcanghai");//有效 }, 1000); </script>
雖然這種採用字符串來表示變量名的方式會致使沒法使用強類型的預編譯檢查(TypeScript),但也至少算能解決問題吧。this
以下代碼:當文本框中的value屬性與v-model衝突時會以input的value屬性爲優先,並覆蓋v-model的屬性
最終console.log輸出的也是「inputText」雙向綁定
<div id="app"> <input type="text" v-model="a" value="inputText"> </div> <script> var v = new Vue({ el: '#app', data: { a: "vueText" } }); console.log(v.a);//inputText </script>
對於複選框類型的input上述結論也一樣適用,以下:code
<div id="app"> <input type="checkbox" v-model="isCheck" checked> </div> <script> var v = new Vue({ el: '#app', data: { isCheck: false } }); console.log(v.isCheck);//true </script>
複選框的v-model設定爲false不選中,同時設定checked屬性選中,最終效果爲以checked屬性優先,複選框被選中,同時v.isCheck屬性被改寫爲true。htm
<div id="app"> <button @click="dataFn">1.dataFn</button> <!--輸出:<button>,[MouseEvent]--> <button @click="dataFn()">2.dataFn()</button> <!--輸出:Vue,[]--> <button @click="methodsFn">3.methodsFn</button> <!--輸出:Vue,[MouseEvent]--> <button @click="methodsFn()">4.methodsFn()</button> <!--輸出:Vue,[]--> </div> <script> var vm = new Vue({ el: "#app", data: { dataFn: function() { console.log(this,arguments); } }, methods: { methodsFn: function() { console.log(this,arguments); } } }); //xxcanghai@博客園 </script>
經過上述代碼對比能夠獲得如下結論:
PS:固然你也能夠使用vue內置的$event
來顯示的傳遞event對象,以保證函數寫在任何位置均可以正常使用this和event。
<div id="app"> <button @click="dataFn($event)">5.dataFn($event)</button> <!--輸出:Vue,[MouseEvent]--> <button @click="methodsFn($event)">6.methodsFn($event)</button> <!--輸出:Vue,[MouseEvent]--> </div>