Vue-表單操作、自定義指令、計算屬性(computed)、偵聽器(watch)、過濾器、數組變異方法、響應式數據處理

表單操作

表單基本操作

獲取單選框中的值:通過v-model

 	<!-- 
		1、 兩個單選框需要同時通過v-model 雙向綁定 一個值 
        2、 每一個單選框必須要有value屬性  且value 值不能一樣 
		3、 當某一個單選框選中的時候 v-model  會將當前的 value值 改變 data 中的 數據

		gender 的值就是選中的值,我們只需要實時監控他的值就可以了
	-->
   <input type="radio" id="male" value="1" v-model='gender'>
   <label for="male"></label>

   <input type="radio" id="female" value="2" v-model='gender'>
   <label for="female"></label>

<script>
    new Vue({
         data: {
             // 默認會讓當前的 value 值爲 2 的單選框選中
                gender: 2,  
            },
    })

</script>

獲取複選框中的值:通過v-model

  • 和獲取單選框中的值一樣
  • 複選框 checkbox 這種的組合時 data 中的 hobby 我們要定義成數組 否則無法實現多選
	<!-- 
		1、 複選框需要同時通過v-model 雙向綁定 一個值 
        2、 每一個複選框必須要有value屬性  且value 值不能一樣 
		3、 當某一個單選框選中的時候 v-model  會將當前的 value值 改變 data 中的 數據

		hobby 的值就是選中的值,我們只需要實時監控他的值就可以了
	-->

<div>
   <span>愛好:</span>
   <input type="checkbox" id="ball" value="1" v-model='hobby'>
   <label for="ball">籃球</label>
   <input type="checkbox" id="sing" value="2" v-model='hobby'>
   <label for="sing">唱歌</label>
   <input type="checkbox" id="code" value="3" v-model='hobby'>
   <label for="code">寫代碼</label>
 </div>
<script>
    new Vue({
         data: {
                // 默認會讓當前的 value 值爲 2 和 3 的複選框選中
                hobby: ['2', '3'],
            },
    })
</script>

獲取下拉框和文本框中的值:通過v-model

   <div>
      <span>職業:</span>
       <!--
			1、 需要給select  通過v-model 雙向綁定 一個值 
            2、 每一個option  必須要有value屬性  且value 值不能一樣 
		    3、 當某一個option選中的時候 v-model  會將當前的 value值 改變 data 中的 數據
		     occupation 的值就是選中的值,我們只需要實時監控他的值就可以了
		-->
       <!-- multiple  多選 -->
      <select v-model='occupation' multiple>
          <option value="0">請選擇職業...</option>
          <option value="1">教師</option>
          <option value="2">軟件工程師</option>
          <option value="3">律師</option>
      </select>
         <!-- textarea 是 一個雙標籤   不需要綁定value 屬性的  -->
        <textarea v-model='desc'></textarea>
  </div>
<script>
    new Vue({
         data: {
                // 默認會讓當前的 value 值爲 2 和 3 的下拉框選中
                 occupation: ['2', '3'],
             	 desc: 'nihao'
            },
    })
</script>

表單修飾符
表單域修飾符

  • number:轉化爲數值
  • trim:去掉開始和結尾的空格
  • lazy : 將input事件切換爲change事件
<!-- number轉化爲數值() 、輸入框中的值是字符串-->
<input type="text" v-model.number='age'>
<!-- trim去除兩端空格() -->
<input type="text" v-model.trim='info'>
<!--改變v-model默認input事件爲change事件(失去焦點才觸發) -->
<input type="text" v-model='msg'>

自定義指令
內置指令不滿足需求

Vue.directive 註冊全局指令

<!-- 
  使用自定義的指令,只需在對用的元素中,加上'v-'的前綴形成類似於內部指令'v-if''v-text'的形式。 
-->
<input type="text" v-focus>
<script>
// 注意點: 
//   1、 在自定義指令中  如果以駝峯命名的方式定義 如  Vue.directive('focusA',function(){}) 
//   2、 在HTML中使用的時候 只能通過 v-focus-a 來使用 
    
// 註冊一個全局自定義指令 v-focus
Vue.directive('focus', {
  	// 當綁定元素插入到 DOM 中。 其中 el爲dom元素
  	inserted: function (el) {
    		// 聚焦元素
    		el.focus();
 	}
});
new Vue({
  el:'#app'
});
</script>

