Vue指令系統
vue 指令是什麼?
指令 (Directives) 是帶有 v- 字首的特殊 attribute。指令 attribute 的值預期是單個 JavaScript 表達式 (v-for 是例外情況,稍後我們再讨論)。指令的職責是,當表達式的值改變時,将其産生的連帶影響,響應式地作用于 DOM。
vue常用指令:
1.資料綁定
非表單元素_單向資料綁定_:div span ul li h1-h6 p等
{{}} v-html v-text
模闆文法:
Vue.js 使用了基于 HTML 的模闆文法,允許開發者聲明式地将 DOM 綁定至底層 Vue 執行個體的資料。所有 Vue.js 的模闆都是合法的 HTML,是以能被遵循規範的浏覽器和 HTML 解析器解析。
如果你熟悉虛拟 DOM 并且偏愛 JavaScript 的原始力量,你也可以不用模闆,直接寫渲染 (render) 函數,使用可選的 JSX 文法。
{{}} 模闆文法 優點:簡單 友善 缺點:不能解析标簽,首屏會出現閃屏問題
v-html 優點:可以解析标簽 缺點:不友善
v-text 優點:可以解決首屏閃屏問題 缺點:不友善,不能解析标簽
<div id="app">
<h1>模闆文法</h1>
<div>{{msg}}</div>
<!-- {{}}内部js解析,{{}}外面 html解析 -->
<div>hello, {{name}}</div>
<!-- {{}} 内部必須遵循js的文法 -->
<div>{{'hello,'+name}}</div>
<!-- {{}} 三元 -->
<div>{{n>10?name:'王昭君'}}</div>
<!-- {{}} 方法 -->
<div>價格:{{price.toFixed(2)}}</div>
<div>{{strHTML}}</div>
</div>
<script>
new Vue({
el:"#app",
data:{
msg:"畫畫的baby,畫畫的baby",
name:"妲己",
n:10,
price:19.90,
strHTML:"<em>哈哈哈哈</em>"
},
methods:{}
})
</script>
表單元素_雙向資料綁定_:Input、textarea、select-option …
v-model:雙向資料綁定
<div id="app">
<!-- 視圖 -->
<h2>{{name}}</h2>
<input type="text" v-model="name">
<button v-on:click="login()">送出</button>
</div>
<script>
// 4.執行個體化vue對象
new Vue({
//element
el:"#app",
data:{//資料 模型
//雙向資料綁定
//MVVM模式: M-model模型 V-view視圖 VM-viewModel視圖模型
//模型通過 視圖模型 控制視圖,視圖又可以 通過視圖模型 修改模型,視圖模型是模型和視圖之間的橋梁
//MVVM模式
name:"張三"
},
methods:{
login(){
console.log(this.name);
}
}
})
</script>
2.屬性綁定
媒體元素:img video
v-bind 簡寫
:
v-bind 指令将該元素的 href attribute 與表達式 url 的值綁定。
<div id="app">
<!-- 屬性綁定 v-bind,可以綁定已經存在的屬性,也可以綁定自定義屬性 -->
<!-- v-bind 後面的内容必須滿足js的文法 -->
<a v-bind:href="compony.url" v-bind:title="compony.name">
<img v-bind:src="compony.logo" alt="易烊千玺">
</a>
<!-- 屬性可以自己定義 -->
<div v-bind:sum="x+y+'aa'">這是自己定義的</div>
<!-- 簡寫 : -->
<a :href="compony.url" :title="compony.name">
<img :src="compony.logo" alt="">
</a>
<div :sum="x+y+'aa'">這是自己定義的</div>
</div>
<script>
// 3.執行個體化
new Vue({
el:"#app",//挂載點
data:{//屬性
compony:{
name:"易烊千玺",
url:"https://baike.baidu.com/item/%E6%98%93%E7%83%8A%E5%8D%83%E7%8E%BA/221450?fr=aladdin",
logo:"https://bkimg.cdn.bcebos.com/pic/9825bc315c6034a881b02393c413495409237656?x-bce-process=image/resize,m_lfit,h_500,limit_1"
},
x:10,
y:20
},
methods:{//方法
}
})
</script>
動态屬性
動态class=>:class
<!-- 第一種方式: :class="變量" -->
<h3 :class="class1">天道酬勤</h3>
<!-- 第二種方式 : :class="[三元]" 就隻有兩種情況 -->
<h3 :class="[aa?'red blue':'yellow purple']">人道酬善</h3>
<!-- 第三種方式 :class="{'類名1':boolean,'類名2':boolean}" -->
<h3 :class="{'red':isRed,'yellow':isYellow,'lime':isLime,'purple':isPurple,'blue':isBlue}">商道酬信</h3>
<div v-bind:class="{ active: isActive }"></div>
<script>
new Vue({
el:"#app",//挂載點
data: {
isActive: true,
hasError: false
}
})
</script>
動态style:=>:style
v-bind:style 的對象文法十分直覺——看着非常像 CSS,但其實是一個 JavaScript 對象。CSS property 名可以用駝峰式 或短橫線分隔來命名
<!-- 動态style :style="json" -->
<div v-bind:style="styleObject"></div>
<!-- 動态style :style="[數組文法]" -->
<div v-bind:style="[baseStyles, overridingStyles]"></div>
<button v-on:click="changeColor()">點選字型顔色改為orange</button>
<script>
new Vue({
el:"#app",//挂載點
data: {
styleObject: {
color: 'red',
fontSize: '13px'
}
},
methods:{//方法
changeColor(){
this.json.color="orange"
}
}
})
</script>
3.條件渲染
v-if v-show v-else
相同點:
v-if 和v-show 都是true顯示,false 消失
不相同點:
v-if false 不加載節點-惰性加載
v-show false 加了display:none;
使用場景:
頻繁切換,建議使用v-show,不頻繁切換,建議使用v-if.
補充:v-else
v-else必須接着v-if
v-if v-else
<h2 v-if="isShow">優秀是一種習慣</h2>
<h2 v-else>認真是一種态度</h2>
<div id="app">
<!-- v-if 條件渲染,true 出現,false消失。 -->
<h3 v-if="false">畫畫的baby 畫畫的baby</h3>
<!-- 0為假,非0即為真 -->
<h3 v-if="-1">奔馳的小野馬和帶刺的玫瑰</h3>
<h3 v-if="a">優秀是一種習慣</h3>
<h3 v-if="b">認真是一種态度</h3>
<button v-on:click="toggle()">切換</button>
<h3 v-if="isshow">堅持是一種品格</h3>
<h3 v-if="comment.length==0">暫無資料</h3>
<h3 v-if="comment.length>0">有資料</h3>
<hr>
<h3 v-if="comment.length==0">暫無資料</h3>
<h3 v-else>有資料</h3>
</div>
<script>
new Vue({
el: "#app",
data: {
a: true,
b: '123',
isshow: true,
comment:["物美價廉",'特别好',"推薦"]
},
methods: {
toggle() {
/*
if (this.isshow) {
this.isshow = false
} else {
this.isshow = true;
}*/
this.isshow=!this.isshow;
}
}
})
</script>
v-show
<div id="app">
<!-- v-show true 出現,false 消失 -->
<h3 v-show="false">畫畫的baby 畫畫的baby</h3>
<button v-on:click="toggle()">切換</button>
<h3 v-show="isshow">堅持是一種品格</h3>
</div>
<script>
new Vue({
//element
el: "#app",
data: {
isshow: true
},
methods: {
toggle() {
this.isshow=!this.isshow;
}
}
})
</script>
4.清單渲染
v-for
v-for 指令基于一個數組來渲染一個清單。 v-for 指令需要使用 item in items 形式的特殊文法,其中 items 是源資料數組,而 item 則是被疊代的數組元素的别名。
<div id="app">
<ul>
<li v-for="(item,index) in comment">{{index+1}}-{{item}}</li>
</ul>
<div>
<a :href="item.url" :title="item.name" v-for="(item,index) in website">
<img :src="item.logo" alt="">
</a>
</div>
<div class="box">
<div class="item" v-for="x in goods">
<img :src="x.img" alt="">
<h3>{{x.title}}</h3>
<p>{{x.info}}</p>
<p>{{x.num}}</p>
</div>
</div>
</div>
<script>
var vm = new Vue({
el: "#app",
data: {
comment: ["物美價廉", '特别好', "推薦", "物美價廉", '特别好', "推薦"],
website: [{
name: "京東",
url: "http://jd.com",
logo: "http://img1.360buyimg.com/da/jfs/t1/17098/23/11599/160999/5c90a484E27dd5514/7287f0d182775168.gif"
},
{
name: "淘寶",
url: "http://taobao.com",
logo: "http://img.alicdn.com/tfs/TB1UDHOcwoQMeJjy0FoXXcShVXa-286-118.png"
},
{
name: "百度",
url: "http://baidu.com",
logo: "https://www.baidu.com/img/PCtm_d9c8750bed0b3c7d089fa7d55720d6cf.png"
},
],
goods: [{
img: "https://img.alicdn.com/tfscom/i1/1581756766/TB2TF0ch0zJ8KJjSspkXXbF7VXa_!!1581756766.jpg_360x360xzq90.jpg_.webp",
title: "大豆家 方頭奶奶鞋",
info: "一腳蹬設計,友善日常的穿脫。",
num: "378人都說好"
},
{
img: "https://img.alicdn.com/tfscom/i3/2459354798/TB2IyE5eUhnpuFjSZFpXXcpuXXa_!!2459354798.jpg_360x360xzq90.jpg_.webp",
title: "大豆家 方頭奶奶鞋",
info: "一腳蹬設計,友善日常的穿脫。",
num: "358人都說好"
},
{
img: "https://img.alicdn.com/tfscom/i4/654230132/O1CN011CqUjXBxyNTXTMy_!!654230132.jpg_360x360xzq90.jpg_.webp",
title: "大豆家 方頭奶奶鞋",
info: "一腳蹬設計,友善日常的穿脫。",
num: "58人都說好"
},
]
}
})
</script>
vue的v-for更新的時候采用的是“就地更新”原則,如果更新的時候想要提高更新的性能,我們需要給vue一個辨別,作為對比條件,這個辨別必須是唯一的,是以一般使用id.
在腳手架中必須加上key,不然報錯
<ul>
<li v-for="(a,b) in people" :key="a.id">
<h3>{{b}}姓名:{{a.name}}</h3>
<p>金額:{{a.money}} <button v-on:click="add(b)">++</button> </p>
</li>
</ul>
5.事件處理
v-on 指令監聽 DOM 事件,并在觸發時運作一些 JavaScript 代碼。
<div id="example-3">
<button v-on:click="say('hi')">Say hi</button>
<button v-on:click="say('what')">Say what</button>
</div>
<script>
new Vue({
el: '#example-3',
methods: {
say: function (message) {
alert(message)
}
}
})
</script>
6.表單修飾符
<!-- .lazy 失去光标才修改模型資料,優化 -->
<input type="text" v-model.lazy="name">
<!-- .number 将綁定的資料 的資料類型轉換為number -->
<input type="text" v-model.number="age" v-on:blur="blur()">
<!-- .trim 去空格 -->
<input type="text" v-model.trim="name">
7.事件處理
事件修飾符,.stop .prevent .capture .self .once .passive
按鍵修飾符,:keyup.enter :keydown.down
按鍵碼,.enter .tab .delete (捕獲“删除”和“倒退”鍵) .esc .space .up .down .left .right
系統修飾鍵,.ctrl .alt .shift .meta
滑鼠按鈕修飾符.left .right .middle,
新增:.exact 修飾符- 修飾符允許你控制由精确的系統修飾符組合觸發的事件。
<div id="app">
<!--1. .prevent 阻止預設事件 -->
<div class="box" @contextmenu.prevent="yj"></div>
<!-- 案例 -->
<input type="text" @keydown.38.prevent="up">
<!--2 .stop 阻止事件傳播 -->
<div class="outer" @click="outerClick">
<div class="inner" @click.stop="innerClick"></div>
</div>
<!-- 案例 -->
<button @click="isshow=true">删除</button>
<div class="mask" v-if="isshow" @click="isshow=false">
<div class="con" @click.stop="conClick()">
<h3>你确定要删除嗎?</h3>
<button @click="isshow=false">取消</button>
<button>确定</button>
</div>
</div>
<!-- 3. .self 觸發的目标元素是自身,才執行 -->
<button @click="isshow2=true">删除2</button>
<div class="mask" v-if="isshow2" @click.self="isshow2=false">
<div class="con" >
<h3>你确定要删除嗎2?</h3>
<button @click="isshow2=false">取消</button>
<button>确定</button>
</div>
</div>
<!--4 .left .right .up .down .enter .13 -->
<input type="text"
@keydown.up="up2"
@keydown.down="down"
@keydown.enter="enter"
@keydown.left.prevent="left"
@keydown.right="right"
>
<!--5 .capture 捕獲 -->
<div class="outer" @click.capture.stop="outerClick">
<div class="inner" @click.capture="innerClick">捕獲</div>
</div>
<!-- 6. .native 解決元件綁定不上事件 -->
<hello @click.native="outerClick"></hello>
<!-- 新增:7.點選事件将隻會觸發一次 -->
<a v-on:click.once="yj"></a>
</div>
<script>
new Vue({
el: "#app",//挂載點
data: {//屬性
isshow:false,
isshow2:false
},
methods: {//方法
yj() {
console.log("右鍵了");
},
outerClick() {
console.log("outer click");
},
innerClick() {
console.log("inner click");
},
up() {
console.log("按了上鍵");
},
conClick(){},
up2(){
console.log("上鍵");
},
down(){
console.log("下鍵");
},
enter(){
window.open("http://baidu.com")
},
left(){
console.log("left");
},
right(){
console.log("right");
},
}
})
</script>
6.MVVM模式
适用:大量的資料增删改查的操作
M-model 模型 V-view 視圖 VM-viewModel 視圖模型 (控制器)
模型通過控制器決定了視圖,
視圖可以通過控制器修改模型,
視圖模型是模型和視圖之前的橋梁。
總結:常用指令
表單元素:v-model
非表單元素: {{}} v-html v-text
屬性綁定:v-bind=》: v-on=》@
條件渲染:v-if v-else v-show
清單渲染:v-for