2016年,總結篇 續 如何從 JQ 轉到 VueJS 開發(一)

来源:http://www.cnblogs.com/erbingbing/archive/2017/01/19/6305481.html
-Advertisement-
Play Games

VueJs 入門級 學習。 基於Vue 1.x 的版本,因為 2.X 不適合新手作為入門來學習。放棄JQ 可能是你在 2016 年 聽到的 最多的一句話, 並不是說JQ 不好。 只是現在有了更好更效率的框架了。 ...


接著 2016 年的總結,我們來看看 2016年 國內最火且沒有之一的前端MVVM 框架 VueJs

雖然 到寫文章的這個時間點,VueJs已經發佈了 2.1.x 了, 但是對於很多 Vuejs 的初學者來講,我建議還是 從 VueJs 1.x 的最後一個版本開始看。

畢竟如果你掌握了 1.X 那麼你在學習 2.X 的時候,可能只需要一天時間,就能掌握,真的 是一天教會你 VueJs 感覺不要太爽噢~

不要問我為什麼,還是那句話,你試過就知道。

這次就不過多的廢話了,畢竟 深V 說 “你能不能深入點,再深入點...”

-------------------------------------------------------------假裝有分割線------------------------------------------------------------------

入門以及如何使用 vueJS(對,沒錯。就是 入門以及如何使用)

那麼我們來思考一個問題, 學習一款框架。什麼樣的程度才算是入門,以及學習一門框架的方式方法。(每個人可能都不一樣,但是我們還是要總結一下)

從一個 陌生的 框架 。比如之前的 JQ 的學習 進程應該是這樣的。

在沒有構建的基礎上,先是引入這個庫,然後開始照著文檔開始寫 最簡單的 DEMO =》 嘗試著把文檔中介紹的大部分的API 都自己寫一遍 =》 實際的項目中去應用發現坑 =》 解決遇到的坑 =》最後在提升原理層面

這裡我推薦兩個 做JQ 源碼解析不錯的 博客

分別是 艾倫 AaronChokCoco

在通過大量時間去 去做 JQ 的源碼解析,一方面能夠提升你在 JS 語言 的理解,加深對 JS 語法、閉包、繼承 等多方面的提升, 另外一方面也加深了你對 JQ 的理解。所以好處多多

後續,也會出JQ 源碼分析的文章(希望站在 巨人的肩膀上可以看的更遠)

-------------------------------------------------------------假裝有分割線------------------------------------------------------------------

這裡講完了 我們熟悉的 JQ 這個庫的 學習曲線。那麼我們開始思考一下 Vue 這個框架,應該如何下手呢?

總結一個模式吧,任何一款框架的學習,一定是 一邊手寫 DEMO 一邊 看文檔 API =》 加入構建 =》 項目應用 =》 發現坑 =》 查找 issues 解決坑

當然 這些環節中 發現坑 和 解決坑 的過程一定是艱難的。 渡過了這個時期,剩下的就是手到擒來。 基本框架以內的問題,均能夠去解決。

那麼下麵,我就介紹一些 入門級 API (指令 或者 方法)

1.1 關於 vueJS 系統自帶常規指令的用法

1 : v-show

    <div v-show="true">
        this is true 
    </div>

原理: 類似我們在使用 JQ 時候的時候控制 DOM 顯示隱藏 的 display:none / block
因為在還沒有看 Vue 的源碼的前提下,我們可以通過 改變 屬性值 來查看 View 層的變化
這裡就是 動態的給對應的 Dom 添加了一個 style 的 display 的樣式

2 : v-if (v-else)

    <div v-if="true">
        this is A ( true ) 
    </div>

    <div v-else>
        this is B ( fasle) 
    </div>

原理: 類似我們在使用 JQ 時候的時候 動態的 添加/刪除 DOM

eg: var Dom = $(" <div title='香蕉'>香蕉</div >")  body.append(Dom)  /  Dom .remove()

熟悉 JQ 的同學應該 很容易就可以查看到 其中的原理了。是不是很簡單

3 : v-for

    <div>
        <ul>
            <li v-for='item in items'> 
                {{item.name}} 
                <span>{{item.age}}</span>
            </li>
        </ul>
    </div>
    new Vue({
        el: 'body',
        data: {
            items: [
                {name: 'zhangsan', age: 21},
                {name: 'lisi', age: 22},
                {name: 'wangwu', age: 23},
                {name: 'zhaoliu', age: 24}
            ]
        }
    })
註一: *** v-for 的 render 效果如下***
    <div>
        <ul>
            <li> zhangsan <span>21</span> </li>
            <li> lisi <span>22</span> </li>
            <li> wangwu <span>23</span> </li>
            <li> zhaoliu <span>24</span> </li>
        </ul>
    </div>