Vue.directive 註冊全局指令 帶參數

  <input type="text" v-color='msg'>
 <script type="text/javascript">
    /*
      自定義指令-帶參數
      bind - 只調用一次,在指令第一次綁定到元素上時候調用

    */
    Vue.directive('color', {
      // bind聲明週期, 只調用一次,指令第一次綁定到元素時調用。在這裏可以進行一次性的初始化設置
      // el 爲當前自定義指令的DOM元素  
      // binding 爲自定義的函數形參   通過自定義屬性傳遞過來的值 存在 binding.value 裏面
      bind: function(el, binding){
        // 根據指令的參數設置背景色
        // console.log(binding.value.color)
        el.style.backgroundColor = binding.value.color;
      }
    });
    var vm = new Vue({
      el: '#app',
      data: {
        msg: {
          color: 'blue'
        }
      }
    });
  </script>

自定義指令局部指令

  • 局部指令,需要定義在 directives 的選項 用法和全局用法一樣
  • 局部指令只能在當前組件裏面使用
  • 當全局指令和局部指令同名時以局部指令爲準
<input type="text" v-color='msg'>
 <input type="text" v-focus>
 <script type="text/javascript">
    /*
      自定義指令-局部指令
    */
    var vm = new Vue({
      el: '#app',
      data: {
        msg: {
          color: 'red'
        }
      },
   	  //局部指令,需要定義在  directives 的選項
      directives: {
        color: {
          bind: function(el, binding){
            el.style.backgroundColor = binding.value.color;
          }
        },
        focus: {
          inserted: function(el) {
            el.focus();
          }
        }
      }
    });
  </script>
計算屬性 computed
  • 把複雜的代碼抽取到computed中、讓模板更加的簡潔
  • 計算屬性是基於它們的響應式依賴進行緩存的(數據不變、緩存不變)
  • 計算屬性的值是通過返回值決定的、基於data數據做處理
 <div id="app">
     <!--  
        當多次調用 reverseString  的時候 
        只要裏面的 num 值不改變 他會把第一次計算的結果直接返回
		直到data 中的num值改變 計算屬性纔會重新發生計算
     -->
    <div>{{reverseString}}</div>
    <div>{{reverseString}}</div>
     <!-- 調用methods中的方法的時候  他每次會重新調用 -->
    <div>{{reverseMessage()}}</div>
    <div>{{reverseMessage()}}</div>
  </div>
  <script type="text/javascript">
    /*
      計算屬性與方法的區別:計算屬性是基於依賴進行緩存的,而方法不緩存
    */
    var vm = new Vue({
      el: '#app',
      data: {
        msg: 'Nihao',
        num: 100
      },
      methods: {
        reverseMessage: function(){
          console.log('methods')
          return this.msg.split('').reverse().join('');
        }
      },
      //computed  屬性 定義 和 data 已經 methods 平級 
      computed: {
        //  reverseString   這個是我們自己定義的名字 
        reverseString: function(){
          console.log('computed')
          var total = 0;
          //  當data 中的 num 的值改變的時候  reverseString  會自動發生計算  
          for(var i=0;i<=this.num;i++){
            total += i;
          }
          // 這裏一定要有return 否則 調用 reverseString 的 時候無法拿到結果    
          return total;
        }
      }
    });
  </script>

偵聽器 watch

  • 使用watch來偵聽數據的變化、
  • 一般用於異步或者開銷較大的操作
  • 當需要監聽一個對象的改變時,普通的watch方法無法監聽到對象內部屬性的改變,只有data中的數據才能夠監聽到變化,此時就需要deep屬性對對象進行深度監聽
 <div id="app">
        <div>
            <span>名:</span>
            <span>
        <input type="text" v-model='firstName'>
      </span>
        </div>
        <div>
            <span>姓:</span>
            <span>
        <input type="text" v-model='lastName'>
      </span>
        </div>
        <div>{{fullName}}</div>
    </div>

  <script type="text/javascript">
        /*
              偵聽器
            */
        var vm = new Vue({
            el: '#app',
            data: {
                firstName: 'Jim',
                lastName: 'Green',
                // fullName: 'Jim Green'
            },
             //watch  屬性 定義 和 data 已經 methods 平級 
            watch: {
                //   注意:  這裏firstName  對應着data 中的 firstName 
                //   當 firstName 值 改變的時候  會自動觸發 watch
                firstName: function(val) {
                    this.fullName = val + ' ' + this.lastName;
                },
                //   注意:  這裏 lastName 對應着data 中的 lastName 
                lastName: function(val) {
                    this.fullName = this.firstName + ' ' + val;
                }
            }
        });
    </script>

需要返回一個新的結果使用 計算屬性(computed)、
只需要監聽數據的變化使用偵聽器(watch)

