善假于物:前端mvvm框架vue.js

工欲善其事必先利其器(多學一點知識,少寫一行代碼:)

vue學習筆記

關于vue

(2015年 前端也開始模塊化工程化了,前端框架層出不窮)
vue的作者是ex-Googler,阿里的Weex(vue作者說不介意叫Vue-Native呵呵)也是借鑒了vue

需要知道的基礎知識

先看一個 todolist栗子

    html
    //要操作的對象
    <div id="app">
    //綁定模型 按鍵事件
      <input v-model="newTodo" v-on:keyup.enter="addTodo">
      <ul>
        //循環(huán)
        <li v-for="todo in todos">
           //文本插值 
          <span>{{ todo.text }}</span>
          //  指令的值 為綁定表達式(參數(shù))
          <button v-on:click="removeTodo($index)">X</button>
        </li>
      </ul>
    </div>
    js
    //創(chuàng)建vue
    new Vue({
        //創(chuàng)建對象        
        el: '#app',
        //屬性賦值     
        data: {
            newTodo: '',
            todos: [
                { text: 'Add some todos' }
            ]
        },
        //調(diào)用方法
        methods: {
            //方法一 添加todo
            addTodo: function () {
                //去掉空格
                var text = this.newTodo.trim()
                if (text) {
                    //加入數(shù)組
                    this.todos.push({ text: text })
                    //置空
                    this.newTodo = ''
                }
             },
             //方法二 刪除todo
             removeTodo: function (index) {
                //刪除
                 this.todos.splice(index, 1)
             }
         }
    })
  • 雙向綁定
    數(shù)據(jù)(dom文本或結(jié)構(gòu))和視圖同步變化

      var data = { a: 1 }
      var vm = new Vue({
        data: data
      })
      vm.a === data.a // -> true    
      // 設置屬性也會影響到原始數(shù)據(jù)
      vm.a = 2
      data.a // -> 2    
      // ... 反之亦然
      data.a = 3
      vm.a // -> 3
    
    • 數(shù)據(jù)綁定最基礎的形式是文本插值

              <span>Message: {{ msg }}</span>  //2個Mustache 標簽
              <span>This will never change: {{* msg }}</span>  //*單次插值
      
    • HTML屬性(Attributes) 插入( Vue.js 指令和特殊特性內(nèi)不能用插值)

              <div id="item-{{ id }}"></div>
      
  • 放在 Mustache 標簽內(nèi)的文本稱為綁定表達式
    (一段綁定表達式 由一個簡單的 JavaScript 表達式和可選的一個或多個過濾器構(gòu)成)

      {{ number + 1 }}
      {{ ok ? 'YES' : 'NO' }}
      {{ message.split('').reverse().join('') }}
      //一個限制是每個綁定只能包含單個表達式(壞栗如下,不能這么吃?。?!)
      <!-- 這是一個語句,不是一個表達式: -->
      {{ var a = 1 }}
      <!-- 流程控制也不可以,可改用三元表達式 -->
      {{ if (ok) { return message } }}
    
  • 過濾器 (Filter)

      //將表達式 message 的值“管輸(pipe)”到內(nèi)置的 filterA過濾器。
      //過濾器函數(shù)始終以表達式的值作為第一個參數(shù)。
      //帶引號的參數(shù)視為字符串,而不帶引號的參數(shù)按表達式計算。
      //字符串 'arg1' 將傳給過濾器作為第二個參數(shù),表達式 arg2 的值在計算出來之后作為第三個參數(shù)。
      {{ message | filterA 'arg1' arg2 | filterB }}
    
  • 指令 (Directives)
    是特殊的帶有前綴 v- 的特性。指令的值限定為綁定表達式

      //v-if 指令將根據(jù)表達式 greeting 值的真假刪除/插入 <p> 元素。
      <p v-if="greeting">Hello!</p>
      //有些指令可以在其名稱后面帶一個“參數(shù)” (Argument),中間放一個冒號隔開
      <a v-bind:href="url"></a> // 縮寫 <a :href="url"></a>
      <a v-on:click="doSomething"> // 縮寫 <a @click="doSomething">
    
  • 修飾符 (Modifiers)
    以半角句號 . 開始的特殊后綴,用于表示指令應當以特殊方式綁定

      //.literal 告訴指令 將它的值 解析為一個字面字符串 而不是一個表達式
      <a v-bind:href.literal="/a/b/c"></a>
    
  • 計算屬性

    • 計算屬性默認是 getter

       <div id="example">
          a={{ a }}, b={{ b }}
         </div>         
      var vm = new Vue({
      el: '#example',
      data: {
        a: 1
      },
      computed: {
        // 一個計算屬性的 getter
        b: function () {
          // `this` 指向 vm 實例
          return this.a + 1
        }
      }
      })
      
        a=1,b=2   
        console.log(vm.b) // -> 2
        vm.a = 2
        console.log(vm.b) // -> 3
      
    • $watch(用于觀察 Vue 實例上的數(shù)據(jù)變動)

      <div id="demo">{{fullName}}</div>
       var vm = new Vue({
        data: {
        firstName: 'Foo',
        lastName: 'Bar',
        fullName: 'Foo Bar'
        }
      })    
      vm.$watch('firstName', function (val) {
      this.fullName = val + ' ' + this.lastName
      })    
      vm.$watch('lastName', function (val) {
      this.fullName = this.firstName + ' ' + val
      })
      //當一些數(shù)據(jù)需要根據(jù)其它數(shù)據(jù)變化時,通常更好的辦法是使用計算屬性 而不是一個命令式的 $watch 回調(diào)。
      //最優(yōu)解
      var vm = new Vue({
      data: {
        firstName: 'Foo',
        lastName: 'Bar'
      },
      computed: {
        fullName: function () {
          return this.firstName + ' ' + this.lastName
        }
      }
      })  
      
    • 計算屬性setter

      // ...
      computed: {
      fullName: {
        // getter
        get: function () {
          return this.firstName + ' ' + this.lastName
        },
        // setter
        set: function (newValue) {
          var names = newValue.split(' ')
          this.firstName = names[0]
          this.lastName = names[names.length - 1]
        }
      }
      }
      // 現(xiàn)在在調(diào)用 vm.fullName = 'John Doe' 時,setter 會被調(diào)用,vm.firstName 和 vm.lastName 也會有相應更新。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容