å ¥åVue
Vue (è¯»é³ /vjuË/ï¼ç±»ä¼¼äº view) æ¯ä¸å¥ç¨äºæå»ºç¨æ·çé¢çæ¸è¿å¼æ¡æ¶ãä¸å ¶å®å¤§åæ¡æ¶ä¸åçæ¯ï¼Vue 被设计为å¯ä»¥èªåºåä¸éå±åºç¨ãVue çæ ¸å¿åºåªå ³æ³¨è§å¾å±ï¼ä¸ä» æäºä¸æï¼è¿ä¾¿äºä¸ç¬¬ä¸æ¹åºææ¢æé¡¹ç®æ´åãå¦ä¸æ¹é¢ï¼å½ä¸ç°ä»£åçå·¥å ·é¾ä»¥ååç§æ¯æç±»åºç»åä½¿ç¨æ¶ï¼Vue ä¹å®å ¨è½å¤ä¸ºå¤æçå页åºç¨æä¾é©±å¨ã
2|1ç¹ç¹ï¼åæ£å°±æ¯å¥½ï¼ç¨å®å°±å¯¹äºï¼
- ææ¡£é½å ¨ï¼ä¸ææ¯æè¶ 级å好
- å¨è¾¹ç³»ç»å¼ºå¤§
- æäºä¸æ
- 便äºä¸å ¶ä»ä»£ç åºæ´å
- æ ¸å¿æä»¶ä½ç§¯å°
- ç»ä»¶åå¼å
- èæææ¡£å¯¹è±¡æ¨¡åï¼Virtual DOMï¼ï¼æ§è½ä¼ç§
- æ¸è¿å¼æ¡æ¶çç念ï¼å³ãæ¢æ¯æ¡æ¶ï¼å䏿¯æ¡æ¶ã
- æä¾æ¯ææ··åé¢å¤çå¨çãä½ä¸º ES 模åç¼è¯çåæä»¶ç»ä»¶çæ¡æ¶
2|2å®è£
<!-- å¼åç¯å¢çæ¬ï¼å å«äºæå¸®å©çå½ä»¤è¡è¦å --> <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script> <!-- ç产ç¯å¢çæ¬ï¼ä¼åäºå°ºå¯¸åé度 --> <script src="https://cdn.jsdelivr.net/npm/vue"></script>
3|0ç解模æ¿-Vueå¦ä½çæHtml
3|1示ä¾-1
代ç ä»ç»
å ·ä½å 容æ¥çHTMLæä»¶åJSæä»¶
使ç¨{{}}æjsä¸çæ°æ®åµå ¥å°htmlä¸
HTMLæä»¶
<!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>vue-01-hello</title> </head> <body> <div id="app"> {{ message }} </div> <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script> <script src="js/start.js"></script> </body> </html>
JSæä»¶
var app = new Vue({ el: '#app', data: { message: 'Hello Vue!ææ¥å¦ï¼', } })
æ§è¡ç»æ
3|2示ä¾-2
代ç ä»ç»
å ·ä½å 容æ¥çHTMLæä»¶åJSæä»¶
// å°messageå 容æåï¼ååºï¼åç»åã {{ message.split('').reverse().join('') }} // å°nameå符串åæå®åç¬¦ä¸²æ¼æ¥ {{ name + '-slfsjflsfs'}} // æå°todoä¸çæ°æ® {{ todo }} // 夿isBusyçåï¼å¦æä¸ºtrueæ§è¡"é常å¿"ï¼ä¸ºfalseåæ§è¡"䏿ä¹å¿" {{ isBusy ? "é常å¿" : '䏿ä¹å¿' }} // 模æ¿ä¸æ¾ç¤ºçå¼å§ç»ä¸ºå符串 // ä¾å¦myHtml: '<p style="color:red">è¿éæ¯çº¯html</p>' // æ¾ç¤ºå 容为ï¼ç¨æ¨¡æ¿æ¾ç¤ºï¼ <p style="color:red">è¿éæ¯çº¯html</p> ç¨æ¨¡æ¿æ¾ç¤ºï¼ {{ myHtml }} // 妿è¦ç¨htmlæ¾ç¤ºåéä¸å¼ï¼åä½¿ç¨ v-html // æ ¼å¼ v-html="åé" <span v-html="myHtml"></span>
HTMLæä»¶
<!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>vue-02-模æ¿</title> </head> <body> <div id="app"> {{ message.split('').reverse().join('') }} <div> {{ name + '-slfsjflsfs'}} </div> <div> {{ todo }} </div> <h3>ç°å¨å¿ä¸å¿ï¼</h3> <p>{{ isBusy ? "é常å¿" : '䏿ä¹å¿' }}</p> <div> ç¨æ¨¡æ¿æ¾ç¤ºï¼ {{ myHtml }} </div> <div> ç¨v-htmlæ¾ç¤º <span v-html="myHtml"></span> </div> </div> <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script> <script src="js/start.js"></script> </body> </html>
JSæä»¶
var app = new Vue({ el: '#app', data: { message: 'Hello Vue!ææ¥å¦ï¼', name: 'Riy' + 'aaabbb', todo: 'å¦ä¹ Vue', isBusy: false, myHtml: '<p style="color:red">è¿éæ¯çº¯html</p>', } })
æ§è¡ç»æ
4|0Vueç页颿¸²æä¸ç»å®
4|1代ç ä»ç»
å ·ä½å 容æ¥çHTMLæä»¶åJSæä»¶
// v-showæ§å¶htmlæ¯å¦æ¾ç¤ºï¼ä¸ºtrueæ¶æ¾ç¤ºï¼ä¸ºfalseæ¯éè <div v-show="true">v-show ???</div> // è¿ä»£å¯¹è±¡æ°ç»ä¸ index为索å¼å¼ï¼todo为æ°ç»çæ¯ä¸é¡¹ v-for="(todo, index) in todoList" // è¿ä»£å¯¹è±¡æ¶ï¼key为é®ï¼itemä¸ºå¼ v-for="(item, key) in user" // æ ·å¼ç»å®ï¼è¿é使ç¨äº3ç§æ¹å¼ï¼å ¶ä¸ v-bind: å¯ç®å为 : // classç´æ¥ç»å®æ ·å¼ï¼ç»å®å±æ§æå±æ§æ°å¼ class="error" v-bind:class="test1" :class="[activeClass, errorClass]" // v-modelååç»å®ï¼éè¦ï¼ï¼ // ä¸ç§ä¿®é¥°ç¬¦ï¼lazyï¼æ§å¶è¾å ¥æ°æ®åæ¥ãnumberï¼æ§å¶æ°æ®ä¸ºintï¼trimï¼å»æååç©ºæ ¼ // placeholder="edit me" è¾å ¥æ¡é»è®¤å¼ä¸º edit me // 使ç¨v-modelï¼è¾å ¥æ¡é»è®¤å¼åä¸ºå±æ§å¼ <input v-model.lazy="message" placeholder="edit me">
4|2HTMLæä»¶
<!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"> <style> .active { background-color: yellow; } .error { color: red; border: 1px solid red; font-size: 20px; } </style> <title>vue-03-渲æåç»å®</title> </head> <body> <div id="app"> <!-- è¿éæ¯æ¡ä»¶æ¸²æï¼ä½¿ç¨v-if --> <div v-if="isShow"> è¿æ¯v-ifä¸ºçæ¾ç¤ºç </div> <div v-else> è¿æ¯v-ifä¸ºåæ¾ç¤ºç </div> <hr> <div v-if="username=='Riy'"> è¿æ¯:ååçäºRiy </div> <div v-else-if="username=='lilei'"> è¿æ¯:ååçäºlilei </div> <div v-else> è¿æ¯ v-elseï¼username={{ username }} </div> <hr> <div v-show="true"> v-show ??? </div> <hr> <h2>v-for</h2> <ul> <li v-for="(todo, index) in todoList" :key="todo.id"> {{ index }} -- {{ todo.date }} : {{ todo.thing }} </li> </ul> <ul> <li v-for="(item, key) in user" :key="item.id"> {{ key }} : {{ item }} </li> </ul> <hr> <h2>æ ·å¼ç»å®</h2> <p class="active">è¿æ¯æ ·å¼ç»å®ç示ä¾</p> <p class="error">è¿æ¯æ ·å¼ç»å®ç示ä¾-è¦å</p> <p v-bind:class="test1">æµè¯1</p> <p :class="test2">æµè¯2</p> <p :class="[activeClass, errorClass]">æµè¯3</p> <hr> <!-- v-modelååç»å®ï¼éè¦ï¼ï¼ï¼ --> <h2>v-modelååç»å®</h2> <input v-model.lazy="message" placeholder="edit me"> <p>Message is: {{ message }}</p> <input v-model.number="num" placeholder="edit me"> <p>num is: {{ num }}</p> <input v-model.trim="trimstr" placeholder="edit me"> <p>trimstr is: {{ trimstr }}</p> <hr> </div> <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script> <script src="js/start.js"></script> </body> </html>
4|3JSæä»¶
var app = new Vue({ el: '#app', data: { message: 'Hello Vue!ææ¥å¦ï¼', num: 'å符转æ°å', isShow: false, trimstr: 'trimå»æç©ºæ ¼', username: 'hahhaha', todoList: [ {date: '1.1', thing: 'å æ¦å¿«ä¹'}, {date: '3.12', thing: 'æ¤æ èç§æ '}, {date: '5.8', thing: 'å³å¨è'}, {date: '10.3', thing: 'å½åºèç¡å¤§è§'}, ], user: { username: 'Riy', password: '123123', age: 23, city: 'beijing' }, test1: { active: false }, test2: { active: true, error: true }, activeClass: 'active', errorClass: 'error', } })
4|4æ§è¡ç»æ
5|0äºä»¶å¤ç
5|1代ç ä»ç»
å ·ä½å 容æ¥çHTMLæä»¶åJSæä»¶
// v-onç¨äºç»å®äºä»¶ï¼å¯ç®å为@ <button v-on:click="counter -= 1">å 1</button> <button @click="counter -= 1">@@@å 1</button> // æ§è¡greetæ¹æ³ï¼éå±æå° <button @click="greet">Greet</button> // é¼ æ ç¹å»è¾å ¥æ¡ï¼æ§è¡ä¸å±æ¹æ³sayï¼ææé®å忬¡æ§è¡sayæ¹æ³ // 两ç§äºä»¶ä¿®é¥°ç¬¦ï¼stopï¼åæ¢äºä»¶åæ³¡ä¼ æï¼preventï¼é»æ¢é»è®¤è¡ä¸º // è¿é妿廿.stopï¼å卿§è¡buttonæ ç¾ä¸çæ¹æ³åä¼ç»§ç»æ§è¡ä¸å±divçæ¹æ³ <div class="error" @click="say('ææ¯ä¸å±div')"> è¿éæä¸ªå¤å±div <input type="text" v-model="message"> <button @click.stop="say(message)">æ¾ç¤ºï¼ {{message}}</button> </div> // @keyup.enterçå¬é®çå车äºä»¶ // 两ç§äºä»¶ä¿®é¥°ç¬¦ï¼stopï¼åæ¢äºä»¶åæ³¡ä¼ æï¼preventï¼é»æ¢é»è®¤è¡ä¸º // è¿é妿廿.preventå¼¹çªå伿¥éï¼å 为submité»è®¤ä¼æäº¤å°actionå°åçå端ï¼è¿é没æï¼ææä¼æ¥é <form action=""> <input type="text" @keyup.enter="submit('ç¹å»å车')"> <input type="submit" value="æäº¤" @click.prevent="submit('æäº¤æ°æ®')"> </form>
5|2HTMLæä»¶
<!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"> <style> .active { background-color: yellow; } .error { color: red; border: 1px solid red; font-size: 20px; } </style> <title>vue-04-äºä»¶</title> </head> <body> <div id="app"> <h2>äºä»¶</h2> <button v-on:click="counter -= 1">å 1</button> <button @click="counter -= 1">@@@å 1</button> <p>ç¹å»æé®ï¼counter= {{ counter }} .</p> <hr> <!-- `greet` æ¯å¨ä¸é¢å®ä¹çæ¹æ³å --> <button @click="greet">Greet</button> <div class="error" @click="say('ææ¯ä¸å±div')"> è¿éæä¸ªå¤å±div <input type="text" v-model="message"> <button @click.stop="say(message)">æ¾ç¤ºï¼ {{message}}</button> </div> <hr> <form action=""> <input type="text" @keyup.enter="submit('ç¹å»å车')"> <input type="submit" value="æäº¤" @click.prevent="submit('æäº¤æ°æ®')"> </form> <hr> <input type="text" @keyup.enter="submit('ç¹å»å车')"> </div> <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script> <script src="js/start.js"></script> </body> </html>
5|3JSæä»¶
var app = new Vue({ el: '#app', data: { counter: 100, message: 'Hello Vue!ææ¥å¦ï¼', methods: { greet: function(event) { alert('hahhaha!'); if (event) { alert(event.target.tagName) } }, say: function(msg) { alert(msg); }, submit: function(data){ alert(data); } } })
5|4æ§è¡ç»æ
6|0Vueç»ä»¶åå¼å
6|1ç»ä»¶ç®ä»
- ç»ä»¶ï¼Componentï¼æ¯ Vue.js æå¼ºå¤§çåè½ä¹ä¸ã
- ç»ä»¶å¯ä»¥æ©å± HTML å ç´ ï¼å°è£ å¯éç¨ç代ç ã
- ç»ä»¶ç³»ç»è®©æä»¬å¯ä»¥ç¨ç¬ç«å¯å¤ç¨çå°ç»ä»¶æ¥æå»ºå¤§ååºç¨ï¼å ä¹ä»»æç±»åçåºç¨ççé¢é½å¯ä»¥æ½è±¡ä¸ºä¸ä¸ªç»ä»¶æ ã
6|2å 个éè¦å±æ§
dataï¼å¨åç»ä»¶å¿ é¡»æ¯ä¸ä¸ªå½æ°ï¼éè¦return
templateï¼html页颿¨¡æ¿
propsï¼ä¸ä¸ªèªå®ä¹ç¹æ§åè¡¨ï¼æ¥æ¶ä¼ å¼ï¼ä½ä¸ºå±æ§
methodsï¼å å«å¤ä¸ªèªå®ä¹å½æ°ç对象
watchï¼ä¾¦å¬å±æ§ï¼ååºæ°æ®åå¨
computedï¼è®¡ç®å±æ§ï¼ååºæ°æ®åå¨ï¼ä¼å éç¨
createdï¼å建ç»ä»¶æ¶ï¼åå§åæ°æ®
6|3ç¶åç»ä»¶çéä¿¡
代ç è§£é
å ·ä½å 容æ¥çHTMLæä»¶åJSæä»¶
// å ¨å±ç»ä»¶è¯æ³æ ¼å¼å¦ä¸ï¼tagName 为ç»ä»¶åï¼options 为é ç½®é项ã Vue.component(tagName, options) // prop æ¯åç»ä»¶ç¨æ¥æ¥åç¶ç»ä»¶ä¼ éè¿æ¥çæ°æ®çä¸ä¸ªèªå®ä¹å±æ§ // 声æ props props: ['message'], template: '<span>{{ message }}</span> // computedç¨æ¥çæ§èªå·±å®ä¹çåéï¼è¯¥åéä¸å¨dataéé¢å£°æï¼ç´æ¥å¨computedéé¢å®ä¹ // åéä¸çæä¸ä¸ªå¼åçäºåååæä»¬çæ§çè¿ä¸ªå¼ä¹å°±ä¼åçåå computed: { content_short: function() { return this.content.slice(0, 15); } } // createdå¨å®ä¾åå»ºå®æå被ç«å³è°ç¨ã created: function() {}
HTMLæä»¶
<!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"> <style> .active { background-color: yellow; } .error { color: red; border: 1px solid red; font-size: 20px; } .container { width: 60%; margin: 0 auto; } </style> <title>vue-05-ç»ä»¶</title> </head> <body> <div id="blog"> <div class="container"> <!-- <h2>blogå表</h2> --> <blog-header :title="title"></blog-header> <blog-post v-for="post in posts" :key="post.id" :title="post.title" :content="post.content"></blog-post> </div> </div> <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script> <script src="js/blog.js"></script> </body> </html>
JSæä»¶
Vue.component('blog-post', { props: ['title', 'content'], template: ` <div> <h3>{{ title }}</h3> <p>{{ content_short }}</p> <hr> </div> `, computed: { content_short: function() { // æªå15个å符æè¦ return this.content.slice(0, 15); } } }) Vue.component('blog-header', { props: ['title'], template: ` <div> <h1>{{ title }}</h1> </div> `, }) var app = new Vue({ el: '#blog', data: { title: 'è¿æ¹å客å¾ç«çï¼', posts: [] }, created: function() { let that = this; // éè¿apiè·åæ°æ® that.posts = [ {id:1, title: '好好å¦ä¹ ï¼å¤©å¤©åä¸', content: '好好å¦ä¹ 好好å¦ä¹ 好好å¦ä¹ 好好å¦ä¹ 好好å¦ä¹ 好好å¦ä¹ 好好å¦ä¹ 好好å¦ä¹ 好好å¦ä¹ 好好å¦ä¹ 好好å¦ä¹ 好好å¦ä¹ 好好å¦ä¹ 好好å¦ä¹ 好好å¦ä¹ '}, {id:2, title: 'PythonåVueï¼å ¨é½æå®', content: 'å ¨é½æå®å ¨é½æå®å ¨é½æå®å ¨é½æå®å ¨é½æå®å ¨é½æå®å ¨é½æå®å ¨é½æå®å ¨é½æå®å ¨é½æå®å ¨é½æå®å ¨é½æå®å ¨é½æå®å ¨é½æå®å ¨é½æå®å ¨é½æå®å ¨é½æå®å ¨é½æå®å ¨é½æå®å ¨é½æå®å ¨é½æå®å ¨é½æå®å ¨é½æå®å ¨é½æå®å ¨é½æå®å ¨é½æå®å ¨é½æå®å ¨é½æå®'} ] } })
æ§è¡ç»æ
6|4使ç¨vue-cliè¿è¡å·¥ç¨å
Vue CLI æ¯ä¸ä¸ªåºäº Vue.js è¿è¡å¿«éå¼åç宿´ç³»ç»ï¼
- æä¾ï¼
- éè¿ @vue/cli æå»ºäº¤äºå¼ç项ç®èææ¶ã
- éè¿ @vue/cli + @vue/cli-service-global å¿«éå¼å§é¶é ç½®ååå¼åã
- ä¸ä¸ªè¿è¡æ¶ä¾èµ (@vue/cli-service)ï¼è¯¥ä¾èµï¼
- å¯å级ï¼
- åºäº webpack æå»ºï¼å¹¶å¸¦æåççé»è®¤é ç½®ï¼
- å¯ä»¥éè¿é¡¹ç®å çé ç½®æä»¶è¿è¡é ç½®ï¼
- å¯ä»¥éè¿æä»¶è¿è¡æ©å±ã
- ä¸ä¸ªä¸°å¯ç宿¹æä»¶éåï¼éæäºå端çæä¸æå¥½çå·¥å ·ã
- ä¸å¥å®å ¨å¾å½¢åçå建å管ç Vue.js 项ç®çç¨æ·çé¢ã
å®è£ åè¿è¡
// å®è£ vue-cli cnpm install -g @vue/cli // æ¥çvueçæ¬ vue --version // å建vueé¡¹ç® vue create blog
å建åçç»æå¦ä¸å¾ï¼
// è¿å ¥å®è£ ç®å½ï¼è¿è¡ >cd blog >npm run serve DONE Compiled successfully in 13334ms 14:48:27 App running at: - Local: http://localhost:8080/ - Network: http://192.168.1.102:8080/ Note that the development build is not optimized. To create a production build, run npm run build.
7|0æå
ç¬è å¨è¿éåªå¯¹Vueè¿è¡å ¥é¨å¦ä¹ ï¼äºè§£Vue大æ¦ï¼æ´å¤ç»è请æ¥çå®ç½ï¼https://cn.vuejs.org/