過濾器

  • 自定義過濾器,可被用於一些常見的文本格式化。
  • 過濾器可以用在兩個地方:雙花括號插值和v-bind表達式
  • 過濾器應該被添加在JavaScript表達式的尾部,由“管道”符號指示
  • 支持級聯操作
  • 過濾器不改變真正的data,而只是改變渲染的結果,並返回過濾後的版本
  • 全局註冊時是filter,沒有s的。而局部過濾器是filters,是有s的
  <div id="app">
    <input type="text" v-model='msg'>
      <!-- upper 被定義爲接收單個參數的過濾器函數,表達式  msg  的值將作爲參數傳入到函數中 -->
    <div>{{msg | upper}}</div>
    <!--  
      支持級聯操作
      upper  被定義爲接收單個參數的過濾器函數,表達式msg 的值將作爲參數傳入到函數中。
	  然後繼續調用同樣被定義爲接收單個參數的過濾器 lower ,將upper 的結果傳遞到lower中
 	-->
    <div>{{msg | upper | lower}}</div>
    <div :abc='msg | upper'>測試數據</div>
  </div>

<script type="text/javascript">
   //  lower  爲全局過濾器     
   Vue.filter('lower', function(val) {
      return val.charAt(0).toLowerCase() + val.slice(1);
    });
    var vm = new Vue({
      el: '#app',
      data: {
        msg: ''
      },
       //filters  屬性 定義 和 data 已經 methods 平級 
       //  定義filters 中的過濾器爲局部過濾器 
      filters: {
        //   upper  自定義的過濾器名字 
        //    upper 被定義爲接收單個參數的過濾器函數,表達式  msg  的值將作爲參數傳入到函數中
        upper: function(val) {
         //  過濾器中一定要有返回值 這樣外界使用過濾器的時候才能拿到結果
          return val.charAt(0).toUpperCase() + val.slice(1);
        }
      }
    });
  </script>

過濾器中傳遞參數
傳遞參數規制:使用過濾器通過()的方式傳遞參數、接收參數從第二個開始接收

    <div id="box">
        <!--
			filterA 被定義爲接收三個參數的過濾器函數。
  			其中 message 的值作爲第一個參數,
			普通字符串 'arg1' 作爲第二個參數,表達式 arg2 的值作爲第三個參數。
		-->
        {{ message | filterA('arg1', 'arg2') }}
    </div>
    <script>
        // 在過濾器中 第一個參數 對應的是  管道符前面的數據   n  此時對應 message
        // 第2個參數  a 對應 實參  arg1 字符串
        // 第3個參數  b 對應 實參  arg2 字符串
        Vue.filter('filterA',function(n,a,b){
            if(n<10){
                return n+a;
            }else{
                return n+b;
            }
        });
        
        new Vue({
            el:"#box",
            data:{
                message: "哈哈哈"
            }
        })

    </script>

數組變異方法

vue把原生的數值API處理爲響應式、這樣的化只要操作數組數據、頁面模板就會跟着改變

數組方法 描述
push() 往數組最後面添加一個元素,成功返回當前數組的長度
pop() 刪除數組的最後一個元素,成功返回刪除元素的值
shift() 刪除數組的第一個元素,成功返回刪除元素的值
unshift() 往數組最前面添加一個元素,成功返回當前數組的長度
splice() 有三個參數,第一個是想要刪除的元素的下標(必選),第二個是想要刪除的個數(必選),第三個是刪除 後想要在原位置替換的值
sort() sort() 使數組按照字符編碼默認從小到大排序,成功返回排序後的數組
reverse() reverse() 將數組倒序,成功返回倒序後的數組

替換數組

  • 不會改變原始數組,但總是返回一個新數組
數組方法 描述
filter filter() 方法創建一個新的數組,新數組中的元素是通過檢查指定數組中符合條件的所有元素。
concat concat() 方法用於連接兩個或多個數組。該方法不會改變現有的數組
slice slice() 方法可從已有的數組中返回選定的元素。該方法並不會修改數組,而是返回一個子數組

響應式數據處理

  • Vue.set(a,b,c)
  • a是要更改的數據 、 b是數據的第索引、 c是要更改爲什麼值
     //(不具備響應式)
     // vm.info.gender='male';
      //vm.list[0]='lemon';

 //數據響應式處理
 // 以下兩種方式既可以處理數組索引、也可以處理對應屬性
 1、Vue.set(vm.list, 2, 'lemon');
 2、vm.$set(vm.info,'gender','female')


   
發佈了45 篇原創文章 · 獲贊 30 · 訪問量 2918
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章