1、組件中數據的存放
***(重點)組件是一個單獨模塊的封裝:這個模塊有自己的HTML模板,也有data屬性。
只是這個data屬性必需是一個函數,而這個函數返回一個對象,這個對象里面存放着組件的數據。
<template id="MyCpn"> <div> <h2>組件數據的存放 </h2> <p>{{title}}</p> </div> </template> <script> Vue.component('cpn', { template: '#MyCpn', data() { return { title: '我是組件中的專屬數據' } } // 組件是一個單獨模塊的封裝:這個模塊有自己的HTML模板,也有data數據。 })
***完整代碼***
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> <script src="../js/vue.js"></script> </head> <div id="app"> <cpn></cpn> </div> <body> <template id="MyCpn"> <div> <h2>組件數據的存放 </h2> <p>{{title}}</p> </div> </template> <script> Vue.component('cpn', { template: '#MyCpn', data() { return { title: '我是組件中的專屬數據' } } // 組件是一個單獨模塊的封裝:這個模塊有自己的HTML模板,也有data數據。 }) let vm = new Vue({ el: '#app', data: () => ({ title: "我是頂層Vue實例中的數據,外部組件能訪問我的數據嗎?" }) }) </script> </body> </html>
解析:當你在調用title變量的時候,只能訪問到組件內部定義的變量,因為組件是一個單獨模塊的封裝。
2、為什么組件中的data必需是函數
因為組件是要重復使用的,當data是函數並且在多次調用的時候,所占的內存塊不一樣,所以data中的數據互不影響。
****完整代碼****
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> <script src="../js/vue.js"></script> </head> <div id="app"> <cpn></cpn> <cpn></cpn> <cpn></cpn> </div> <body> <template id="MyCpn"> <div> <h2>當前計數:{{content}}</h2> <button @click="res">-</button> <button @click="add">+</button> </div> </template> <script> Vue.component('cpn', { template: '#MyCpn', data() { return { content: 0 } }, methods: { add() { this.content++ }, res() { this.content-- } } }) let vm = new Vue({ el: '#app', data: () => ({ title: "我是頂層Vue實例中的數據,外部組件能訪問我的數據嗎?" }) }) </script> </body> </html>
反過來,如果data不是用函數的話,在多次調用組件的時候,這里面的數據相互影響
***完整代碼****
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> <script src="../js/vue.js"></script> </head> <div id="app"> <cpn></cpn> <cpn></cpn> <cpn></cpn> </div> <body> <template id="MyCpn"> <div> <h2>當前計數:{{counter}}</h2> <button @click="res">-</button> <button @click="add">+</button> </div> </template> <script> const obj = { counter: 0 } Vue.component('cpn', { template: '#MyCpn', data() { return obj }, methods: { add() { this.counter++ }, res() { this.counter-- } } }) let vm = new Vue({ el: '#app', data: () => ({ title: "我是頂層Vue實例中的數據,外部組件能訪問我的數據嗎?" }) }) </script> </body> </html>