這個 v-for 如果沒有接觸過 上篇文章中提到過的 TP 這類MVC 框架開發的同學,可能稍微難以理解一點。
那這裡我們還是拿 JQ 的例子來說吧
在 JQ 開發中,我們常常會用 字元串 拼接的方式來 解決 ajax 返回數據的 顯示。 如果ajax返回一個數組的話,
我們就會在返回的時候 用 for 迴圈 來 生成我們最後想要是 字元串 然後 再 append 到對應的 節點位置。
但是在 vue 中就不存在 字元串拼接,那樣看著 辣眼睛的代碼 啦 是不是 很清爽的感覺啊

4 : v-bind

    <div>
        <span v-bind='isA'></span>
    </div>
    new Vue({
        el: 'body',
        data: {
            isA: 'this is dataA'
        }
    })
註一: ***v-bind 的 render 效果如下***
    <div>
        <span>this is dataA</span>
    </div>  

註二: v-bind 同樣也可以直接 用 鬍子標簽替換

    <div>
        <span> {{isA}} </span>
    </div>

這裡我們同樣用JQ 的例子 來解釋 為什麼會是這樣子的

在JQ 中如果,我們需要動態的去展示一個 屬性值的話, 我們首先 需要 獲取節點 $ =》 然後再生成 拼接之後的字元串 =》 然後再 append 到對應的節點位置 =》 屬性值發生改變 =》我們又需要改變一下 我們拼接是字元串 =》 再 append 到對應的節點位置

但是在 Vue 中 就會簡單很多。如上圖。 當 data 對象中屬性值發生改變,vue 實例化過程會給其屬性均添加 getter setter 方法去監聽其值的改變,最後反應在視圖上。根本不需要我們手動去改任何東西

5 : v-bind: class

    <div v-bind:class="{'active': isActive}">
        <span> {{isA}} </span>
    </div>
    // 這裡是css文件
    .active{
        color: red;
    }
    new Vue({
        el: 'body',
        data: {
            isA: 'this is dataA',
            isActive: true
        }
    })
註一: ***v-bind:class 的 render 效果如下***
    <div class="active">
        <span> this is dataA </span>
    </div>

註二: v-bind:class 同樣也可以直接 用 : class 簡寫

    <div :class="{'active': isActive}">
        <span> {{isA}} </span>
    </div>

這裡是 動態的給節點 添加 / 刪除 Class 樣式。 在JQ 中我們通常是 先獲取節點 $ =》 再 $.addClass('xxx'); => 刪除的話 $.removeClass('xxx')
啊,長時間的寫 Vue 再讓我去寫JQ 好難受啊啊啊啊啊

6 : v-bind:style

>  註一: ***v-bind:style 的用法同 v-class  類似***
    <div v-bind:style="{ color: isColorA, fontSize: fontSize + 'px'}">
        <span> this is dataA </span>
    </div>
    new Vue({
        el: 'body',
        data: {
            isA: 'this is dataA',
            isActive: true,
            isColorA: blue,
            fontSize: 20
        }
    })
註二: ***v-bind:style 的 render 效果如下***
    <div style="color: blue; font-size: 20px;">
        <span> this is dataA </span>
    </div>

註三: v-bind:style 可以 簡寫如下

    <div :style="{{ color: isColorA, fontSize: fontSize + 'px'}}">
        <span> this is dataA </span>
    </div>

這裡是 動態的給節點 添加 / 刪除 Class 或 style 樣式。 在JQ 中我們通常是 先獲取節點 $ =》 添加樣式的話 $.css('height': "20px") => 刪除樣式 $.removeAttr("style")
難受。

7 : v-bind : href

>  註一: ***v-bind : href 的用法同 v-class  類似***
    <div v-bind:style="{{ color: isColorA, fontSize: fontSize + 'px'}}">
        <span> this is dataA </span>
        <a v-bind:href="hrefUrl"> this is a link </a>
    </div>
    new Vue({
        el: 'body',
        data: {
            isA: 'this is dataA',
            isActive: true,
            isColorA: blue,
            fontSize: 20,
            hrefUrl: 'http://h5.runjiaoyu.com.cn'
        }
    })
 註二: ***v-bind : href 的 render 效果如下***
    <div style="color: blue; font-size: 20px;">
        <span> this is dataA </span>
        <a href='http://h5.runjiaoyu.com.cn'></a>
    </div>
註三: ***v-bind : href 可以 簡寫如下 ***
    <div :style="{{ color: isColorA, fontSize: fontSize + 'px'}}">
        <span> this is dataA </span>
    </div>
註四: ***v-bind : href  同樣也可以可以 簡寫如下 ***
    <div :style="{{ color: isColorA, fontSize: fontSize + 'px'}}">
        <span> this is dataA </span>
        <a href={{hrefUrl}}> this is a link </a>
    </div>

同樣 當我們同JQ 去改變某個 a 標簽的 href 的值的時候, 首先獲取a標簽節點 $ =》 改變它的值 $.attr('href', 'www.xxx.com');
繼續難受。

