vueçå½å¨æé©ååç»ä»¶
çå½å¨æé©å
æ¯ä¸ª Vue å®ä¾å¨è¢«å建æ¶é½è¦ç»è¿ä¸ç³»åçåå§åè¿ç¨ââä¾å¦ï¼éè¦è®¾ç½®æ°æ®çå¬ãç¼è¯æ¨¡æ¿ãå°å®ä¾æè½½å° DOM 并卿°æ®ååæ¶æ´æ° DOM çãåæ¶å¨è¿ä¸ªè¿ç¨ä¸ä¹ä¼è¿è¡ä¸äºå«åçå½å¨æé©åç彿°ï¼è¿ç»äºç¨æ·å¨ä¸åé¶æ®µæ·»å èªå·±ç代ç çæºä¼ã
çå½å¨æå¾ç¤º
é¨ååèï¼https://segmentfault.com/a/1190000008010666?utm_source=tag-newestï¼
beforecreatedï¼el å data å¹¶æªåå§å
created:å®æäº data æ°æ®çåå§åï¼el没æ
beforeMountï¼å®æäº el å data åå§å
mounted ï¼å®ææè½½
å¦å¤å¨æ 红å¤ï¼æä»¬è½åç°elè¿æ¯ {{message}}ï¼è¿éå°±æ¯åºç¨ç Virtual DOMï¼èæDomï¼ææ¯ï¼å
æåå ä½äºãå°åé¢mountedæè½½çæ¶ååæå¼æ¸²æè¿å»ã
è¿éæä»¬å¨ chrome consoleéæ§è¡ä»¥ä¸å½ä»¤
app.message= âyes !! I doâ;
ä¸é¢å°±è½çå°dataéçå¼è¢«ä¿®æ¹åï¼å°ä¼è§¦åupdateçæä½ã
destroy ç¸å
³
æå
³äºéæ¯ï¼ææ¶è¿ä¸æ¯å¾æ¸
æ¥ãæä»¬å¨consoleéæ§è¡ä¸å½ä»¤å¯¹ vueå®ä¾è¿è¡éæ¯ã鿝宿åï¼æä»¬åéæ°æ¹åmessageçå¼ï¼vueä¸å对æ¤å¨ä½è¿è¡ååºäºã使¯åå
çæçdomå
ç´ è¿åå¨ï¼å¯ä»¥è¿ä¹çè§£ï¼æ§è¡äºdestroyæä½ï¼åç»å°±ä¸ååvueæ§å¶äºã
app.$destroy();
è¿ä¹å¤é©å彿°ï¼æä»¬æä¹ç¨å¢ï¼
beforecreate : 举个ä¾åï¼å¯ä»¥å¨è¿å 个loadingäºä»¶
created ï¼å¨è¿ç»æloadingï¼è¿åä¸äºåå§åï¼å®ç°å½æ°èªæ§è¡
mounted ï¼ å¨è¿åèµ·å端请æ±ï¼æ¿åæ°æ®ï¼é
åè·¯ç±é©ååä¸äºäºæ
beforeDestroyï¼ ä½ ç¡®è®¤å é¤XXåï¼ destroyed ï¼å½åç»ä»¶å·²è¢«å é¤ï¼æ¸
空ç¸å
³å
容
ç»ä»¶
ç»ä»¶æ¯å¯å¤ç¨ç Vue å®ä¾ï¼ä¸å¸¦æä¸ä¸ªååï¼æ¯ä¸ä¸ªç»ä»¶åªè½æä¸ä¸ªæ ¹èç¹ãæä»¬å¯ä»¥å¨ä¸ä¸ªéè¿ new Vue å建ç Vue æ ¹å®ä¾ä¸ï¼æè¿ä¸ªç»ä»¶ä½ä¸ºèªå®ä¹å ç´ æ¥ä½¿ç¨ãå 为ç»ä»¶æ¯å¯å¤ç¨ç Vue å®ä¾ï¼æä»¥å®ä»¬ä¸ new Vue æ¥æ¶ç¸åçé项ï¼ä¾å¦ dataãcomputedãwatchãmethods 以åçå½å¨æé©åçãä» æçä¾å¤æ¯å el è¿æ ·æ ¹å®ä¾ç¹æçé项ãå¯ä»¥å¨ç»ä»¶å é¨ç»§ç»ä½¿ç¨vueçå ¶ä»æ¹æ³æ¯å¦ï¼lifeCircle,filter,computedï¼å¨ä¸ä¸ªvueå®ä¾ä¸ æ¯ä¸ä¸ªç»ä»¶é½æ¯ç¬ç«åå¨çï¼å®é½æèªå·±ä¸å¥åºå®ççå½å¨æå½æ°ådata以åå ¶ä»vueç坿ä½å±æ§åæ¹æ³
ç»ä»¶çå¤ç¨
ä½ å¯ä»¥å°ç»ä»¶è¿è¡ä»»ææ¬¡æ°çå¤ç¨ï¼æ¯ä¸ªç»ä»¶é½ä¼åèªç¬ç«ç»´æ¤å®ç countãå ä¸ºä½ æ¯ç¨ä¸æ¬¡ç»ä»¶ï¼å°±ä¼æä¸ä¸ªå®çæ°å®ä¾è¢«å建ã
dataå¿ é¡»æ¯ä¸ä¸ªå½æ°
data 表示ç»ä»¶ä¸ä½¿ç¨çæ°æ®ï¼ç»ä»¶ä¸çæ°æ®å¿ é¡»æ¯ä¸ä¸ªfunction,å ¶è¿åå¼ä¸ºdataçå¼ï¼ï¼ä¸ä¸ªç»ä»¶ç data éé¡¹å¿ é¡»æ¯ä¸ä¸ªå½æ°ï¼å æ¤æ¯ä¸ªå®ä¾å¯ä»¥ç»´æ¤ä¸ä»½è¢«è¿å对象çç¬ç«çæ·è´ï¼å¦æ Vue 没æè¿æ¡è§åï¼ç¹å»ä¸ä¸ªæé®å°±å¯è½ä¼å½±åå°å ¶å®ææå®ä¾ï¼ã
ç»ä»¶çç»ç»
为äºè½å¨æ¨¡æ¿ä¸ä½¿ç¨ï¼è¿äºç»ä»¶å¿ é¡»å æ³¨å以便 Vue è½å¤è¯å«ãè¿éæä¸¤ç§ç»ä»¶ç注åç±»åï¼å ¨å±æ³¨ååå±é¨æ³¨åãä¸é¢æ¯éè¿ Vue.component å ¨å±æ³¨åçï¼
Vue.component(âmy-component-nameâ, {
// ⦠options â¦
})
å±é¨ç»ä»¶ä¸å ¨å±ç»ä»¶
å¨vueä¸ä½¿ç¨ç»ä»¶éè¦å
å¼å
¥,éè¿å¨å®ä¾ä¸ä½¿ç¨componentsèç¹è¿è¡è®¾ç½®ï¼ æ¤ç§å®ä¹ç»ä»¶çæ¹å¼å«å±é¨ç»ä»¶
å
¨å±ç»ä»¶
// åæ°ä¸ ç»ä»¶çåå
// åæ°äº ä¸ä¸ªå¯¹è±¡ ï¼ç¨æ¥è®¾ç½®ç»ä»¶ç屿§
// å
¨å±ç»ä»¶å®ä¹å¥½ä¹åå¯ä»¥ç´æ¥ä½¿ç¨ ä¸éè¦å¨componentsä¸å注å
Vue.component(âaaaâ, {
template: <h5>è¿æ¯ä¸ä¸ªç»ä»¶</h5>
})
å
¨å±æ³¨åçç»ä»¶å¯ä»¥ç¨å¨å
¶è¢«æ³¨åä¹åçä»»ä½ (éè¿ new Vue) æ°å建ç Vue æ ¹å®ä¾ï¼ä¹å
æ¬å
¶ç»ä»¶æ ä¸çææåç»ä»¶ç模æ¿ä¸ã
注æï¼å¨vueä¸å¦æä½¿ç¨é©¼å³°å½åçæ¶å å¨templateä¸ä½¿ç¨ç»ä»¶çæ¶åéè¦ä½¿ç¨-æåè¯ååå²
<div id="app">
<Hello-World></Hello-World>//æ ç¾ä¸åºå大å°åï¼å æ¤å¯ä»¥hello-world
</div>
var app = new Vue({
el: '#app',
components: {
HelloWorld: {
template: `<h5>Hello Worldï¼</h5>`
}
}
})
ç»ä»¶ä¹é´å¯ä»¥è¿è¡åµå¥è°ç¨
éè¿this.$attrså¯ä»¥è·åå°ç¶ç»ä»¶ä¼ éè¿æ¥çæ°æ®ï¼ å¨ä½¿ç¨å±é¨ç»ä»¶çæ¶åå¿ é¡»å è¿è¡æ³¨å,åªé使ç¨å°±è¦å¨åªéè¿è¡æ³¨å
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>åµå¥</title>
<style>
.list-item {
border: 1px solid deeppink;
padding: 0.2rem 1rem;
margin: 0.5rem;
}
</style>
</head>
<body>
<div id="app">
<list-item :info="book" k="abc" b="1234" v-for="book in books"></list-item>
</div>
<script src="./lib/vue.js"></script>
<script>
const hello = {
template: '<h3>Hi!!!!!!!!!!</h3>'
}
Vue.component('list-item', {
template: `<div class="list-item">
<h5 class="title">{{data.title}}</h5>
<p class="desc">ä½è
:{{data.author}}</p>
<book-price :p="data.price"></book-price>
<hello></hello>
</div>`,
data() {
return {
data: {
title: '',
author: '',
price: '',
}
}
},
created() {
// debugger;
console.log(this.$attrs) // this.$attrså¯ä»¥è·åå°å¤å±ç»ä»¶ä¼ éè¿æ¥çæ°æ®
this.data = this.$attrs.info;
},
components: {
hello,
},
})
Vue.component('book-price', {
template: `<div>
<p :style="priceClass">ï¿¥{{price}}å
</p>
<hello></hello>
</div>`,
data() {
return {
priceClass: {
color: 'red',
fontSize: '1.5rem',
},
price: 0,
}
},
created() {
console.log(this.$attrs)
this.price = this.$attrs.p;
},
components: {
hello,
},
})
var app = new Vue({
el: '#app',
data: {
books: [{
title: 'ä¸å½æ¼ä¹',
price: 45.98,
author: 'ç½è´¯ä¸',
}, {
title: 'æ°´æµä¼ ',
price: 52.31,
author: 'æ½è庵',
}, {
title: 'ä»ä½ çå
¨ä¸çè·¯è¿',
price: 29.82,
author: 'å¼ åä½³',
}],
}
});
</script>
</body>
</html>
ç»ä»¶ä¼ å¼
éè¿$attrsä¼ éç屿§å¼æ¯æ²¡æå¨propsæ°ç»ä¸å®ä¹ç屿§
propså¯ä»¥è·åå°ææç屿§
vueå¼å常è§ä¼ 弿¹å¼
- åç»ä»¶ä¼ ç¶ç»ä»¶ä¼ å¼
VUEä¸åç»ä»¶åç¶ç»ä»¶ä¼ å¼ ä½¿ç¨äºä»¶æ´¾å
å¨åç»ä»¶å é¨ä½¿ç¨this.$emitæ´¾åäºä»¶
å¨ç¶ç»ä»¶ä¸ä½¿ç¨@æv-onç»å®äºä»¶ - ç¶ç»ä»¶ä¼ åç»ä»¶ä¼ å¼
VUEä¸ç¶ç»ä»¶ååç»ä»¶è¿è¡ä¼ å¼ä½¿ç¨propsï¼ä½¿ç¨æ¤ç§æ¹å¼æ¶å¨åç»ä»¶ä¸å¯ä»¥ç´æ¥éè¿this.å¼çåç§° è¿è¡è·å
ä¸é¢çä¾åå å«ä¸é¢ä¸¤ç§
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>ç»ä»¶ä¹é´ä¼ å¼</title>
</head>
<body>
<div id="app">
<h5>å½å计æ°å¨çå¼ä¸º:{{c}}</h5>
<counter @plusadd="plusAddHandle" :step1="2" step2="3" a="abc" b="æå«MT"></counter>
<!-- <counter :step1="5"></counter>
<counter :step1="7"></counter> -->
</div>
<script src="./lib/vue.js"></script>
<script>
Vue.component('counter', {
template: `<button @click="plusHandle">å½å计æ°å¼-{{count}}</button>`,
data() {
return {
count: 1,
step: 1,
}
},
methods: {
plusHandle() {
this.count += this.step1;
this.$emit('plusadd', this.count); // æ´¾åèªå®ä¹äºä»¶
}
},
props: ['step1', 'step2'],
created() {
// debugger
console.log(this.$props);
console.log(this.$attrs);
console.log(this.step1);
}
})
var app = new Vue({
el: '#app',
data: {
c: 0,
},
methods: {
plusAddHandle(params) {
this.c = params;
}
}
})
</script>
</body>
</html>
- éç¶åç»ä»¶ä¼ å¼
ç¨ä¸é¢çæ¹å¼ï¼äºä»¶æ»çº¿
卿ç»ä»¶-äºä»¶æ»çº¿
å¨ä¸è¿°ç¤ºä¾ä¸ï¼currentTabComponent å¯ä»¥å
æ¬å·²æ³¨åç»ä»¶çååï¼æä¸ä¸ªç»ä»¶çé项对象ã
为äºè§£å³éç¶åç»ä»¶ä¹é´çä¼ å¼é®é¢ï¼å¼å
¥äºä»¶æ»çº¿
å¨vueä¸ä½¿ç¨ä¸ä¸ªç©ºç½çVue对象ä½ä¸ºä¸ä¸ªEventBus,ç¨æ¥åäºä»¶ççå¬åæ´¾å
var eventBus = $eventBus; // æ¤ç§å®ä¹ç屿§å¯ä»¥å¨å®ä¾ä¸è¿è¡è®¿é®
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>卿ç»ä»¶</title>
<style>
html, body {
margin: 0;
padding: 0;
width: 100%;
height: 100%;
}
.nav {
background-color: deeppink;
padding: 1.5rem 1rem;
height: 60px;
}
.nav ul {
margin: 0;
padding: 0;
}
.nav ul li {
float: left;
margin: 1.5rem;
list-style: none;;
}
.nav a {
color: #fff;
cursor: pointer;
}
.nav a.cur {
color: greenyellow;
}
.product {
border-bottom: 1px solid #ccc;
padding: 0.2rem 0.5rem;
}
</style>
</head>
<body>
<div id="app">
<navbar @pagchange="changePageHandle"></navbar>
<component :is="currentPage"></component>
</div>
<script src="./lib/vue.js"></script>
<script>
const Nav = {
template: `
<div class="nav">
<ul>
<li><a :class="this.selIndex==0? 'cur': ''" @click="navClick(0, 'Home')">é¦é¡µ</a></li>
<li><a :class="this.selIndex==1? 'cur': ''" @click="navClick(1, 'List')">ååå表页</a></li>
<li><a :class="this.selIndex==2? 'cur': ''" @click="navClick(2, 'Cart')">è´ç©è½¦ã{{cartCount}}ã</a></li>
<li><a :class="this.selIndex==3? 'cur': ''" @click="navClick(3, 'Us')">å
³äºæä»¬</a></li>
</ul>
</div>
`,
data() {
return {
selIndex: 0,
cartCount: 0
}
},
methods: {
navClick(index, page) {
this.$emit('pagchange', page); // åç»ä»¶ä¼ å¼å°ç¶ç»ä»¶
this.selIndex = index
}
},
created() {
this.$eventBus.$on('addToCartEvent', (id) => {
console.log(id);
console.log(this);
this.cartCount += 1;
})
}
}
const Home = {
template: `
<div>
<h1>ææ¯é¦é¡µ</h1>
</div>
`
}
const List = {
template: `
<div>
<div v-for="item in products" class="product">
<h3>{{item.name}}</h3>
<p>{{item.price}}<button @click="addToShopCart(item.id)">å å
¥è´ç©è½¦</button></p>
</div>
</div>
`,
data() {
return {
products: [{
id: 1,
name: 'iphone18',
price: 19999,
}, {
id: 2,
name: 'vivo 32',
price: 5200
}, {
id: 3,
name: 'redmi 10',
price: 3000,
}]
}
},
methods: {
addToShopCart(id) {
this.$eventBus.$emit('addToCartEvent', id); // 使ç¨$eventBus对象派åä¸ä¸ªäºä»¶
}
}
}
const Cart = {
template: `
<div>
<h1>ææ¯è´ç©è½¦</h1>
</div>
`
}
const Us = {
template: `
<div>
<h1>å
³äºæä»¬</h1>
</div>
`
}
var $eventBus = new Vue(); // 使ç¨ä¸ä¸ªç©ºç½çVUEå®ä¾ä½ä¸ºä¸é´åªä»
Vue.prototype.$eventBus = $eventBus; // æ¤ç§å®ä¹ç屿§å¯ä»¥å¨å®ä¾ä¸è¿è¡è®¿é®
var app = new Vue({
el: '#app',
components: {
navbar: Nav,
Home,
List,
Cart,
Us
},
data: {
currentPage: 'Home'
},
methods: {
changePageHandle(page) {
this.currentPage = page;
}
}
})
</script>
</body>
</html>