對於Vue的資料管理上,我想我是了解了。但客戶不只是在數據上做大量的修改,畫面上也會因為數據的改動而造成建置和維護的複雜性,是否有更好的辦法可以有效處裡呢?
Vue:有的!Vue的好處在於,不是操作Real Dom,而是透過Virtual Dom的概念進行操作。
先回歸到傳統JS操作DOM的概念,有如以下圖示:
傳統JS下,如果要在DOM之間插入元素,我們會先找到其中一個節點操作。並且根據這個節點,來進行子節點或父節點的增、删或是修改。
這裡可以舉一個例子,如果在輸入框中輸入內容,並會產生一個block區塊:
傳統下,我們很容易寫成如下:
<body>
    <div id="wrap">
        <div>
            <input id="text" type="text">
            <button id="btn1">增加</button>
        </div>
        <ul id="block">
        </ul>
    </div>
</body>
<script>
    (function () {
 
        const getBtn = document.querySelector('#btn1')
        const getInput = document.querySelector('#text')
        const getDom = document.querySelector('#block')
 
        getBtn.addEventListener("click", () => {
            const li = document.createElement('li')
            const creatTextNode = document.createTextNode(`${getInput.value}`)
            li.appendChild(creatTextNode)
            getDom.appendChild(li)
            getInput.value = ''
        })
    })()
</script>
這種麵條式的方式,很難加以管理和運用(當然,如果良好MVVM的概念也許可以管理很好)。
如果改成利用Vue來操作,其概念如下圖,透過既定的DOM,去渲染重複性高的DOM,這樣有如虛擬DOM一樣:
<body>
    <div id="app">
        <div id="wrap">
            <div>
                <input id="text" type="text" v-model="inputData">
                <button id="btn1" @click='newBlock()'>增加</button>
            </div>
            <ul id="block" v-if="block.length">
                <li v-for="item in block">
                    {{item}}
                </li>
            </ul>
        </div>
        <pre>{{inputData}}</pre>
        <pre>{{block}}</pre>
    </div>
</body>
<script>
    new Vue({
        el: "#app",
        data() {
            return {
                inputData: '',
                block: []
            }
        },
        methods: {
            newBlock() {
                this.block.push(this.inputData)
                this.inputData = ""
            }
        }
    })
</script>
Vue:現在可以想一下,傳統JS和框架Vue是不是有所差異呢?這樣的服務,是否達到你要的需求呢?
待續......