Vue基礎(chǔ)語法知識(shí)梳理上篇
Vue簡(jiǎn)介
- 讓Vue工作,就須創(chuàng)建一個(gè)Vue實(shí)例,且要傳入一個(gè)配置對(duì)象
- demo容器里的代碼符合html規(guī)范,只不過混入了一些特殊的Vue語法
- demo容器里的代碼被稱為【Vue模板】
- Vue實(shí)例和容器是一一對(duì)應(yīng)的
- 真實(shí)開發(fā)中只有一個(gè)Vue實(shí)例,并且會(huì)配合著組件一起使用
- {{xxx}}是Vue的語法:插值表達(dá)式,{{xxx}}可以讀取到data中的所有屬性
- 一旦data中的數(shù)據(jù)發(fā)生改變,那么頁面中用到該數(shù)據(jù)的地方也會(huì)自動(dòng)更新(Vue實(shí)現(xiàn)的響應(yīng)式)
<!-- 準(zhǔn)備好一個(gè)容器 --> <div id="demo"> <h1>Hello,{{name.toUpperCase()}},{{address}}</h1> </div> <script type="text/javascript" > Vue.config.productionTip = false //阻止 vue 在啟動(dòng)時(shí)生成生產(chǎn)提示。 //創(chuàng)建Vue實(shí)例 new Vue({ el:'#demo', //el用于指定當(dāng)前Vue實(shí)例為哪個(gè)容器服務(wù),值通常為css選擇器字符串。 data:{ //data中用于存儲(chǔ)數(shù)據(jù),數(shù)據(jù)供el所指定的容器去使用,值我們暫時(shí)先寫成一個(gè)對(duì)象。 name:'hello,world', address:'北京' } }); </script>
模板語法
(1)插值語法:
功能:用于解析標(biāo)簽體內(nèi)容
寫法:{{xxx}},xxx是js表達(dá)式,且可以直接讀取到data中的所有屬性
(2)指令語法:
功能:用于解析標(biāo)簽(包括:標(biāo)簽屬性、標(biāo)簽體內(nèi)容、綁定事件…)
舉例:v-bind:href=“xxx” 或 簡(jiǎn)寫為
:href=“xxx”,xxx同樣要寫js表達(dá)式,且可以直接讀取到data中的所有屬性
<div id="root"> <h1>插值語法</h1> <h3>你好,{{name}}</h3> <hr/> <h1>指令語法</h1> <!-- 這里是展示被Vue指令綁定的屬性,引號(hào)內(nèi)寫的是js表達(dá)式 --> <a :href="school.url.toUpperCase()" rel="external nofollow" x="hello">點(diǎn)我去{{school.name}}學(xué)習(xí)1</a> <a :href="school.url" rel="external nofollow" x="hello">點(diǎn)我去{{school.name}}學(xué)習(xí)2</a> </div> <script> new Vue({ el:'#root', data:{ name:'jack', school:{ name:'百度', url:'http://www.baidu.com', } } }) </script>
數(shù)據(jù)綁定
(1)單向綁定(v-bind):數(shù)據(jù)只能從data流向頁面
(2)雙向綁定(v-model):數(shù)據(jù)不僅能從data流向頁面,還可以從頁面流向data
1.雙向綁定一般都應(yīng)用在表單類元素上(如:input、select等)
2.v-model:value 可以簡(jiǎn)寫為 v-model,因?yàn)関-model默認(rèn)收集的就是value值
<div id="root"> <!-- 普通寫法 單向數(shù)據(jù)綁定 --> 單向數(shù)據(jù)綁定:<input type="text" v-bind:value="name"><br/> 雙向數(shù)據(jù)綁定:<input type="text" v-model:value="name"><br/> <!-- 簡(jiǎn)寫 v-model:value 可以簡(jiǎn)寫為 v-model,因?yàn)関-model默認(rèn)收集的就是value值--> 單向數(shù)據(jù)綁定:<input type="text" :value="name"><br/> 雙向數(shù)據(jù)綁定:<input type="text" v-model="name"><br/> </div> <script> new Vue({ el:'#root', data:{ name:'jack', } }) </script>
el與data的兩種寫法
(1)el有2種寫法
- new Vue時(shí)候配置el屬性
- 先創(chuàng)建Vue實(shí)例,隨后再通過vm.$mount(‘#root’)指定el的值
<script> // 第一種 const vm = new Vue({ el:'#root', data:{ name:'jack', } }) // 第二種 vm.$mount('#root') </script>
(2)data有2種寫法
- 對(duì)象式
- 函數(shù)式
在組件中,data必須使用函數(shù)式
<script> new Vue({ el:'#root', // 第一種 data:{ name:'jack', } // 第二種 data() { return { name: 'jack' } } }) </script>
Vue中的MVVM
- M:模型(Model) :data中的數(shù)據(jù)
- V:視圖(View) :模板代碼
- VM:視圖模型(ViewModel):Vue實(shí)例
數(shù)據(jù)代理
了解數(shù)據(jù)代理需要js的一些知識(shí):Object.defineProperty(),屬性標(biāo)志,屬性描述符,getter,setter
屬性標(biāo)志:
對(duì)象屬性(properties),除 value
外,還有三個(gè)特殊的特性(attributes),也就是所謂的“標(biāo)志”
writable
— 如果為true
,則值可以被修改,否則它是只可讀的enumerable
— 如果為true
,則表示是可以遍歷的,可以在for… .in Object.keys()中遍歷出來configurable
— 如果為true
,則此屬性可以被刪除,這些特性也可以被修改,否則不可以
Object.getOwnPropertyDescriptor(obj, propertyName)
這個(gè)方法是查詢有關(guān)屬性的完整信息 obj是對(duì)象, propertyName是屬性名
let user = { name: "John" }; let descriptor = Object.getOwnPropertyDescriptor(user, 'name'); console.log(descriptor) /* 屬性描述符: { "value": "John", "writable": true, "enumerable": true, "configurable": true } */
Object.defineProperty(obj, prop, descriptor)
obj:要定義屬性的對(duì)象。
prop:要定義或修改的屬性的名稱
descriptor:要定義或修改的屬性描述符
let user = { name: "John" }; Object.defineProperty(user, "name", { writable: false }); user.name = "Pete"; // 打印后還是顯示 'John',無法修改name值
其他的屬性標(biāo)志就不演示了,接下來看重點(diǎn):訪問器屬性。
訪問器屬性:
本質(zhì)上是用于獲取和設(shè)置值的函數(shù),但從外部代碼來看就像常規(guī)屬性。
訪問器屬性由 “getter” 和 “setter” 方法表示。在對(duì)象字面量中,它們用 get
和 set
表示:
let obj = { get name() { // 當(dāng)讀取 obj.propName 時(shí),getter 起作用 }, set name() { // 當(dāng)執(zhí)行 obj.name = value 操作時(shí),setter 起作用 } }
更復(fù)雜一點(diǎn)的使用
let user = { surname: 'gao', name: 'han' get fullName() { return this.name + this.surname; } } console.log(user.fullName)
從外表看,訪問器屬性看起來就像一個(gè)普通屬性。這就是訪問器屬性的設(shè)計(jì)思想。我們不以函數(shù)的方式 調(diào)用 user.fullName
,我們正常 讀取 它:getter 在幕后運(yùn)行。
截至目前,fullName
只有一個(gè) getter。如果我們嘗試賦值操作 user.fullName=
,將會(huì)出現(xiàn)錯(cuò)誤:
user.fullName = "Test"; // Error(屬性只有一個(gè) getter)
為 user.fullName
添加一個(gè) setter 來修復(fù)它:
let user = { surname: 'gao', name: 'han' get fullName() { return this.name + ' ' + this.surname; } set fullName(value) { // 這個(gè)用到了新語法 結(jié)構(gòu)賦值 [this.surname, this.name] = value.split(' '); } } user.fullName = 'Li Hua' console.log(user.name); console.log(user.surname);
數(shù)據(jù)代理:
數(shù)據(jù)代理:通過一個(gè)對(duì)象代理對(duì)另一個(gè)對(duì)象中屬性的操作(讀/寫)
例: let obj = { x: 100 } let obj2 = { y: 200 }
我們想要訪問 **obj** 中的 **x** 的值,但我們最好不要直接去訪問 **obj** ,而是想要通過 **obj2** 這個(gè)代理對(duì)象去訪問。
這時(shí)候就可以用上 Object.defineProperty(),給 obj2 添加訪問器屬性(也就是getter和setter)
代碼
let obj = { x: 100 } let obj2 = { y: 200 } Object.defineProperty(obj2, 'x', { get() { return obj.x; }, set(value) { obj.x = value; } })
Vue中的數(shù)據(jù)代理
Vue中的數(shù)據(jù)代理:通過vm對(duì)象來代理data對(duì)象中屬性的操作(讀/寫)
Vue中數(shù)據(jù)代理的好處:更加方便的操作data中的數(shù)據(jù)
基本原理:
- 通過Object.defineProperty()把data對(duì)象中所有屬性添加到vm上。
- 為每一個(gè)添加到vm上的屬性,都指定一個(gè)getter/setter。
- 在getter/setter內(nèi)部去操作(讀/寫)data中對(duì)應(yīng)的屬性。
<!-- 準(zhǔn)備好一個(gè)容器--> <div id="root"> <h2>學(xué)校名稱:{{name}}</h2> <h2>學(xué)校地址:{{address}}</h2> </div> <script> const vm = new Vue({ el: '#root', data: { name: '浙江師范大學(xué)', address: '浙江金華' } }) </script>
我們?cè)诳刂婆_(tái)打印 new 出來的 vm
可以看到,寫在配置項(xiàng)中的 data 數(shù)據(jù)被 綁定到了 vm 對(duì)象上,我先來講結(jié)果,是 Vue 將 _data 中的 name,address 數(shù)據(jù) 代理到 vm 本身上。
先來解釋下_data 是啥, _data 就是 vm 身上的 _data 屬性,就是下圖那個(gè)
這個(gè) _data 是從哪來的?
<script> const vm = new Vue({ el: '#root', // 我們?cè)赩ue 初始化的配置項(xiàng)中寫了 data 屬性。 data: { name: '浙江師范大學(xué)', address: '浙江金華' } }) </script>
new Vue 時(shí), Vue 通過一系列處理, 將匹配項(xiàng)上的 data 數(shù)據(jù)綁定到了 _data 這個(gè)屬性上,并對(duì)這個(gè)屬性進(jìn)行了處理(數(shù)據(jù)劫持),但這個(gè)屬性就是來源于配置項(xiàng)中的 data,我們可以來驗(yàn)證一下。
<script> let data1 = { name: '浙江師范大學(xué)', address: '浙江金華' } const vm = new Vue({ el: '#root', // 我們?cè)赩ue 初始化的配置項(xiàng)中寫了 data 屬性。 data: data1 }) </script>
這一切都是通過 Object.defineProperty() 來完成的,我來模擬一下這個(gè)過程
Object.defineProperty(vm, 'name', { get() { return vm._data.name; }, set(value) { vm._data.name = value } })
在插值語法中,{{ name }} 取到的值就相當(dāng)于 {{ vm.name }},不用數(shù)據(jù)代理的話,在插值語法就要這樣去寫了。
事件處理
事件的基本使用:
- 使用v-on:xxx 或 @xxx 綁定事件,其中xxx是事件名
- 事件的回調(diào)需要配置在methods對(duì)象中,最終會(huì)在vm上
- methods中配置的函數(shù),都是被Vue所管理的函數(shù),this的指向是vm 或 組件實(shí)例對(duì)象
<!-- 準(zhǔn)備好一個(gè)容器--> <div id="root"> <h2>歡迎來到{{name}}學(xué)習(xí)</h2> <!-- <button v-on:click="showInfo">點(diǎn)我提示信息</button> --> <button @click="showInfo1">點(diǎn)我提示信息1(不傳參)</button> <!-- 主動(dòng)傳事件本身 --> <button @click="showInfo2($event,66)">點(diǎn)我提示信息2(傳參)</button> </div> <script> const vm = new Vue({ el:'#root', data:{ name:'vue', }, methods:{ // 如果vue模板沒有寫event,會(huì)自動(dòng)傳 event 給函數(shù) showInfo1(event){ // console.log(event.target.innerText) // console.log(this) //此處的this是vm alert('同學(xué)你好!') }, showInfo2(event,number){ console.log(event,number) // console.log(event.target.innerText) // console.log(this) //此處的this是vm alert('同學(xué)你好??!') } } }); </script>
Vue中的事件修飾符
- prevent:阻止默認(rèn)事件(常用)
- stop:阻止事件冒泡(常用)
- once:事件只觸發(fā)一次(常用)
<div id="root"> <h2>歡迎來到{{name}}學(xué)習(xí)</h2> <!-- 阻止默認(rèn)事件(常用) --> <a rel="external nofollow" @click.prevent="showInfo">點(diǎn)我提示信息</a> <!-- 阻止事件冒泡(常用) --> <div class="demo1" @click="showInfo"> <button @click.stop="showInfo">點(diǎn)我提示信息</button> <!-- 修飾符可以連續(xù)寫 --> <!-- <a rel="external nofollow" @click.prevent.stop="showInfo">點(diǎn)我提示信息</a> --> </div> <!-- 事件只觸發(fā)一次(常用) --> <button @click.once="showInfo">點(diǎn)我提示信息</button> </div>
到此這篇關(guān)于Vue基礎(chǔ)語法知識(shí)梳理上篇的文章就介紹到這了,更多相關(guān)Vue語法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Vue.js bootstrap前端實(shí)現(xiàn)分頁和排序
這篇文章主要為大家詳細(xì)介紹了Vue.js結(jié)合bootstrap前端實(shí)現(xiàn)分頁和排序效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-03-03vue使用ElementUI時(shí)導(dǎo)航欄默認(rèn)展開功能的實(shí)現(xiàn)
這篇文章主要介紹了vue使用ElementUI時(shí)導(dǎo)航欄默認(rèn)展開功能的實(shí)現(xiàn),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-07-07Vue中Router路由兩種模式hash與history詳解
這篇文章主要介紹了Vue中Router路由的兩種模式,分別對(duì)hash模式與history模式作了簡(jiǎn)要分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助2021-09-09安裝vue無法運(yùn)行、此系統(tǒng)無法運(yùn)行腳本問題及解決
這篇文章主要介紹了安裝vue無法運(yùn)行、此系統(tǒng)無法運(yùn)行腳本問題及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-03-03