前端MVC Vue2學習總結(一)——MVC與vue2概要、模板、數據綁定與綜合示例


一、前端MVC概要

1.1、庫與框架的區別

框架是一個軟件的半成品,在全局范圍內給了大的約束。庫是工具,在單點上給我們提供功能。框架是依賴庫的。Vue是框架而jQuery則是庫。

1.2、AMD與CMD

在傳統的非模塊化JavaScript開發中有許多問題:命名沖突、文件依賴、跨環境共享模塊、性能優化、職責單一、模塊的版本管理、jQuery等前端庫層出不窮,前端代碼日益膨脹

AMD規范及其代表:RequireJS
異步模塊定義(Asynchronous Module Definition),它是依賴前置 (因為依賴必須一開始就寫好)會先盡早地執行(依賴)模塊 , 相當於所有的require都被提前了

CMD規范及其代表:SeaJS
(Common Module Definition)模塊定義規范
一個模塊就是一個文件;它推崇依賴就近想什么時候require就什么時候加載,實現了 懶加載, 延遲執行 (as lazy as possible)

詳細請查看:30分鍾學會前端模塊化開發

 

1.2、前端MVC概要

MVC的核心理念是:你應該把管理數據的代碼(Model)、業務邏輯的代碼(Controller)、以及向用戶展示數據的代碼(View)清晰的分離開

  • 模型:代表應用當前的狀態
  • 視圖:用於展示數據,用於接口
  • 控制器:用來管理模型和視圖之間的關系

通過MVC框架又衍生出了許多其它的架構,統稱MV*,最常見的是MVP與MVVM

MVVM(Model-View-ViewModel)框架的由來便是MVP(Model-View-Presenter)模式與WPF結合的應用方式時發展演變過來的一種新型架構框架。

Vue與Angular就是一個MVVM框架,MVVM與MVC最大的區別是模型與視圖實現了雙向綁定。

在Vue中用戶自定義的實例就是vm,功能與Controller類似

1.3、React

React 起源於 Facebook 的內部項目,因為該公司對市場上所有 JavaScript MVC 框架,都不滿意,就決定自己寫一套,用來架設 Instagram 的網站。做出來以后,發現這套東西很好用,就在2013年5月開源了。由於 React 的設計思想極其獨特,屬於革命性創新,性能出眾,代碼邏輯卻非常簡單。所以,越來越多的人開始關注和使用,認為它可能是將來 Web 開發的主流工具。支持虛擬DOM(Virtual DOM)和組件化的開發。

ReactJS官網地址: http://facebook.github.io/react/
Github地址: https://github.com/facebook/react

1.4、AngularJS簡介

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

1.5、Vue.js

Vue.js是一個輕巧、高性能、可組件化的MVVM庫,同時擁有非常容易上手的API,作者是尤雨溪是中國人。

官網: http://cn.vuejs.org/

倉庫: https://github.com/vuejs

易用
已經會了HTML,CSS,JavaScript?即刻閱讀指南開始構建應用!
靈活
簡單小巧的核心,漸進式技術棧,足以應付任何規模的應用。
性能
17kb min+gzip 運行大小、超快虛擬 DOM 、最省心的優化

當前三大前端MVC框架的對比:

1.5.1、Vue2.JS簡介

Vue (讀音 /vjuː/,類似於 view) 是一套用於構建用戶界面的漸進式框架。與其它大型框架不同的是,Vue 被設計為可以自底向上逐層應用。Vue 的核心庫只關注視圖層,不僅易於上手,還便於與第三方庫或既有項目整合。另一方面,當與 現代化的工具鏈以及各種 支持類庫結合使用時,Vue 也完全能夠為復雜的單頁應用提供驅動。

如果你已經是有經驗的前端開發者,想知道 Vue 與其它庫/框架有哪些區別,請查看 對比其它框架

不適合SEO、交互頻繁的,如游戲之類交互體驗網站

瀏覽器支持:

Vue.js 不支持 IE8 及其以下版本,因為 Vue.js 使用了 IE8 不能模擬的 ECMAScript 5 特性。Vue.js 支持所有 兼容 ECMAScript 5 的瀏覽器

1.6、vue2入門示例

文章中的許多內容都是來自vue官網,因為沒有其它更加合適的教程。

1.6.0、WebStorm開發vue設置

(1)、安裝插件

(2)、消除未知指令的錯誤

未知指令會出現紅色提示

方法1是在標簽上使用alt+enter鍵,添加如下屬性:

<html xmlns:v-bind="http://www.w3.org/1999/xhtml">

方法2是設置參數

(3)、添加指令智能提示

默認v-開始的標簽沒有智能提示

在標簽與屬性中同時加上如下智能提示:

v-text
v-html
v-once
v-if
v-show
v-else
v-for
v-on
v-bind
v-model
v-ref
v-el
v-pre
v-cloak
v-on:click
v-on:keyup.enter
v-on:keyup
@click
@change
number
debounce
transition
:is
v-bind:title
View Code

1.6.1、獲取vue2

如果要開發基於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

1.6.2、聲明式渲染

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 的值,你將看到上例相應地更新。

 1.6.3、條件與循環

<!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 插入/更新/移除元素時自動應用 過渡效果

1.6.4、事件、處理用戶輸入與計算

為了讓用戶和你的應用進行交互,我們可以用 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 的另一個重要概念,因為它是一種抽象,允許我們使用小型、獨立和通常可復用的組件構建大型應用。仔細想想,幾乎任意類型的應用界面都可以抽象為一個組件樹:

Component Tree

2.1、普通組件

在 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>

結果:

2.2、帶屬性的組件

但是這樣會為每個待辦項渲染同樣的文本,這看起來並不炫酷。我們應該能從父作用域將數據傳到子組件才對。讓我們來修改一下組件的定義,使之能夠接受一個  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> 組件,提供更為復雜的模板和邏輯,而不會影響到父單元。

在一個大型應用中,有必要將整個應用程序划分為組件,以使開發更易管理。

2.3、與自定義元素的關系

你可能已經注意到 Vue 組件非常類似於自定義元素——它是  Web 組件規范的一部分,這是因為 Vue 的組件語法部分參考了該規范。例如 Vue 組件實現了  Slot API 與 is 特性。但是,還是有幾個關鍵差別:

  1. Web 組件規范仍然處於草案階段,並且未被所有瀏覽器原生實現。相比之下,Vue 組件不需要任何 polyfill,並且在所有支持的瀏覽器 (IE9 及更高版本) 之下表現一致。必要時,Vue 組件也可以包裝於原生自定義元素之內。

  2. 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>

 思考:如果這里還要實現排序應該怎樣做?

四、javascript數組

因為上面的示例中需要用到對象數組與排序,這里單獨講講:

4.1、創建

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"];  //定義並賦值

4.2、訪問與修改

var testGetArrValue=arrayObj[1]; 

arrayObj[1]= "值";

            //4.2、訪問與修改
            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是下標
            }

結果:

4.3、添加元素

將一個或多個新元素添加到數組未尾,並返回數組新長度

arrayObj. push([item1 [item2 [. . . [itemN ]]]]);

將一個或多個新元素添加到數組開始,數組中的元素自動后移,返回數組新長度

arrayObj.unshift([item1 [item2 [. . . [itemN ]]]]);

將一個或多個新元素插入到數組的指定位置,插入位置的元素自動后移,返回被刪除元素數組,deleteCount要刪除的元素個數

arrayObj.splice(insertPos,deleteCount,[item1[, item2[, . . . [,itemN]]]])

示例代碼:

            //4.3、添加元素
            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);

運行結果:

4.4、刪除

移除最后一個元素並返回該元素值

arrayObj.pop();

移除最前一個元素並返回該元素值,數組中元素自動前移

arrayObj.shift(); 

