Vue使用v-for顯示列表時,數組里的item數據更新,視圖中列表不同步更新的解決方法


  • 由於初始化類型錯誤導致的不更新,代碼是這樣的:
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <script src="https://cdn.bootcss.com/vue/2.4.2/vue.min.js"></script>
</head>

<body>
    <div id="app-7">
        <div @click="update()">update</div>
        <ol>
            <li v-for="item in groceryList" v-bind:key="item.id">
                {{item.text}}
            </li>
        </ol>
    </div>
</body>
<script type="text/javascript">
    var app7 = new Vue({
        el: '#app-7',
        data: {
            groceryList: []
        },
        methods: {
            update: function() {
                this.groceryList[0].text = "newvalue"
            }
        },
        created: function() {
            let adddata = [];
            adddata.id = 0;
            adddata.text = "test";
            this.groceryList.push(adddata);
        }
    });
</script>

</html>

使用索引直接更新數組中的項目,比如:

 this.groceryList[0].text = "newvalue"

發現視圖中的項目並不會更新
問題出在 let adddata = []; 寫錯了,讓adddata是一個數組類型了,vue在監聽數據更新的時候,判斷是數組類型,並不會對它的屬性的變更做處理,而只會對數組里元素的改變做處理,把 let adddata = []; 改成 let adddata = {};即可
或這樣也可以:

let adddata = {
                id: 0,
                text: "test"
            };
    
this.groceryList.push(adddata);
  • vue不能檢測到數組元素的直接賦值,比如:
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <script src="https://cdn.bootcss.com/vue/2.4.2/vue.min.js"></script>
</head>

<body>
    <div id="app-7">
        <div @click="update()">update</div>
        <ol>
            <li v-for="item in groceryList" v-bind:key="item.id">
                {{item.text}}
            </li>
        </ol>
    </div>
</body>
<script type="text/javascript">
    var app7 = new Vue({
        el: '#app-7',
        data: {
            groceryList: []
        },
        methods: {
            update: function() {
                this.groceryList[0] = {
                    id: 0,
                    text: "newvalue"
                };
            }
        },
        created: function() {
            let adddata = {
                id: 0,
                text: "test"
            };

            this.groceryList.push(adddata);
        }
    });
</script>

</html>
 this.groceryList[0] = {
                    id: 0,
                    text: "newvalue"
                };
            }

vue不能檢測這種改變,只能檢測到push,pop等元素出入棧的操作
可以改成這樣,把舊元素替換成新元素(舊元素出棧,新元素入棧)

update: function() {
                this.groceryList.splice(0, 1, {
                    id: 0,
                    text: "newvalue"
                });
                
            }
        },

即使groceryList是一個普通的非對象數組,也需要這樣才能同步更新視圖

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <script src="https://cdn.bootcss.com/vue/2.4.2/vue.min.js"></script>
</head>

<body>
    <div id="app-7">
        <div @click="update()">update</div>
        <ol>
            <li v-for="item in groceryList" v-bind:key="item.id">
                {{item}}
            </li>
        </ol>
    </div>
</body>
<script type="text/javascript">
    var app7 = new Vue({
        el: '#app-7',
        data: {
            groceryList: []
        },
        methods: {
            update: function() {
                //this.groceryList[0] = "newvalue";//不行
                this.groceryList.splice(0, 1, "newvalue");
            }
        },
        created: function() {
            let adddata = "test";


            this.groceryList.push(adddata);
        }
    });
</script>

</html>


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM