天天看點

Vue $set $nextTick $delete

1.$set

在開發過程中,我們時常會遇到這樣一種情況:當vue的data裡邊聲明或者已經指派過的對象或者數組(數組裡邊的值是對象)時,向對象中添加新的屬性,如果更新此屬性的值,是不會更新視圖的。

Vue $set $nextTick $delete
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
    
    <div id="app">
        {{msg}}
        <div>
            <p @click="add(obj)">{{obj.a}}</p>
            <p @click="sub(obj)">{{obj.b}}</p>
        </div>
    </div>

    <script src="./node_modules/vue/dist/vue.js"></script>
    <script>
        new Vue({
            el:'#app',
            data:{
                msg:'sss',
                obj:{}
            },
            mounted() {
                this.obj = {a:0};
                this.obj.b = 0;
                console.log("test1",this.obj)
            },
            methods: {
                add(item){
                    item.a = item.a + 1;
                    console.log("add++",item)
                },
                sub(item){
                    item.b = item.b+1;
                    console.log("sub++",item)
                }
            },
        })
    </script>  
</body>
</html>
           
Vue $set $nextTick $delete

可以看出a屬性是有get 和 set方法的,而新增的b屬性是沒有的。

Vue $set $nextTick $delete

點了四次a,及時更新,點了一次b,不更新,點了一次a, a,b同時更新了

由此可以看出,更新新增屬性b,是不會更新視圖,但是會改變其值,當更新原有屬性a時會更新視圖,同時将新增的屬性b的值也更新到視圖裡邊

解決方案
mounted() {
                this.obj = {a:0};
                // this.obj.b = 0;
                this.$set(this.obj,'b',0)
                console.log("test1",this.obj)
            },
           
Vue $set $nextTick $delete

2.Vue.nextTick( [callback, context] )

Vue $set $nextTick $delete
<mt-tabbar v-model="selected" fixed>
        <mt-tab-item id="home">
          <img slot="icon" src="./assets/img/index.png" @click="changeHash">
          首頁
        </mt-tab-item>
        <mt-tab-item id="member">
          <img slot="icon" src="./assets/img/vip.png" @click="changeHash">
          會員
        </mt-tab-item>
        <mt-tab-item id="shopcart">
          <img slot="icon" src="./assets/img/shopcart.png" @click="changeHash">
          購物車
        </mt-tab-item>
        <mt-tab-item id="search">
          <img slot="icon" src="./assets/img/find.png" @click="changeHash">
          查找
        </mt-tab-item>
      </mt-tabbar>

  methods: {
    changeHash () {
      // 該調用早于 子元件指派父元件的selected
      this.$nextTick(function () {
        this.$router.push({
          name: this.selected
        })
        // console.log(this.selected)
      })
    }
  }
  // watch: {
  //    selected (newV, oldV) {
  //     this.$router.push({
  //        name: newV
  //      })
  //    }
  // }
           

3.delete

Vue $set $nextTick $delete
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
    
    <div id="app">
        {{msg}}
        <div>
            <p @click="add(obj)">{{obj.a}}</p>
            <p @click="sub(obj)">{{obj.b}}</p>
        </div>
        <ul>
            <li v-for="item in newsLists">{{item.a}}==={{item.b}}</li>
        </ul>
        <div @click="btn">删除</div>
    </div>

    <script src="./node_modules/vue/dist/vue.js"></script>
    <script>
        new Vue({
            el:'#app',
            data:{
                msg:'sss',
                obj:{},
                newsLists:[
                    {a:1,b:2},
                    {a:3,b:4},
                    {a:4,b:4},
                    {a:5,b:4}
                ]
            },
            mounted() {
                this.obj = {a:0};
                // this.obj.b = 0;
                this.$set(this.obj,'b',0)
                console.log("test1",this.obj)
            },
            methods: {
                add(item){
                    item.a = item.a + 1;
                    console.log("add++",item)
                },
                sub(item){
                    item.b = item.b + 1;
                    console.log("sub++",item)
                },
                btn(){
                    this.$delete(this.newsLists,0)
                    //delete this.newsLists[0]
                    console.log(this.newsLists)
                }
            },
        })
    </script>  
</body>
</html>
           
Vue $set $nextTick $delete
Vue $set $nextTick $delete

繼續閱讀