8 : v-click

    <div v-bind:style="{{ color: isColorA, fontSize: fontSize + 'px'}}">
        <span> this is dataA </span>
        <a href={{hrefUrl}}> this is a link </a>
        <button v-click='toDo($index)'> click Me </button>
        <button v-click='nextToDo($event)'> click Me </button>
    </div>
    new Vue({
        el: 'body',
        data: {
            isA: 'this is dataA',
            isActive: true,
            isColorA: blue,
            fontSize: 20,
            hrefUrl: 'http://h5.runjiaoyu.com.cn'
        },
        methods: {
            toDo: function() {
                // to do something
            },
            nextToDo: function(e) {
                console.log(e.target)
                // to do something else 
            }
        }
    })
註一: ***v-click   可以 簡寫如下 ***
    <div :style="{{ color: isColorA, fontSize: fontSize + 'px'}}">
        <span> this is dataA </span>
        <button @click='toDo'> click Me </button>
        <button @click='nextToDo'> click Me </button>       
    </div>

在 JQ 中我們 去給 節點綁定方法,首先肯定是獲取節點 $ =》 然後 $.addEventsListener('click', func) / $.on('click', func)。 這類閉包寫多了,代碼異常難看,講真。
不信你看看上面的 Vue 的代碼。

1.1.2 關於 vueJS 、 avalon 、 Knockout 等 MVVM 標簽渲染 原理解讀

    var greeting = 'my name is $(name),age $(age)';
    var result = greeting.render({name:'XiaoMing',age:11});
    console.log(result); // my name is XiaoMing,age 11

我們給出一個 render 的方法 實現以上需求
代碼如下:

String.prototype.render = function (obj) {
    var str = this, reg;

    Object.keys(obj).forEach(function (v) {
        reg = new RegExp('\\$\\('+ v +'\\)', 'g');
        str = str.replace(reg, obj[v]);
    });

    return str;
}

var greeting = 'my name is $(name),age $(age)';
var result = greeting.render({name:'XiaoMing',age:11});
console.log(result); // my name is XiaoMing,age 11

最後再提一點 體積。 JQ 現在 是 100K 左右, Vue 最小 30K 左右。
Vue 看起來就像是一個靈活的 小猴子呀。

此章節到此結束 文檔已 歸置 github

可能這個時候又有同學要問了,卧槽,不是說好了要介紹 Vue 的入門麽?

為什麼你的入門裡面,基本上都是講的 用法什麼的,對於我這個一無所知的 我來說很難理解啊。

記住Vue 作者 尤雨溪 曾經說過的一句話,如果 學習Vue 通過看文檔都不能學會,那就是 Vue 的錯。



您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 封裝就是將相關的方法或者屬性抽象成為一個對象。 封裝的意義: 當代碼中包含許多條件判斷,為了改善代碼的可讀性和可維護性,我們可以將條件封裝。 有兩種封裝方式: 一、無參數的條件判斷,封裝為屬性 重構前代碼 public class RemoteControl { private string[] F ...
  • 本文轉載至http://www.cnblogs.com/chenluomenggongzi/p/5950670.html 上面的代碼點擊後會回到頁面頂部。 解決問題: 好了,問題解決\(^o^)/~ 如果想給a標簽添加點擊事件,可以這樣寫 ...
  • javaScript基礎詳解 版權聲明 本文原創作者:雨點的名字 作者博客地址:https://home.cnblogs.com/u/qdhxhz/ 首先講javaScript的擺放位置:<script> 與 </script> 可以放在head和body之間,也可以body中或者head中 Jav ...
  • 效果體驗:http://hovertree.com/texiao/jquery/93/豎直的主菜單貼著頁面左側,當游標移入菜單項時,以3D動畫的方式彈出對應的二級菜單。採用jQuery和CSS3實現。支持Chrome,火狐,Edge等瀏覽器。效果圖:代碼如下: 對於代碼中的jQuery事件,可以使用 ...
  • jQuery是一套跨瀏覽器的JavaScript函數庫,簡化HTML與JavaScript之間的操作。由約翰·雷西格(John Resig)在2006年1月的BarCamp NYC上發佈第一個版本。目前是由Dave Methvin領導的開發團隊進行開發。全球前10,000個訪問最高的網站中,有65% ...
  • animation-name: 選擇器名稱 animation-duration: 完成動畫所需時間 animation-timing-function: 動畫的速度曲線 animation-delay: 動畫開始之前的延遲 animation-iteration-count: 播放的次數 anim ...
  • 背景 項目開發過程中可能會遇到首次打開一個工具欄有特別多圖標的網站,圖標載入特別慢 原因分析 如果伺服器上存的圖片都是單獨分開的話,那打開網站後,面板上的所有圖標是不是都要請求伺服器呢?次數是不是就多了? 那我們就減少請求伺服器次數。優化一是本次文章的主題:切圖,其它優化是網頁優化 優化一:切圖 讓 ...
  • 今天用angular寫table的時候,遇到了一個問題。在ng-repeat中,含有動態的html,而這些html中含有自定義指令。 因為希望實現一個能夠復用的table,所以定義了一個指令myStandTable,指令代碼大概如下: tableTem.html文件代碼如下: 控制器文件代碼如下: ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...