刪除從指定位置deletePos開始的指定數量deleteCount的元素,數組形式返回所移除的元素

arrayObj.splice(deletePos,deleteCount); 

示例:

            //4.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);

 

結果:

4.5、截取和合並

以數組的形式返回數組的一部分,注意不包括 end 對應的元素,如果省略 end 將復制 start 之后的所有元素

arrayObj.slice(start, [end]); 

將多個數組(也可以是字符串,或者是數組和字符串的混合)連接為一個數組,返回連接好的新的數組

arrayObj.concat([item1[, item2[, . . . [,itemN]]]]); 

示例: 

            //4.5、截取和合並
            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);

結果:

4.6、拷貝

返回數組的拷貝數組,注意是一個新的數組,不是指向

arrayObj.slice(0); 

返回數組的拷貝數組,注意是一個新的數組,不是指向

arrayObj.concat(); 

因為數組是引用數據類型,直接賦值並沒有達到真正實現拷貝,地址引用,我們需要的是深拷貝。

4.7、排序

反轉元素(最前的排到最后、最后的排到最前),返回數組地址

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);

 

結果:

4.8、合並成字符

返回字符串,這個字符串將數組的每一個元素值連接在一起,中間用 separator 隔開。

arrayObj.join(separator); 

示例代碼:

            //4.8、合並成字符與將字符拆分成數組
            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);

運行結果:

所有代碼:

<!DOCTYPE html>
<html>

    <head>
        <meta charset="UTF-8">
        <title>數組操作</title>
    </head>

    <body>
        <script type="text/javascript">
            //4.1、創建
            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"];  //定義並賦值
            
            //4.2、訪問與修改
            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是下標
            }
            
            //4.3、添加元素
            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);
            
            //4.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);
            
            //4.5、截取和合並
            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);
            
            //4.7、排序
            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);
            
            //4.8、合並成字符與將字符拆分成數組
            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);
            
        </script>
    </body>

</html>
View Code

五、JavaScript排序

5.1、概要

javascript內置的sort函數是多種排序算法的集合,數組在原數組上進行排序,不生成副本。

JavaScript實現多維數組、對象數組排序,其實用的就是原生的sort()方法,用於對數組的元素進行排序。

sort() 方法用於對數組的元素進行排序。語法如下:

ArrayObject.sort(order); 

返回值為對數組的引用

5.2、簡單排序

如果調用該方法時沒有使用參數,將按字母順序對數組中的元素進行排序,說得更精確點,是按照字符編碼的順序進行排序。要實現這一點,首先應把數組的元素都轉換成字符串(如有必要),以便進行比較。

示例:

<!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>

結果:

5.3、簡單數組自定義排序

如果想按照其他標准進行排序,就需要提供比較函數,該函數要比較兩個值,然后返回一個用於說明這兩個值的相對順序的數字。比較函數應該具有兩個參數 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>

結果:

5.4、簡單對象List自定義屬性排序

<!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>

結果:

5.5、封裝通用的排序函數

如果排序的條件要不斷變化,將反復寫簡單的排序函數,封裝可以帶來方便:

<!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 Devtools

當使用 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)、請實現一個購物車

  • 1、雙向綁定集合中的數據
  • 2、執行移除事件
  • 3、隔行換色、使用vue2完成
  • 4、點擊數量與小計時進行排序(選作)
  • 5、實現實時統計功能
  • 6、實現添加與編輯功能
  • 7、實現排序功能

b)、購物車升級

  • 1、將數據持久化到數據庫中,數據庫類型不限
  • 2、新增加(增加、刪除、查詢、更新、排序)功能
  • 3、使用組件
  • 4、使用AJAX,可以使用jQuery,也可以使用axios

c)、將作業a使用angular實現

d)、將作業a使用react實現

e)、將作業b使用angular實現

f)、將作業b使用react實現

八、示例下載

https://git.coding.net/zhangguo5/vue2.git

九、視頻

https://www.bilibili.com/video/av17503637/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM