使用Vue等框架的首要原因是為了開(kāi)發(fā)效率,還是減少DOM操作的性能損失?:目前vue的基本思想都是以數(shù)據(jù)作驅(qū)動(dòng),先解析成虛擬的dom結(jié)構(gòu)(就是一串json),然后再用d
目前vue的基本思想都是以數(shù)據(jù)作驅(qū)動(dòng),先解析成虛擬的dom結(jié)構(gòu)(就是一串json),然后再用diff算法進(jìn)行最優(yōu)解析,最后才變成真正的html。這里面數(shù)據(jù)的監(jiān)聽(tīng),解析,過(guò)濾都由vue的框架完成,開(kāi)發(fā)者只需要寫最簡(jiǎn)單的樣式模版進(jìn)行vue的語(yǔ)法綁定,然后按照業(yè)務(wù)邏輯對(duì)數(shù)據(jù)本身進(jìn)行操作,模版引起就自動(dòng)相對(duì)最優(yōu)的渲染,無(wú)需進(jìn)行繁雜的dom字符串拼接操作。綜上所述vue減少了dom操作的同時(shí)也極大的促進(jìn)了開(kāi)發(fā)效率。除此之外,vue提倡組件化的思想,相同邏輯的模塊在項(xiàng)目中進(jìn)行特定的封裝。進(jìn)一步提升開(kāi)發(fā)效率。當(dāng)然還有挺多的東西沒(méi)講到,倒是也算大概回答這個(gè)問(wèn)題了
顯然是開(kāi)發(fā)效率
你還能跨過(guò)底層api調(diào)用?所謂的性能是相對(duì)而言的相對(duì)其他的框架。
這個(gè)問(wèn)題沒(méi)有疑問(wèn),為了提高開(kāi)發(fā)效率。至于性能,用框架還能比得過(guò)原生?虛擬dom不過(guò)是vue內(nèi)部運(yùn)行時(shí)的過(guò)程量,最終還是操作dom。至于說(shuō)它操作更少的dom,不用vue一樣可以做到。
Vue所提供的一些相對(duì)高級(jí)的特性,表單操作,自定義指令,計(jì)算屬性,過(guò)濾器,偵聽(tīng)器,生命周期。
表單操作的作用,用于用戶的交互,通過(guò)表單來(lái)進(jìn)行數(shù)據(jù)的交互。
基于Vue的表單操作,input單行文本,textarea多行文本,select下拉多選,radio單選框,checkbox多選框。
<!DOCTYPE html>
<html>
<head>
<meta charset=\"UTF-8\">
<title>Document</title>
<style type=\"text/css\">
form div {
height: 40px;
line-height: 40px;
}
form div span:first-child{
display: inline-block;
width: 100px;
}
</style>
</head>
<body>
<div id=\"app\">
<form>
<div>
<span>姓名:</span>
<span>
<input type=\"text\">
</span>
</div>
<div>
<span>性別:</span>
<span>
<input type=\"radio\" id=\"male\">
<label for=\"male\">男</label>
<input type=\"radio\" id=\"female\">
<label for=\"female\">女</label>
</span>
</div>
<div>
<span>愛(ài)好:</span>
<input type=\"checkbox\" id=\"ball\">
<label for=\"ball\">籃球</label>
<input type=\"checkbox\" id=\"sing\">
<label for=\"sing\">唱歌</label>
<input type=\"checkbox\" id=\"code\">
<label for=\"code\">寫代碼</label>
</div>
<div>
<span>工作</span>
<select>
<option>請(qǐng)選擇工作</option>
<option>教師</option>
<option>老師</option>
</select>
</div>
<div>
<span>個(gè)人簡(jiǎn)介</span>
<textarea></textarea>
</div>
</form>
</div>
<script type=\"text/javascript\" src=\"js/vue.js\"></script>
表單操作,雙向數(shù)據(jù)綁定v-model。表單修飾符,number轉(zhuǎn)化為數(shù)值,trim去掉開(kāi)頭和結(jié)尾的空格,lazy將input事件切換change事件
<input v-model.number=\"phone\" type=\"number\">
自定義指令,為何有自定義指令,就是內(nèi)置指令不滿足需要。
如何自定義指令
Vue.directive('focus' {
inserted: function(el){
// 獲取元素的焦點(diǎn)
el.focus();
}
})
如何使用
<input type=\"text\" v-focus>
鉤子函數(shù),一個(gè)指令定義對(duì)象可以提供以下函數(shù)。
bind只調(diào)用一次,指令第一次綁定到元素時(shí)調(diào)用,在這里可以進(jìn)行一次性的初始化設(shè)置,inserted被綁定元素插入父節(jié)點(diǎn)時(shí)調(diào)用,update所在組件的VNode更新時(shí)調(diào)用,但是可能發(fā)生在其子VNode更新之前,
componentUpdated指令所在組件的VNode以及其子VNode全部更新后調(diào)用,unbind只調(diào)用一次,指令與元素解綁時(shí)調(diào)用。
自定義指令的用法
<input type=\"text\" v-color=\"msgColor\">
// 自定義指令
Vue.directive('color', {
bind: function(el, binding) {
el.style.backgroundColor = binding.value.color;
}
});
var vm = new Vue({
el: '#app',
data: {
msg: {
color: 'red'
}
},
methods: {
handle: function() {
}
}
}
局部指令
directives: {
focus: {
// 指令的定義
inserted: function(el) {
el.focus()
}
}
}
局部指令的示例:
directives: {
color: {
bind: function(el, binding) {
el.style.backgroundColor = binding.value.color;
}
}
}
局部指令只能在本組件中使用,局部指令的應(yīng)用范圍是有限制的。
計(jì)算屬性,為什么需要計(jì)算屬性呢,表達(dá)式的計(jì)算邏輯可能會(huì)比較復(fù)雜,使用計(jì)算屬性可以是模板內(nèi)容更加簡(jiǎn)潔。
如何使用計(jì)算屬性呢?
computed: {
msgDa: function() {
return this.msg.split('').reverse().join('')
}
}
<div>{{msgDa}}</div>
// 直接調(diào)用函數(shù)名
計(jì)算屬性和方法的區(qū)別
方法是不存在緩存的,計(jì)算屬性是基于它們的依賴進(jìn)行緩存的。只要值不變就不重新計(jì)算。方法不存在緩存的機(jī)制。
比較耗時(shí)的計(jì)算可以節(jié)省性能,同樣的結(jié)果沒(méi)有比較計(jì)算兩次,用了兩次,只執(zhí)行一次,緩存的問(wèn)題,計(jì)算屬性計(jì)算的結(jié)果緩存起來(lái)了,再次訪問(wèn),就訪問(wèn)計(jì)算后的結(jié)果。
<div> {{msgDa}} </div>
<div> {{msgDa}} </div>
computed: {
msgDa: function() {
console.log('只會(huì)打印一次');
return this.msg.split('').reserse().join('');
}
}
方法
methods: {
msgDa: function() {
console.log('ddd');
return this.msg.split('').reverse().join('');
}
}
<div>{{msgDa()}}</div>
偵聽(tīng)器,是用來(lái)偵聽(tīng)數(shù)據(jù)的變化,數(shù)據(jù)一旦發(fā)生變化就會(huì)通知偵聽(tīng)器所綁定的方法,偵聽(tīng)器綁定方法,數(shù)據(jù)變化時(shí)執(zhí)行異步或開(kāi)銷較大的操作。計(jì)算屬性只能用于一些簡(jiǎn)單的操作。
使用方法
watch: {
firstName: function(val) {
// val表示變化之后的值
this.fullName = val + this.lastName;
},
lastName: function(val) {
this.fullName = this.firstName + val;
}
}
驗(yàn)證用戶名的例子,通過(guò)v-model實(shí)現(xiàn)數(shù)據(jù)綁定,需要提供提示信息,需要偵聽(tīng)器監(jiān)聽(tīng)輸入信息的變化。采用偵聽(tīng)器監(jiān)聽(tīng)用戶名的變化,調(diào)用后臺(tái)接口進(jìn)行驗(yàn)證,根據(jù)驗(yàn)證的結(jié)果調(diào)整提示信息,需要修改觸發(fā)的事件。
表單域的修飾符
<input type=\"text\" v-model.lazy=\"uname\">
Vue中的數(shù)據(jù)渲染
{{}}
<div id=\"app\">{{ message }}</div>
var vm = new Vue({
el: '#app',
data:{
message:\"達(dá)達(dá)前端\"
}
})
v-html是可以解讀html標(biāo)簽渲染
<div id=\"app\" v-html='message'>
<input type=\"text\"/>
<div >{{ message }}</div>
</div>
var vm = new Vue({
el: '#app',
data:{
message:\"<div style='background:red;width:60px;height:60px'></div>\"
}
})
v-text
v-text是用于操作純文本,它會(huì)替代顯示對(duì)應(yīng)的數(shù)據(jù)對(duì)象上的值。
<div id=\"app\">{{ message }}</div>
var app = new Vue({
el : '#app',
data : {
message : 'hello world'
}
})
過(guò)濾器,什么是過(guò)濾器,它的作用是什么呢?
用來(lái)格式化數(shù)據(jù),比如把字符串格式變?yōu)榇髮懀瑢⑷掌诟袷阶兓癁橹付ǖ母袷降取?/p>
自定義過(guò)濾器
Vue.filter('過(guò)濾器名稱', function(value) {
// 過(guò)濾器業(yè)務(wù)邏輯
})
// 過(guò)濾器的使用
<div> {{msg | upper}} </div>
Vue.filter('upper', function(val) {
return val.chatAt(0).toUpperCase() + val.slice(1);
})
局部過(guò)濾器
filters: {
capitalize;function() {}
}
Vue.filter('format', function(value, arg1){
})
使用
<div>{{date | format('yyyy-MM-dd')}}</div>
日期格式,y表示年,M表示年中的月份1-12,d表示月份中的天1-31,h表示小時(shí)0-23,m表示分0-59,s表示秒0-59等。
指令是用來(lái)操作dom,什么是組件,組件是html css js等的一個(gè)聚合體。組件化,可以加速項(xiàng)目的進(jìn)度,可以在項(xiàng)目中復(fù)用,將一個(gè)完整功能的一部分可以多處使用。
Vue.component的主要功能是注冊(cè)組件,不是創(chuàng)建組件。
所有的 Vue.js 組件都是被擴(kuò)展的 Vue 實(shí)例,使用Vue.component注冊(cè)組件時(shí),創(chuàng)建Vue實(shí)例必須在注冊(cè)組件的代碼的后面,否則注冊(cè)的組件不會(huì)被顯示。
注冊(cè):
<div id=\"app\">
<Father></Father>
<gd-da></gd-da>
</div>
</body>
<script>
Vue.component('Father',{
template: '<div> 這里是全局注冊(cè) </div>'
})
new Vue({
el: '#app',
components: {
'GdDa': {
template: '<div> 這里是局部注冊(cè) </div>'
}
}
})
</script>
template
類型:string
說(shuō)明:
一個(gè)字符串模板作為 Vue 實(shí)例的標(biāo)識(shí)使用。模板將會(huì) 替換 掛載的元素。掛載元素的內(nèi)容都將被忽略,除非模板的內(nèi)容有分發(fā) slot。
CDN引入
NPM安裝
完整代碼如下:
<!DOCTYPE html>
<html>
<head>
<meta charset=\"UTF-8\">
<title>Vue入門之Helloworld</title>
<!--引入Vue庫(kù)-->
<script src=\"https://cdn.jsdelivr.net/npm/vue/dist/vue.js\"></script>
</head>
<body>
<!--創(chuàng)建一個(gè)Div-->
<div id=\"app\">
<!--Vue的模板的綁定數(shù)據(jù)的方法,用兩對(duì)花括號(hào)進(jìn)行綁定Vue中的數(shù)據(jù)對(duì)象的屬性 -->
{{message}}
</div>
<!--創(chuàng)建Vue的對(duì)象-->
<script type=\"text/javascript\">
var app=new Vue({ // 創(chuàng)建Vue對(duì)象。Vue的核心對(duì)象。
el:'#app', // el屬性:把當(dāng)前Vue對(duì)象掛載到 div標(biāo)簽上,#app是id選擇器
data:{ // Vue對(duì)象中綁定的數(shù)據(jù)
message:'hello Vue!' // 自定義的數(shù)據(jù)
}
})
</script>
</body>
</html>
輸出結(jié)果:
內(nèi)部指令
v-if 、v-else、 v-show、v-else-if
<div v-if=\"isLogin\">你好</div>
<div v-else>請(qǐng)登錄后操作</div>
<div v-show=\"isLogin\">你好</div>
<div v-if=\"type === 'A'\">A</div>
<div v-else-if=\"type === 'B'\">B</div>
<div v-else-if=\"type === 'C'\">C</div>
<div v-else>Not A/B/C</div>
v-if與v-show的區(qū)別
v-if:開(kāi)銷較高,在運(yùn)行時(shí)條件很少改變時(shí)使用。
v-show:開(kāi)銷較小,在常頻繁地切換時(shí)使用。
v-for
<!-- 模板 -->
<div id=\"app\">
<ul>
<li v-for=\"item in items\">
{{item}}
</li>
</ul>
</div>
<!--JS代碼 -->
<script type=\"text/javascript\">
var app=new Vue({
el:'#app',
data:{
items:[1,2,3,4]
}
})
</script>
對(duì)象遍歷
<!-- 模板 -->
<div id=\"app\">
<ul>
<li v-for=\"(value, key, index) in object\">
{{ index }}. {{ key }} - {{ value }}
</li>
</ul>
</div>
<!--JS代碼 -->
<script type=\"text/javascript\">
var app=new Vue({
el:'#app',
data:{
object: {
firstName: 'da',
lastName: 'dada'
}
}
})
</script>
v-text,{{xxx}}取值有個(gè)弊端
當(dāng)網(wǎng)速很慢或javascript出錯(cuò)時(shí),會(huì)在頁(yè)面顯示{{xxx}},Vue提供的v-text可以解決這個(gè)
v-html
用于輸出html代碼
生命周期
階段一:創(chuàng)建和掛載
beforecreated:el 和 data 并未初始化
created:完成了 data 數(shù)據(jù)的初始化,el沒(méi)有
beforeMount:完成了 el 和 data 初始化
mounted :完成掛載
階段二:更新
beforeUpdate:虛擬DOM中根據(jù)data變化去更新html
updated:將虛擬DOM更新完成的HTML更新到頁(yè)面中
階段三:銷毀
beforeDestroy:銷毀之前調(diào)用
destroyed:銷毀之后調(diào)用,之后再執(zhí)行app.message= ‘hello vue’,頁(yè)面不會(huì)同步更新。
首先更正下,VUE不是一個(gè)框架而是一個(gè)js庫(kù)。他就像jquery一樣是用來(lái)方便操作dom的,沒(méi)人說(shuō)jquery是框架吧?個(gè)人感覺(jué),使用vue,react主要還是為了前端單頁(yè)程序開(kāi)發(fā)的工程化。大家都知道手機(jī)web程序使用單頁(yè)的優(yōu)勢(shì),如果使用jquery或純js開(kāi)發(fā)單頁(yè)程序,工程化時(shí)肯定也會(huì)涉及到類似vue或react這種將模板,js,css模塊化的問(wèn)題,F(xiàn)在,有了vue,react,你就不用自己進(jìn)行模塊化了。因此提升開(kāi)發(fā)效率是一定的,至于能否提升性能,這個(gè)不好說(shuō)。
光回答你這個(gè)問(wèn)題的話,使用Vue主要是開(kāi)發(fā)效率問(wèn)題。前端三大框架,React、Vue、Angular,都實(shí)現(xiàn)了數(shù)據(jù)響應(yīng)模式,在具體實(shí)現(xiàn)上大同小異,但是Vue在實(shí)現(xiàn)上更加輕便。剛剛看回答里,有人說(shuō)vue不算框架,其實(shí)相對(duì)來(lái)說(shuō)vue框架屬性更強(qiáng),自帶的路由管理,狀態(tài)管理進(jìn)行了深度適配;而React本質(zhì)上更像一個(gè)組件庫(kù),相應(yīng)的框架屬性需要其他三方庫(kù)來(lái)輔助完成。
同時(shí)目前的用戶環(huán)境來(lái)說(shuō)(瀏覽器性能很好),dom操作如果不是特別特別密集型,對(duì)性能影響微乎其微。vue等使用虛擬dom技術(shù),雖然減少了dom的直接操作,但是同樣增加了很多復(fù)雜的后臺(tái)計(jì)算,這里的得失比較,反而直接操作dom的效率會(huì)更高。目前有一個(gè)非virtual dom的框架svelte,同樣實(shí)現(xiàn)了相應(yīng)式,據(jù)其介紹性能更好。 當(dāng)然其實(shí),如果不是特別顆粒度的開(kāi)發(fā),js的計(jì)算和dom操作對(duì)目前客戶端來(lái)說(shuō)性能影響不算太大。
一天中什么時(shí)候運(yùn)動(dòng)減肥效果好抓 小孩能不能練啞鈴多大的孩子適合 小孩嘴唇起皮怎么辦怎樣才能預(yù)防 孩子的羅圈腿是怎么形成的三大因 孩子早戀怎么辦如何有效疏導(dǎo)孩子 醫(yī)生婆婆稱自己專業(yè)孩子的事必須 兒子成人禮送什么禮物好呢給你孩 有孩子的夫妻千萬(wàn)不要離婚對(duì)于孩 小孩千萬(wàn)別讓老人帶的說(shuō)法正確嗎 自卑缺乏安全感的孩子怎么改善 怎么讓孩子開(kāi)口說(shuō)話 這幾個(gè)方法 怎么讓孩子吃飯 教你如何讓孩子 怎么管教不聽(tīng)話的孩子 家長(zhǎng)首先 頑皮的孩子怎么管教的 這些方法 叛逆期的孩子怎么管教 引導(dǎo)孩子 孩子性格軟弱怎么辦 懦弱的性格 孩子性格偏激怎么辦 孩子性格偏 孩子性格固執(zhí)怎么辦 家長(zhǎng)們不妨 愛(ài)惹事的孩子怎么管教 不妨試試 養(yǎng)育優(yōu)秀的孩子具備特征,家長(zhǎng)要 高考數(shù)學(xué)難出新天際,可有的孩子 “做胎教”和“不做胎教”的孩子 花費(fèi)十幾萬(wàn)只考了302分 媽媽覺(jué)得 甘肅作弊考生留下來(lái)的疑團(tuán),是怎 一舉奪魁!高三學(xué)生離校時(shí),校領(lǐng) 高考釘子戶:26次參加高考,今年 D2809次列車因泥石流脫線!此類 “女兒16歲,學(xué)校宿舍里分娩了” 扭曲邪門的內(nèi)容,頻頻出現(xiàn)在教科 川渝地區(qū)幾所大學(xué)實(shí)力很牛!四川