防城港做網(wǎng)站的培訓(xùn)機(jī)構(gòu)有哪些
語(yǔ)法規(guī)則
前端渲染
渲染有幾種方式:原生js、js模板、Vue模板語(yǔ)法
原生js
使用字符串拼接
js模板語(yǔ)法
Vue.js 模板語(yǔ)法概述
Vue.js 是一個(gè)用于構(gòu)建用戶界面的漸進(jìn)式框架,其模板語(yǔ)法非常靈活和直觀。Vue 的模板語(yǔ)法基于 HTML,可以通過(guò)指令、插值和特殊屬性來(lái)實(shí)現(xiàn)數(shù)據(jù)綁定和事件處理。以下是 Vue.js 2 的模板語(yǔ)法的主要概念和示例。
1. 插值(Interpolation)
插值用于在模板中顯示數(shù)據(jù),可以使用雙大括號(hào) {{ }}
進(jìn)行文本插值,或者使用 v-bind
進(jìn)行屬性插值。
<div id="app"><p>{{ message }}</p><p v-bind:title="title">Hover to see the title</p>
</div><script>
new Vue({el: '#app',data: {message: 'Hello, Vue!',title: 'This is a title'}
})
</script>
2. 指令(Directives)
指令是帶有 v-
前綴的特殊特性,用來(lái)在模板中做響應(yīng)式數(shù)據(jù)綁定。常用指令包括 v-if
, v-for
, v-show
, v-model
, v-bind
, v-on
等。
- 條件渲染:
v-if
,v-else-if
,v-else
<div id="app"><p v-if="seen">Now you see me</p><p v-else>Now you don't</p>
</div><script>
new Vue({el: '#app',data: {seen: true}
})
</script>
- 列表渲染:
v-for
<div id="app"><ul><li v-for="item in items" :key="item.id">{{ item.text }}</li></ul>
</div><script>
new Vue({el: '#app',data: {items: [{ id: 1, text: 'Item 1' },{ id: 2, text: 'Item 2' },{ id: 3, text: 'Item 3' }]}
})
</script>
- 事件處理:
v-on
<div id="app"><button v-on:click="sayHello">Click me</button>
</div><script>
new Vue({el: '#app',methods: {sayHello: function() {alert('Hello, Vue!');}}
})
</script>
- 雙向綁定:
v-model
<div id="app"><input v-model="message" placeholder="Edit me"><p>Message is: {{ message }}</p>
</div><script>
new Vue({el: '#app',data: {message: 'Hello, Vue!'}
})
</script>
3. 修飾符(Modifiers)
修飾符是以半角句號(hào) .
指明的特殊后綴,用于指出一個(gè)指令應(yīng)該以特殊方式綁定。例如,.prevent
, .stop
, .capture
, .self
, .once
, .native
, .number
, .trim
。
<div id="app"><form v-on:submit.prevent="onSubmit"><button type="submit">Submit</button></form>
</div><script>
new Vue({el: '#app',methods: {onSubmit: function() {alert('Form submitted!');}}
})
</script>
4. 計(jì)算屬性和偵聽(tīng)器
- 計(jì)算屬性:用來(lái)對(duì)模板中復(fù)雜邏輯進(jìn)行計(jì)算并返回結(jié)果,類(lèi)似于
data
屬性,但會(huì)基于其依賴項(xiàng)緩存結(jié)果。
<div id="app"><p>Reversed message: {{ reversedMessage }}</p>
</div><script>
new Vue({el: '#app',data: {message: 'Hello, Vue!'},computed: {reversedMessage: function() {return this.message.split('').reverse().join('');}}
})
</script>
- 偵聽(tīng)器:用于監(jiān)聽(tīng)數(shù)據(jù)屬性的變化并執(zhí)行相應(yīng)的操作。
<div id="app"><p>{{ message }}</p>
</div><script>
new Vue({el: '#app',data: {message: 'Hello, Vue!'},watch: {message: function(newVal, oldVal) {console.log('Message changed from', oldVal, 'to', newVal);}}
})
</script>
以上是 Vue.js 2 模板語(yǔ)法的基本介紹和一些示例代碼。這些概念和指令使得 Vue.js 非常靈活和易于使用,適用于各種規(guī)模的應(yīng)用開(kāi)發(fā)。
- 插值表達(dá)式
- 指令
- 事件綁定
- 屬性綁定
- 樣式綁定
- 分支循環(huán)結(jié)構(gòu)
指令
什么是指令:
- 什么是自定義屬性
- 指令的本質(zhì)就是自定義屬性
- 指令的格式:以v-開(kāi)始(比如V-cloak)
v-clock指令用法
在頻繁刷新的時(shí)候可能會(huì)出現(xiàn)插值表達(dá)式,造成用戶體驗(yàn)不好
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Vue</title><style type="text/css">[v-clock]{display:none;}</style><meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body>
<div id="app"><div v-clock>{{msg}}</div>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>// v-clock指令用法// 1.提供樣式// [v-clock]{// display:none;// }// 2.在插值表達(dá)式所在的標(biāo)簽添加v-cloak指令var vm =new Vue({el:'#app',data:{msg:'HelloWord'}});
</script>
</body>
</html>
使用v-clock就可以不顯示插值表達(dá)式,刷新頁(yè)面直接出來(lái)數(shù)據(jù)
背后原理:
先通過(guò)樣式隱藏內(nèi)容,在內(nèi)存中進(jìn)行值的替換,替換好之后在顯示最終的結(jié)果。
v-text 純文本信息 v-html(容易遭遇跨站腳本攻擊) v-pre 填充原始信息
v-once:如果顯示的信息后期不需要再修改可以使用,可以提高性能。
v-model 雙向綁定
MVVM設(shè)置思想
M(model)
V(view)
VM(View-Model)
重點(diǎn)是雙向綁定
事件綁定
v-on指令語(yǔ)法 當(dāng)然因?yàn)榻?jīng)常使用還提供一種簡(jiǎn)寫(xiě)方法@
當(dāng)然在vue中我們可以給時(shí)間綁定一個(gè)方法寫(xiě)在,methods里面
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Vue</title><style type="text/css">[v-clock]{display:none;}</style><meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body>
<div id="app"><div>{{num}}</div><div><button v-on:click="num++">增加</button><button @click="num++">點(diǎn)擊1</button><button @click="handle">點(diǎn)擊1</button><button @click="handle()">點(diǎn)擊1</button></div>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>var vm =new Vue({el:'#app',data:{num:0},methods:{handle:function (){//這里的this是vue的實(shí)例對(duì)象console.log(this)this.num++}}});
</script>
</body>
</html>
事件參數(shù)傳遞
1.如果時(shí)間直接綁定函數(shù)名稱,那末默認(rèn)會(huì)傳遞事件對(duì)象作為時(shí)間函數(shù)的第一個(gè)函數(shù)
2.如果事件綁定函數(shù)調(diào)用,事件對(duì)象必須作為最后一個(gè)參數(shù)顯示傳遞,必須對(duì)象名稱必須$event
<button @click="handle($event)">點(diǎn)擊1</button>
事件修飾符
按鍵修飾符
自定義按鍵修飾符
全局config.keyCodes對(duì)象
Vue.config.keyCodes.f1 = 112;
自定義按鍵修飾符名字是自定義的,但是對(duì)應(yīng)的值必須是按鍵對(duì)應(yīng)event對(duì)象中keyCode值
Vue.config.keyCodes.aaa = 65
Vue動(dòng)態(tài)處理屬性
v-bind指令用法
跳轉(zhuǎn)
縮寫(xiě)形式
跳轉(zhuǎn)
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Vue</title><style type="text/css">[v-clock]{display:none;}</style><meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body>
<div id="app"><a v-bind:href="url">百度</a><button @click="handle"></button>//v-model事件雙向綁定其實(shí)就是使用了v-bind:value,和@input<div>{{msg}}</div><input type="text" v-bind:value="msg" @input="handle">
</div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>var vm =new Vue({el:'#app',data:{url:'http://www.baidu.com',msg:'hello'},methods:{handle:function (event){//修改url地址this.url='https://www.imooc.com/';this.msg = event.target.value;}}});
</script>
</body>
</html>
樣式綁定
控制類(lèi)名
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Vue</title><style type="text/css">.active{border: 1px solid red;width: 100px;height: 100px;}.error{background-color: orange;}</style><meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body>
<div id="app"><div v-bind:class="{active: isAcrive,error: isError}"></div><button @click="handle">切換</button>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>var vm =new Vue({el:'#app',data:{url:'http://www.baidu.com',msg:'hello',isAcrive:true,isError:true},methods:{handle:function (){//控制isActive在true和false之間切換this.isAcrive = !this.isAcrive;}}});
</script>
</body>
</html>
style樣式處理
分支循環(huán)結(jié)構(gòu)
- v-if
- v-else
- v-else-fi
- v-show
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Vue</title><style type="text/css">[v-clock]{display:none;}</style><meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body>
<div id="app"><div v-if="score>=90">優(yōu)秀</div><div v-else-if="score<90&&score>=80">良好</div><div v-if="score<80&&score>=60">一般</div><div v-else>比較差</div><div v-show="flag">11</div><button @click="handle">取反</button>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>var vm =new Vue({el:'#app',data:{score:76,flag:false},methods:{handle:function (){this.flag = !this.flag}}});
</script>
</body>
</html>
循環(huán)結(jié)構(gòu)
在Vue中如果有對(duì)象遍歷最好加上key這樣的話就不會(huì)報(bào)錯(cuò),唯一的key
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Vue</title><style type="text/css">[v-clock]{display:none;}</style><meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body>
<div id="app"><div>水果列表</div><ul><li v-for="item in fruits">{{item}}</li><li v-for="(item,index) in fruits">{{item + '____'+ index}}</li></ul>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>var vm =new Vue({el:'#app',data:{fruits:['apple','organg','banana']},methods:{}});
</script>
</body>
</html>
Vue的常用特性
- 表單操作
- 自定義指令
- 計(jì)算屬性
- 過(guò)濾器
- 監(jiān)聽(tīng)器
- 生命周期
表單操作
表單修飾符
- number:轉(zhuǎn)化為數(shù)值
- trim:去掉開(kāi)始和結(jié)尾的空格
- lazy:將input時(shí)間切換為change事件
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title><meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body>
<div id="app"><input type="text" v-model.number="age"><input type="text" v-model.trim="text"><input type="text" v-model.lazy="msg"><div>{{msg}}</div><button @click="handle">點(diǎn)擊</button>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>var vm = new Vue({el:'#app',data:{age:'',text:'',msg:''},methods:{handle:function (){console.log(this.age+1)console.log(this.text)}}})
</script>
</body>
</html>
自定義指令
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title><meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body>
<div id="app"><input type="text" v-focus>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>Vue.directive('focus',{inserted:function (el){//el表示指令綁定的元素el.focus();}})var vm = new Vue({el:'#app',data:{},methods:{}})
</script>
</body>
</html>
inserted是鉤子函數(shù),當(dāng)dom綁定的時(shí)候使用運(yùn)行
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title><meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body>
<div id="app"><input type="text" v-colors="msg">
</div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script type="text/javascript">//自定義指令帶參數(shù)Vue.directive('colors',{bind:function (el,bind){el.style.backgroundColor = bind.value.color;//通過(guò)攜帶參數(shù)來(lái)控制指令的一些具體行為}});var vm = new Vue({el:'#app',data:{msg:{color:'orange'}},methods:{}})
</script>
</body>
</html>
局部指令
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title><meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body>
<div id="app"><input type="text" v-colors="msg"><input type="text" v-focus>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script type="text/javascript">//自定義指令帶參數(shù)var vm = new Vue({el:'#app',data:{msg:{color:'orange'}},methods:{},directives:{colors:{bind:function (el,bind){el.style.backgroundColor = bind.value.color;//通過(guò)攜帶參數(shù)來(lái)控制指令的一些具體行為}},focus:{inserted:function (el){el.focus();}}}})
</script>
</body>
</html>
局部指令應(yīng)用范圍是有所限制的,全局指令是沒(méi)有限制的
計(jì)算屬性computed
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title><meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body>
<div id="app"><div>{{msg}}</div><div>{{reversString}}</div>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>var vm = new Vue({el:'#app',data:{msg:'Hello '},methods:{},//計(jì)算屬性,讓模板變得更加簡(jiǎn)單computed:{reversString:function (){return this.msg.split('').reverse().join('')}}})
</script>
</body>
</html>
計(jì)算屬性computed和methods方法存在什么差異
**
緩存特性在比較耗時(shí)的計(jì)算節(jié)省性能,計(jì)算屬性他是基于依賴來(lái)做緩存的,當(dāng)發(fā)布存在緩存機(jī)制。
計(jì)算屬性依賴:data
偵聽(tīng)器
數(shù)據(jù)變化時(shí)異步或者開(kāi)銷(xiāo)比較大
偵聽(tīng)器用法
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title><meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body>
<div id="app"><div><span>名</span><span><input type="text" v-model="firstName"></span></div><div><span>名</span><input type="text" v-model="lastName"></div><div>{{msg}}</div>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>var vm = new Vue({el:'#app',data:{firstName:'Jim',lastName:'Green',msg:''},watch:{firstName: function (val){this.msg = val + '' + this.lastName;},lastName: function (val){this.msg = this.firstName + '' + val;}}})
</script>
</body>
</html>
監(jiān)聽(tīng)器屬性的方法必須和數(shù)據(jù)里面的方法名稱一致,這樣的監(jiān)聽(tīng)才可以實(shí)現(xiàn)
監(jiān)聽(tīng)器應(yīng)用場(chǎng)景
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title><meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body>
<div id="app"><div><span>用戶名:</span><span><input type="text" v-model.lazy="uname"></span><span>{{tip}}</span></div>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>//1.采用監(jiān)聽(tīng)器用戶名稱變化//2.調(diào)用后臺(tái)接口驗(yàn)證//3.根據(jù)驗(yàn)證結(jié)果調(diào)整提示信息var vm = new Vue({el:'#app',data:{uname:'',tip:''},methods:{checkName:function (uname){//調(diào)用接口,但是可以使用定時(shí)任務(wù)方式模擬接口調(diào)用var that = this;setTimeout(function (){if (uname == 'admin'){that.tip = '用戶名存在請(qǐng)更換一個(gè)';}else{that.tip = '用戶名可以使用';}},2000)}},watch:{uname:function (val){//調(diào)用后臺(tái)接口驗(yàn)證用戶名合法性this.checkName(val);//修改提示信息this.tip = '正在驗(yàn)證。。。';}},})
</script>
</body>
</html>
過(guò)濾器
作用:格式化數(shù)據(jù),比如將字符串格式化到首字母大寫(xiě),將日期格式化為指定的格式等。
自定義過(guò)濾器
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title><meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body>
<div id="app"><input type="text" v-model="msg"><div>{{ msg | upper}}</div><div>{{msg | upper | lower}}</div><div :abc="msg| upper">測(cè)試數(shù)據(jù)</div></div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>//過(guò)濾器// Vue.filter('upper',function (val){// return val.charAt(0).toUpperCase()+val.slice(1);// });// Vue.filter('lower',function (val){// return val.charAt(0).toLowerCase()+val.slice(1);// });var vm = new Vue({el:'#app',data:{msg:''},filters:{upper: function (val){return val.charAt(0).toUpperCase()+val.slice(1);}}});
</script>
</body>
</html>
帶參數(shù)的過(guò)濾器
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title><meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body>
<div id="app"><div>{{date | format('yyyy-MM-dd')}}</div>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>//過(guò)濾器Vue.filter('format',function (val,arg){if (arg == 'yyyy-MM-dd'){var ret = '';ret += val.getFullYear()+'-'+(val.getMonth()+1) + '-' + val.getDate();console.log(ret)return ret;}console.log(1)})var vm = new Vue({el:'#app',data:{date:new Date()},});
</script>
</body>
</html>
生命周器
主要階段
- 掛載(初始化相關(guān)屬性)
- beforeCreate
- created
- beforeMount
- mounted
- 更新(元素或組線的變更操作)
- beforeUpdate
- updated
- 銷(xiāo)毀(銷(xiāo)毀相關(guān)屬性)
- beforeDestroy
- destroyed
Vue實(shí)例產(chǎn)生會(huì)經(jīng)過(guò)8個(gè)生命周期
Vue中對(duì)于數(shù)組的新概念
變異方法(修改原始數(shù)據(jù))
- push()
- pop()
- shift()
- unshift()
- splice()
- sort()
- reverse()
替換數(shù)組(形成新的數(shù)組)
- filter()
- concat()
- slice()
變異方法都會(huì)影響到數(shù)組的原始數(shù)據(jù),替換方法不會(huì)影響到數(shù)組的原始數(shù)據(jù)他會(huì)形成一個(gè)新的數(shù)組。
修改響應(yīng)式數(shù)據(jù)
- Vue.set(vm.items,indexOfltem,newValue)
- vm.$set(vm.items,indexOfItem,newValue)
1.參數(shù)一表示要處理的數(shù)組名稱
2.參數(shù)2表示要處理的數(shù)組索引
3.參數(shù)3表示要處理的數(shù)組的值