框架是一個軟件的半成品,在全局範圍內給了大的約束。庫是工具,在單點上給咱們提供功能。框架是依賴庫的。Vue是框架而jQuery則是庫。javascript
在傳統的非模塊化JavaScript開發中有許多問題:命名衝突、文件依賴、跨環境共享模塊、性能優化、職責單1、模塊的版本管理、jQuery等前端庫層出不窮,前端代碼日益膨脹css
AMD規範及其表明:RequireJS
異步模塊定義(Asynchronous Module Definition),它是依賴前置 (由於依賴必須一開始就寫好)會先儘早地執行(依賴)模塊 , 至關於全部的require都被提早了html
CMD規範及其表明:SeaJS
(Common Module Definition)模塊定義規範
一個模塊就是一個文件;它推崇依賴就近想何時require就何時加載,實現了 懶加載, 延遲執行 (as lazy as possible)前端
MVC的核心理念是:你應該把管理數據的代碼(Model)、業務邏輯的代碼(Controller)、以及向用戶展現數據的代碼(View)清晰的分離開vue
經過MVC框架又衍生出了許多其它的架構,統稱MV*,最多見的是MVP與MVVMjava
MVVM(Model-View-ViewModel)框架的由來即是MVP(Model-View-Presenter)模式與WPF結合的應用方式時發展演變過來的一種新型架構框架。node
Vue與Angular就是一個MVVM框架,MVVM與MVC最大的區別是模型與視圖實現了雙向綁定。react
在Vue中用戶自定義的實例就是vm,功能與Controller相似git
React 起源於 Facebook 的內部項目,由於該公司對市場上全部 JavaScript MVC 框架,都不滿意,就決定本身寫一套,用來架設 Instagram 的網站。作出來之後,發現這套東西很好用,就在2013年5月開源了。因爲 React 的設計思想極其獨特,屬於革命性創新,性能出衆,代碼邏輯卻很是簡單。因此,愈來愈多的人開始關注和使用,認爲它多是未來 Web 開發的主流工具。支持虛擬DOM(Virtual DOM)和組件化的開發。angularjs
ReactJS官網地址: http://facebook.github.io/react/
Github地址: https://github.com/facebook/react
AngularJS是一個前端MVVM框架。
angular的英文字面意思是:有角的; 用角測量的
AngularJS是協助搭建單頁面工程(SPA)的開源前端框架。它經過MVC模式使得開發與測試變得更容易。
AngularJS試圖成爲WEB應用中的一種端對端的解決方案。它將指導開發整個應用。
AngularJS於2009年發佈第一個版本,由Google進行維護,壓縮版94k。
1.3版後再也不支持IE8
1.3版後不支持全局控制器
2.0版 alpha
git倉庫: https://github.com/angular/
官網: https://www.angularjs.org/
http://www.angularjs.cn/中文社區
http://www.apjs.net/ 中文網
a web framework for modern web apps
Vue.js是一個輕巧、高性能、可組件化的MVVM庫,同時擁有很是容易上手的API,做者是尤雨溪是中國人。
易用
已經會了HTML,CSS,JavaScript?即刻閱讀指南開始構建應用!
靈活
簡單小巧的核心,漸進式技術棧,足以應付任何規模的應用。
性能
17kb min+gzip 運行大小、超快虛擬 DOM 、最省心的優化
當前三大前端MVC框架的對比:
Vue (讀音 /vjuː/,相似於 view) 是一套用於構建用戶界面的漸進式框架。與其它大型框架不一樣的是,Vue 被設計爲能夠自底向上逐層應用。Vue 的核心庫只關注視圖層,不只易於上手,還便於與第三方庫或既有項目整合。另外一方面,當與 現代化的工具鏈以及各類 支持類庫結合使用時,Vue 也徹底可以爲複雜的單頁應用提供驅動。
若是你已是有經驗的前端開發者,想知道 Vue 與其它庫/框架有哪些區別,請查看 對比其它框架。
不適合SEO、交互頻繁的,如遊戲之類交互體驗網站
瀏覽器支持:
Vue.js 不支持 IE8 及其如下版本,由於 Vue.js 使用了 IE8 不能模擬的 ECMAScript 5 特性。Vue.js 支持全部 兼容 ECMAScript 5 的瀏覽器。
文章中的許多內容都是來自vue官網,由於沒有其它更加合適的教程。
若是要開發基於angularJS的項目,則先要添加對angularJS的引用,有以下幾個方法:
1)、去vue2官網或git下載,地址: https://github.com/vuejs/vue
2)、使用cdn
3)、安裝node.js,使用npm獲取
具體的安裝細節: https://cn.vuejs.org/v2/guide/installation.html
在本文的示例中已經包含了運行環境與幫助文件chm
Vue.js 的核心是一個容許採用簡潔的模板語法來聲明式地將數據渲染進 DOM 的系統:
示例:
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>vue2介紹</title> </head> <body> <div id="app1"> {{message}} </div> <div id="app2"> <span v-bind:title="message"> 把鼠標放到這裏試試 </span> </div> <script src="../js/vue.js" type="text/javascript" charset="utf-8"></script> <script type="text/javascript"> //vue應用對象 var app1 = new Vue({ el: "#app1", data: { message: "Hello Vue2!" } }); //綁定屬性 var app2 = new Vue({ el: "#app2", data: { message: "頁面加載時間是:" + new Date().toLocaleDateString() } }); </script> </body> </html>
結果:
這裏咱們遇到了一點新東西。你看到的 v-bind
特性被稱爲指令。指令帶有前綴 v-
,以表示它們是 Vue 提供的特殊特性。可能你已經猜到了,它們會在渲染的 DOM 上應用特殊的響應式行爲。在這裏,該指令的意思是:「將這個元素節點的 title
特性和 Vue 實例的 message
屬性保持一致」。
若是你再次打開瀏覽器的 JavaScript 控制檯,輸入 app2.message = '新消息'
,就會再一次看到這個綁定了 title
特性的 HTML 已經進行了更新。
咱們已經成功建立了第一個 Vue 應用!看起來這跟渲染一個字符串模板很是相似,可是 Vue 在背後作了大量工做。如今數據和 DOM 已經被創建了關聯,全部東西都是響應式的。咱們要怎麼確認呢?打開你的瀏覽器的 JavaScript 控制檯 (就在這個頁面打開),並修改 app.message
的值,你將看到上例相應地更新。
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>vue2介紹</title> </head> <body> <div id="app3"> <span v-if="isShow"> isShow爲true時你能夠看到我 </span> </div> <div id="app4"> <span v-if="isShow"> <table border="1" cellspacing="1" cellpadding="1" width="50%"> <tr><th>序號</th><th>名稱</th><th>價格</th></tr> <tr v-for="(obj,index) in fruits"> <td>{{index+1}}</td> <td>{{obj.name}}</td> <td>{{obj.price}}</td> </tr> </table> </span> </div> <script src="../js/vue.js" type="text/javascript" charset="utf-8"></script> <script type="text/javascript"> //if指令 var app3 = new Vue({ el: "#app3", data: { isShow: true } }); //循環指令 var app4 = new Vue({ el: "#app4", data: { isShow:true, fruits: [{ name: "蘋果", price: "6.8" }, { name: "橙子", price: "3.5" }, { name: "香蕉", price: "2.3" }] } }); </script> </body> </html>
結果:
這個例子演示了咱們不只能夠把數據綁定到 DOM 文本或特性,還能夠綁定到 DOM 結構。此外,Vue 也提供一個強大的過渡效果系統,能夠在 Vue 插入/更新/移除元素時自動應用 過渡效果。
爲了讓用戶和你的應用進行交互,咱們能夠用 v-on 指令添加一個事件監聽器,經過它調用在 Vue 實例中定義的方法:
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>vue2介紹</title> </head> <body> <div id="app5"> <button v-on:click="showMe">{{message}}</button> <input v-model="message" /> </div> <p id="app6"> <button v-on:click="n1+=1">+</button><input v-model="n1"/>+ <input v-model="n2"/>= <input v-model="sum"/> </p> <script src="../js/vue.js" type="text/javascript" charset="utf-8"></script> <script type="text/javascript"> //事件 var app5 = new Vue({ el: "#app5", data: { message:"vue2事件" }, methods:{ showMe:function(){ this.message=this.message.split('').reverse().join(''); } } }); //計算 var app6 = new Vue({ el: "#app6", data: { n1:0, n2:0 }, computed:{ sum:function(){ return parseInt(this.n1)+parseInt(this.n2); } } }); </script> </body> </html>
結果:
注意在 showMe方法中,咱們更新了應用的狀態,但沒有觸碰 DOM——全部的 DOM 操做都由 Vue 來處理,你編寫的代碼只須要關注邏輯層面便可。
Vue 還提供了 v-model 指令,它能輕鬆實現表單輸入和應用狀態之間的雙向綁定。
組件系統是 Vue 的另外一個重要概念,由於它是一種抽象,容許咱們使用小型、獨立和一般可複用的組件構建大型應用。仔細想一想,幾乎任意類型的應用界面均可以抽象爲一個組件樹:
在 Vue 裏,一個組件本質上是一個擁有預約義選項的一個 Vue 實例。在 Vue 中註冊組件很簡單:
// 定義名爲 todo-item 的新組件 Vue.component('todo-item', { template: '<li>這是個待辦項</li>' })
如今你能夠用它構建另外一個組件模板:
<ol> <!-- 建立一個 todo-item 組件的實例 --> <todo-item></todo-item> </ol>
示例:
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>vue2介紹</title> </head> <body> <div id="app1"> <ol> <todo-item></todo-item> </ol> <ol> <todo-item v-for="item in items"></todo-item> </ol> </div> <script src="../js/vue.js" type="text/javascript" charset="utf-8"></script> <script type="text/javascript"> //在vue中添加一個名爲todo-item組件 Vue.component("todo-item",{ template:"<li>這是一個li單項</li>" }); //構件 var app1 = new Vue({ el: "#app1", data:{ items:[1,3,5,7,9] } }); </script> </body> </html>
結果:
可是這樣會爲每一個待辦項渲染一樣的文本,這看起來並不炫酷。咱們應該能從父做用域將數據傳到子組件纔對。讓咱們來修改一下組件的定義,使之可以接受一個 prop:
Vue.component('todo-item', { // todo-item 組件如今接受一個 // "prop",相似於一個自定義特性。 // 這個 prop 名爲 todo。 props: ['todo'], template: '<li>{{ todo.text }}</li>' })
如今,咱們可使用 v-bind
指令將待辦項傳到循環輸出的每一個組件中:
<div id="app-7"> <ol> <!-- 如今咱們爲每一個 todo-item 提供 todo 對象 todo 對象是變量,即其內容能夠是動態的。 咱們也須要爲每一個組件提供一個「key」,稍後再 做詳細解釋。 --> <todo-item v-for="item in groceryList" v-bind:todo="item" v-bind:key="item.id"> </todo-item> </ol> </div>
js:
Vue.component('todo-item', { props: ['todo'], template: '<li>{{ todo.text }}</li>' }) var app7 = new Vue({ el: '#app-7', data: { groceryList: [ { id: 0, text: '蔬菜' }, { id: 1, text: '奶酪' }, { id: 2, text: '隨便其它什麼人吃的東西' } ] } })
結果:
1.蔬菜 2.奶酪 3.隨便其它什麼人吃的東西
示例:
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>vue2介紹</title> </head> <body> <div id="app1"> <ol> <todo-item info="Hello Component"></todo-item> </ol> <ol> <student-item v-for="item in students" v-bind:stu="item" v-bind:key="item.name"></student-item> </ol> </div> <script src="../js/vue.js" type="text/javascript" charset="utf-8"></script> <script type="text/javascript"> //在vue中添加一個名爲todo-item組件 Vue.component("todo-item",{ props:["info","vtitle"], template:"<li>{{info||'empty'}}</li>" }); Vue.component("student-item",{ props:["stu"], template:"<li>{{stu.name}} - {{stu.age}}</li>" }); //構件 var app1 = new Vue({ el: "#app1", data:{ students:[ {"name":"tom","age":18},{"name":"rose","age":80},{"name":"lucy","age":8} ] } }); </script> </body> </html>
結果:
儘管這只是一個刻意設計的例子,可是咱們已經設法將應用分割成了兩個更小的單元。子單元經過 prop 接口與父單元進行了良好的解耦。咱們如今能夠進一步改進 <todo-item>
組件,提供更爲複雜的模板和邏輯,而不會影響到父單元。
在一個大型應用中,有必要將整個應用程序劃分爲組件,以使開發更易管理。
你可能已經注意到 Vue 組件很是相似於自定義元素——它是 Web 組件規範的一部分,這是由於 Vue 的組件語法部分參考了該規範。例如 Vue 組件實現了 Slot API 與 is
特性。可是,仍是有幾個關鍵差異:
Web 組件規範仍然處於草案階段,而且未被全部瀏覽器原生實現。相比之下,Vue 組件不須要任何 polyfill,而且在全部支持的瀏覽器 (IE9 及更高版本) 之下表現一致。必要時,Vue 組件也能夠包裝於原生自定義元素以內。
Vue 組件提供了純自定義元素所不具有的一些重要功能,最突出的是跨組件數據流、自定義事件通訊以及構建工具集成。
經過一個綜合示例來快速瞭解Vue2,會使用到模板、過濾器、計算,表達式、組件等等,要求實現一個簡單的購物車,運行時的效果以下:
參考代碼:
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>購物車</title> <style type="text/css"> .bg{ background:dodgerblue; color:white; } </style> </head> <body> <div id="app1"> <h2>購物車</h2> <table border="1" cellspacing="0" cellpadding="0" width="100%"> <tr> <th>序號</th> <th>名稱</th> <th>單價</th> <th>數量</th> <th>小計</th> <th>操做</th> </tr> <tr v-for="(pdt,index) in products" v-bind:class="{bg:index%2==0}"> <td>{{index+1}}</td> <td>{{pdt.title}}</td> <td>{{pdt.price}}</td> <td> <button type="button" v-on:click="pdt.quantity<=0?0:(pdt.quantity-=1)">-</button> <input v-model="pdt.quantity" style="width: 80px;" v-on:keyup="pdt.quantity=(pdt.quantity<0?0:pdt.quantity)" /> <button type="button" v-on:click="pdt.quantity+=1">+</button> </td> <td>{{pdt.quantity*pdt.price | currency(1)}}</td> <td> <button type="button" v-on:click="remove(index)">移除</button> </td> </tr> <tr> <td colspan="6" align="right"> {{total|currency}} </td> </tr> </table> </div> <script src="../js/vue.js" type="text/javascript" charset="utf-8"></script> <script type="text/javascript"> Vue.filter("currency", function(v, n) { if(!v) { return ""; } return "¥" + v.toFixed(n || 2); }); //實例 var app1 = new Vue({ el: "#app1", data: { orderby:"", isAsc:true, products: [{ title: "paint pot", quantity: 9, price: 3.95 }, { title: "polka dots", quantity: 17, price: 12.3 }, { title: "pebbles", quantity: 5, price: 6.71 }, { title: "Mi Note5", quantity: 8, price: 2985.6 }, { title: "iPhone XS", quantity: 10, price: 8906.72 }] }, computed: { total: function() { var sum = 0; for(var i = 0; i < this.products.length; i++) { sum += (this.products[i].price * this.products[i].quantity); } return sum; } }, methods:{ remove:function(i){ if(confirm('您肯定要移除嗎?')){ this.products.splice(i,1); } } } }); </script> </body> </html>
思考:若是這裏還要實現排序應該怎樣作?
由於上面的示例中須要用到對象數組與排序,這裏單獨講講:
var arrayObj = new Array();
var arrayObj = new Array([size]);
var arrayObj = new Array([element0[, element1[, ...[, elementN]]]]);
示例:
var array11 = new Array(); //空數組 var array12 = new Array(5); //指定長度,可越界 var array13 = new Array("a","b","c",1,2,3,true,false); //定義並賦值 var array14=[]; //空數組,語法糖 var array15=[1,2,3,"x","y"]; //定義並賦值
var testGetArrValue=arrayObj[1];
arrayObj[1]= "值";
//4.二、訪問與修改 array12[8]="hello array12"; //賦值或修改 console.log(array12[8]); //取值 //遍歷 for (var i = 0; i < array13.length; i++) { console.log("arrayl3["+i+"]="+array13[i]); } //枚舉 for(var i in array15){ console.log(i+"="+array15[i]); //此處的i是下標 }
結果:
將一個或多個新元素添加到數組未尾,並返回數組新長度
arrayObj. push([item1 [item2 [. . . [itemN ]]]]);
將一個或多個新元素添加到數組開始,數組中的元素自動後移,返回數組新長度
arrayObj.unshift([item1 [item2 [. . . [itemN ]]]]);
將一個或多個新元素插入到數組的指定位置,插入位置的元素自動後移,返回被刪除元素數組,deleteCount要刪除的元素個數
arrayObj.splice(insertPos,deleteCount,[item1[, item2[, . . . [,itemN]]]])
示例代碼:
//4.三、添加元素 var array31=[5,8]; //添加到末尾 array31.push(9); var len=array31.push(10,11); console.log("長度爲:"+len+"——"+array31); //添加到開始 array31.unshift(4); var len=array31.unshift(1,2,3); console.log("長度爲:"+len+"——"+array31); //添加到中間 var len=array31.splice(5,1,6,7); //從第5位開始插入,刪除第5位後的1個元素,返回被刪除元素 console.log("被刪除:"+len+"——"+array31);
運行結果:
移除最後一個元素並返回該元素值
arrayObj.pop();
移除最前一個元素並返回該元素值,數組中元素自動前移
arrayObj.shift();
刪除從指定位置deletePos開始的指定數量deleteCount的元素,數組形式返回所移除的元素
arrayObj.splice(deletePos,deleteCount);
示例:
//4.四、刪除 var array41=[1,2,3,4,5,6,7,8]; console.log("array41:"+array41); //刪除最後一個元素,並返回 var e=array41.pop(); console.log("被刪除:"+e+"——"+array41); //刪除首部元素,並返回 var e=array41.shift(); console.log("被刪除:"+e+"——"+array41); //刪除指定位置與個數 var e=array41.splice(1,4); //從索引1開始刪除4個 console.log("被刪除:"+e+"——"+array41);
結果:
以數組的形式返回數組的一部分,注意不包括 end 對應的元素,若是省略 end 將複製 start 以後的全部元素
arrayObj.slice(start, [end]);
將多個數組(也能夠是字符串,或者是數組和字符串的混合)鏈接爲一個數組,返回鏈接好的新的數組
arrayObj.concat([item1[, item2[, . . . [,itemN]]]]);
示例:
//4.五、截取和合並 var array51=[1,2,3,4,5,6]; var array52=[7,8,9,0,"a","b","c"]; //截取,切片 var array53=array51.slice(2); //從第3個元素開始截取到最後 console.log("被截取:"+array53+"——"+array51); var array54=array51.slice(1,4); //從第3個元素開始截取到索引號爲3的元素 console.log("被截取:"+array54+"——"+array51); //合併 var array55=array51.concat(array52,["d","e"],"f","g"); console.log("合併後:"+array55);
結果:
返回數組的拷貝數組,注意是一個新的數組,不是指向
arrayObj.slice(0);
返回數組的拷貝數組,注意是一個新的數組,不是指向
arrayObj.concat();
由於數組是引用數據類型,直接賦值並無達到真正實現拷貝,地址引用,咱們須要的是深拷貝。
反轉元素(最前的排到最後、最後的排到最前),返回數組地址
arrayObj.reverse();
對數組元素排序,返回數組地址
arrayObj.sort();
arrayObj.sort(function(obj1,obj2){});
示例:
var array71=[4,5,6,1,2,3]; array71.sort(); console.log("排序後:"+array71); var array72=[{name:"tom",age:19},{name:"jack",age:20},{name:"lucy",age:18}]; array72.sort(function(user1,user2){ return user1.age<user2.age; }); console.log("排序後:"); for(var i in array72) console.log(array72[i].name+","+array72[i].age);
結果:
返回字符串,這個字符串將數組的每個元素值鏈接在一塊兒,中間用 separator 隔開。
arrayObj.join(separator);
示例代碼:
//4.八、合併成字符與將字符拆分紅數組 var array81=[1,3,5,7,9]; var ids=array81.join(","); console.log(ids); //拆分紅數組 var text="hello nodejs and angular"; var array82=text.split(" "); console.log(array82);
運行結果:
全部代碼:
javascript內置的sort函數是多種排序算法的集合,數組在原數組上進行排序,不生成副本。
JavaScript實現多維數組、對象數組排序,其實用的就是原生的sort()方法,用於對數組的元素進行排序。
sort() 方法用於對數組的元素進行排序。語法以下:
ArrayObject.sort(order);
返回值爲對數組的引用
若是調用該方法時沒有使用參數,將按字母順序對數組中的元素進行排序,說得更精確點,是按照字符編碼的順序進行排序。要實現這一點,首先應把數組的元素都轉換成字符串(若有必要),以便進行比較。
示例:
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>排序</title> </head> <body> <script> var numbers=[2,4,6,8,0,1,2,3,7,9]; numbers.sort(); console.log(numbers.join(',')); //默認按升序排列 numbers.reverse(); //反轉 console.log(numbers.join(',')); //將元素用逗號鏈接成一個字符串 </script> </body> </html>
結果:
若是想按照其餘標準進行排序,就須要提供比較函數,該函數要比較兩個值,而後返回一個用於說明這兩個值的相對順序的數字。比較函數應該具備兩個參數 a 和 b,其返回值以下:
/* 默認升序:
a>b 返回1
a=b 返回0
a<b 返回-1 */
解釋:a>b 升序,a<b降序。
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>排序</title> </head> <body> <script> var numbers=[2,4,6,8,0,1,2,3,7,9]; //當a>b的結果爲正數時則爲升序 numbers.sort(function(a,b){ if(a>b){return 1;} if(a<b){return -1;} return 0; }); console.log(numbers.join(',')); //簡化,注意類型 numbers.sort(function(a,b){ return a-b; }); console.log(numbers.join(',')); //降序 numbers.sort(function(a,b){ return b-a; }); console.log(numbers.join(',')); </script> </body> </html>
結果:
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>排序</title> </head> <body> <script> //對象數組 var pdts = [{ title: "z-paint pot", quantity: 9, price: 3.95 },{ title: "iPhone XS", quantity: 10, price: 8906.72 },{ title: "polka dots", quantity: 17, price: 12.3 }, { title: "pebbles", quantity: 5, price: 6.71 }, { title: "Mi Note5", quantity: 8, price: 2985.6 }]; //按價格升序 pdts.sort(function(x,y){ return x.price-y.price; }); document.write(JSON.stringify(pdts)); document.write("<br/>"); //按名稱排序 pdts.sort(function(x,y){ if(x.title>y.title) return 1; if(x.title<y.title) return -1; return 0; }); document.write(JSON.stringify(pdts)); </script> </body> </html>
結果:
若是排序的條件要不斷變化,將反覆寫簡單的排序函數,封裝能夠帶來方便:
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>排序</title> </head> <body> <script> //對象數組 var pdts = [{ title: "z-paint pot", quantity: 9, price: 3.95 }, { title: "iPhone XS", quantity: 10, price: 8906.72 }, { title: "polka dots", quantity: 17, price: 12.3 }, { title: "pebbles", quantity: 5, price: 6.71 }, { title: "Mi Note5", quantity: 8, price: 2985.6 }]; //根據排序關鍵字與是否爲升序產生排序方法 var sortExp = function(key, isAsc) { return function(x, y) { if(isNaN(x[key])) { //若是當前排序的不是數字 if(x[key] > y[key]) return 1*(isAsc?1:-1); if(x[key] < y[key]) return -1*(isAsc?1:-1); return 0; }else{ return (x[key]-y[key])*(isAsc?1:-1); } } }; //按價格升序 pdts.sort(sortExp("price",true)); document.write(JSON.stringify(pdts)); document.write("<br/>------------------------------<br/>"); pdts.sort(sortExp("price",false)); document.write(JSON.stringify(pdts)); document.write("<br/>------------------------------<br/>"); pdts.sort(sortExp("title",true)); document.write(JSON.stringify(pdts)); document.write("<br/>------------------------------<br/>"); pdts.sort(sortExp("title",false)); document.write(JSON.stringify(pdts)); </script> </body> </html>
結果:
當使用 Vue 時,咱們推薦同時在你的瀏覽器上安裝 Vue Devtools,它容許你在一個更加友善的界面中審查和調試你的 Vue 應用。
Vue Devtools是一個內嵌在Google Chrome瀏覽器中的插件,用於更好的調試Vue應用程序
源碼:https://github.com/vuejs/vue-devtools#vue-devtools
下載:https://files.cnblogs.com/files/best/vuetools_316.zip
安裝方法:
下載後解壓,在chrome地址欄中輸入:chrome://extensions/
直接將crx文件插入瀏覽器,確認就安裝成功了。
插件會自動檢測當前是否使用了vue,若是使用了圖標會亮起,在開發者工具中有一個調試界面:
a)、請實現一個購物車
https://git.coding.net/zhangguo5/vue2.git
https://www.bilibili.com/video/av17503637/
該博客轉自@張果老師