在項目時用到了一些插件,好比此次用了下拉菜單插件。javascript
這個插件須要實例化,而下拉框的數據是經過ajax來獲取的,而後在用 v-for 渲染數據,再次遇到了一個問題。html
就是等插件實例化完畢,數據卻還沒渲染完畢,因此這就出現一個bug。出現bug解決掉。vue
第一種解決方法: settimeoutjava
setTimeout(function() { //實例初始化 },100)
可是這種方法有一個缺點,就是不肯定 數據 何時渲染完畢。ios
第一種狀況: 假設10毫秒渲染完畢,可是setTimeout須要等100毫秒,浪費了90毫秒。ajax
第二種狀況:假設數據須要 200 毫秒執行完畢,可是 100毫秒就執行了 實例初始化,BUG又出現了。axios
總而言之這種方法不是咱們想要的,看第二種方法。app
第二種解決方法: watch + vm.nextTickthis
這兩種方法是 vue 的屬性和方法。url
watch: 監聽某一個data數據發生變化就執行方法。
例:
vm = new Vue({ el:'.app', data: { a: '1', }, watch: { a: function() { console.log('a的數據發生變化'+this.a); } } }) vm.a = '2';
data 裏面的a屬性發生了變化變成成了2,就觸發了watch的a方法。console.log(a的數據發生變化2);
nextTich: 在下次 DOM 更新循環結束以後執行延遲迴調。在修改數據以後當即使用這個方法,獲取更新後的 DOM。
例:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <div @click="ceshi()">{{ a }}</div> </body> <script type="text/javascript"> vm = new Vue({ el:'.app', data: { a: '1', }, methods:{ ceshi(){ a = 2; /*DOM還沒更新*/ this.$nextTick(function(){ /*DOM更新了*/ }) } } }) </script> </html>
$nextTick 裏面DOM更新是指頁面上的數據是最新的數據。而不是data的a數據更新了。
知道這兩種屬性以後。咱們開始解決一下BUG吧。
先貼完整代碼:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <setion> <option value="1" v-for="(item,key) in arr" :key="key">{{ item }}</option> </setion> </body> <script type="text/javascript"> vm = new Vue({ el:'.app', data: { arr: [], }, wathc:{ arr: function() { this.$nextTick(function(){ /*如今數據已經渲染完畢*/ }) } }, mounted:function() { var that = this; axios.get('url',{ params:{ link: '', } }).then(function(res){ that.arr = res; }) } }) </script> </html>
好,這就是咱們解決的完整代碼。 解釋一下什麼意思。
在 axios 請求數據是 this.arr被賦值了,watch監聽到了 arr 數據發生變化執行arr方法。到了this.$nextTick 它須要等DOM 渲染完畢才執行(也就是等arr在DOM渲染完畢)。
這個方法完美解決需求,既不浪費時間又不會出現數據還沒渲染完畢就執行實例初始化。這只是一個插件的實例化,經過這個例子能夠應用不少的需求。