Vue2-收集表單數據、過濾器、內置指令與自定義指令、Vue生命周期

🥔:我徒越萬重山 千帆過 萬木自逢春

更多Vue知識請點擊——Vue.js

VUE2-Day4

    • 收集表單數據
      • 1、不同標簽的value屬性
      • 2、v-model的三個修飾符
    • 過濾器
    • 內置指令與自定義指令
      • 1、內置指令
      • 2、自定義指令
        • 定義語法
        • (1)函數式
        • (2)對象式
    • Vue的生命周期
      • 1、什么是生命周期
      • 2、生命周期中的8個鉤子
      • 3、生命周期圖解(重要)
      • 4、生命周期案例

收集表單數據

1、不同標簽的value屬性

若:<input type="text"/>普通輸入框,則v-model收集的是value值,用戶輸入的就是value值。
若:<input type="radio"/>單選框,則v-model收集的是value值,且要給標簽配置value值。

若:<input type="checkbox"/>多選框

1、沒有配置input的value屬性,那么收集的就是checked(勾選 or 未勾選,是布爾值)
2、配置input的value屬性:
(1)v-model的初始值是非數組,那么收集的就是checked(勾選 or 未勾選,是布爾值)
(2)v-model的初始值是數組,那么收集的的就是value組成的數組
一句話,想正確收集,那么要寫上每個選項的value,且v-model綁定的初始值是數組

2、v-model的三個修飾符

v-model.lazy:實現不用實時收集,輸入框失去焦點再收集
v-model.number:輸入的字符串收集為數字(Vue內部做了數據轉換),通常和type="number"一起使用
v-model.trim:收集時去掉輸入的首尾空格

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><title>收集表單數據</title><script type="text/javascript" src="../js/vue.js"></script></head><body><div id="root"><!-- 這里form不需要action屬性,我們可以直接使用ajax --><form @submit.prevent="demo">賬號:<!-- v-model.trim去掉前后空格 --><input type="text" v-model.trim="userInfo.accout" /><br />密碼:<input type="password" v-model="userInfo.password" /><br />年齡:<!-- 前面一個number控制只能輸入數字,后面一個v-model.number把收集的信息轉成數值類型,這兩個一般搭配使用 --><input type="number" v-model.number="userInfo.age" /><br />性別: 男<inputtype="radio"name="sex"v-model="userInfo.sex"value="male"/><inputtype="radio"name="sex"v-model="userInfo.sex"value="female"/><br />愛好: 吃飯<inputtype="checkbox"v-model="userInfo.hobby"value="eat"/>睡覺<input type="checkbox" v-model="userInfo.hobby" value="sleep" />打豆豆<inputtype="checkbox"v-model="userInfo.hobby"value="beatbean"/><br />所屬校區:<select v-model="userInfo.city"><option value="">請選擇校區</option><option value="beijing">北京</option><option value="shanghai">上海</option><option value="guangzhou">廣州</option><option value="shenzhen">深圳</option></select><br />其他信息:<!-- v-model.lazy讓文本框不是實時收集,而是輸入完后失去焦點才收集 --><textarea v-model.lazy="userInfo.other" cols="30" rows="5"></textarea><br /><input type="checkbox" v-model="userInfo.agree" />閱讀并接受<a href="https://blog.csdn.net/weixin_56498069?type=lately">《用戶協議》</a><button>提交</button></form></div><script type="text/javascript">new Vue({el: "#root",data: {userInfo: {accout: "",password: "",age: "",sex: "",//   多選的勾選框要寫成數組hobby: [],city: "",other: "",agree: "",},},methods: {demo() {console.log(JSON.stringify(this.userInfo));},},});</script></body>
</html>

過濾器

定義:對要顯示的數據進行特定格式化后再顯示(適用于一些簡單邏輯的處理比如價格1999改成1,999等需求,復雜的最好用計算屬性或方法)。
語法:
1、注冊過濾器:Vue.filter(name,callback) new Vue{filters:{}}
2、使用過濾器:{{ xxx | 過濾器名}} v-bind:屬性 = "xxx | 過濾器名"(第二種幾乎不用)
備注:
1、過濾器也可以接收額外參數、多個過濾器也可以串聯
2、并沒有改變原本的數據, 是產生新的對應的數據

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><title>過濾器</title><script src="../js/vue.js"></script><script src="../js/dayjs.min.js"></script></head><body><div id="root"><h1>當前時間是:{{time}}</h1><!-- 計算屬性實現 --><h1>當前時間是:{{formatTime}}</h1><!-- 方法實現 --><h1>當前時間是:{{getformatTime()}}</h1><!-- 過濾器實現 time傳給timeFormater,然后返回值替換整個部分--><h1>當前時間是:{{time | timeFormater}}</h1><!-- 過濾器實現(傳參)--><h1>當前時間是:{{time | timeFormater('YYYY——MM——DD')}}</h1><!-- 過濾器的串聯,一層一層往后傳,后面的接受的是前面的返回值--><h1>當前時間是:{{time | timeFormater('YYYY——MM——DD') | mySlice}}</h1><!-- 下面這個打開控制臺看元素節點就明白了 --><h3 :x="name | mySlice">DJ</h3></div><script type="text/javascript">// 全局過濾器Vue.filter("mySlice", function (val) {return val.slice(0, 4);});const vm = new Vue({el: "#root",data: {time: 1660472948789,name: "zhangziying",},computed: {formatTime: {get() {return dayjs(this.time).format("YYYY年MM月DD日 HH:mm:ss");},},},methods: {getformatTime() {return dayjs(this.time).format("YYYY年MM月DD日 HH:mm:ss");},},// 局部過濾器filters: {//第一個參數是管道符 | 前邊那玩意兒//第二個參數str來個默認值,如果傳了str就給,不傳就用默認值timeFormater(val, str = "YYYY年MM月DD日 HH:mm:ss") {// console.log(val);return dayjs(this.time).format(str);},mySlice(val) {//這里的val是上一個過濾器的返回值return val.slice(0, 4);},},});</script></body>
</html>

內置指令與自定義指令

1、內置指令

v-bind : 單向綁定解析表達式, 可簡寫為 :xxx
v-model : 雙向數據綁定
v-for : 遍歷數組/對象/字符串
v-on : 綁定事件監聽, 可簡寫為@
v-if : 條件渲染(動態控制節點是否存存在)
v-else : 條件渲染(動態控制節點是否存存在)
v-show : 條件渲染 (動態控制節點是否展示)

v-text指令:
作用:向其所在的節點中渲染文本內容。
與插值語法的區別:v-text會替換掉節點中的所有內容,插值語法{{xx}}則不會。

    <div id="root"><div>{{name}}</div><!-- 使用v-text --><!-- 只會顯示potato不會顯示你好,因為v-text會替換掉節點中的所有內容,并且不支持結構解析(不可以識別html結構) --><div v-text="name">你好,</div></div><script>new Vue({el: "#root",data: {name: "potato",},});</script>

v-html指令:
作用:向指定節點中渲染包含html結構的內容。
與插值語法的區別:
(1)v-html會替換掉節點中所有的內容,{{xx}}則不會,這點和v-text一樣。
(2)v-html可以識別html結構,這點和v-text區別,v-text不能渲染標簽。

    <div id="root"><!-- 使用v-html --><!-- v-html會替換掉節點中的所有內容,可以識別html結構 --><div v-html="str">你好,</div></div><script>new Vue({el: "#root",data: {str: "<h2>我是potato</h2>",},});</script>
  • 注意:v-html有安全性問題!
    (1)在網站上動態渲染任意HTML是非常危險的,容易導致XSS攻擊。
    (2)一定要在可信的內容上使用v-html,永不要用在用戶提交的內容上!

v-cloak指令(沒有值):
(1)本質是一個特殊屬性,Vue實例創建完畢并接管容器后,會刪掉v-cloak屬性。
(2)使用css配合v-cloak可以解決網速慢時頁面展示出{{xxx}}的問題,先隱藏標簽,然后Vue渲染完了之后刪除v-cloak,那么就能顯示渲染完之后的頁面了。

/* 選中所有包含v-cloak屬性的標簽 */
[v-cloak]{display: none;}
<h2 v-cloak>{{name}}</h2>

v-once指令:
(1)v-once所在節點在初次動態渲染后,就視為靜態內容了,也就是只讀一次。
(2)以后數據的改變不會引起v-once所在結構的更新,可以用于優化性能。

    <div id="root"><div>{{name}}</div><!-- 使用v-once --><h2 v-once>初識n值為:{{n}}</h2><h2>當前n值為:{{n}}</h2><button @click="n++">點我n+1</button></div><script>new Vue({el: "#root",data: {n: 1,},});</script>

v-pre指令:
(1)跳過其所在節點的編譯過程。
(2)可利用它跳過:沒有使用指令語法、沒有使用插值語法的節點,會加快編譯。

    <div id="root"><!-- 使用v-pre --><h2 v-pre>Vue其實很簡單</h2><h2>當前n值為:{{n}}</h2><button @click="n++">點我n+1</button></div><script>new Vue({el: "#root",data: {n: 1,},});</script>

2、自定義指令

定義語法

①局部指令(在實例里面寫)

new Vue({							new Vue({
directives:{指令名:配置對象}   或   		directives{指令名:回調函數}
}) 									})

②全局指令

Vue.directive(指令名,配置對象) 或 Vue.directive(指令名,回調函數)

注意:

  • 指令定義時不加v-,但使用時要加v-
  • 指令名如果是多個單詞要用-分隔,比如使用big-number命名方式,不要用bigNumber命名
  • directives配置對象中所有函數的this都指向window,這個和其他的不同,尤其注意

(1)函數式

函數中有兩個參數,第一個參數是指令所在的標簽(真實DOM),第二個參數是一個存著指令值的對象,通過對象名.value就能獲取當前綁定的值。

何時調用?
1、指令與元素成功綁定時(一上來,沒放入頁面之前)
2、指令所在的模板被重新解析時

需求:定義一個v-big指令,和v-text功能類似,但會把綁定的數值放大10倍。

    <div id="root"><h2>當前的n值是:<span v-text="n">{{n}}</span></h2><h2>放大的n值是:<span v-big="n">{{n}}</span></h2><button @click="n++">點我n+1</button></div><script>new Vue({el: "#root",data: {n: 1,},directives: {big(element, binding) {element.innerText = binding.value * 10;},},});</script>

(2)對象式

配置對象中常用的3個回調:
(1).bind:指令與元素成功綁定時(一上來,沒放入頁面之前)
(2).inserted:指令所在元素被插入頁面時調用(放入頁面后)
(3).update:指令所在模板結構被重新解析時調用(有任意data中的東西被改了)。

需求2:定義一個v-fbind指令,和v-bind功能類似,但可以讓其所綁定的input元素默認獲取焦點。
使用函數調用element.focus()不奏效,因為big函數執行時頁面上還沒放入input,focus必須在input插入頁面后才能有效果。所以這里我們只能用對象式

    <div id="root"><input type="text" v-fbind:value="n" /></div><script>new Vue({el: "#root",data: {n: 1,},directives: {fbind: {bind(element, binding) {element.value = binding.value;},inserted(element, binding) {element.focus();},update(element, binding) {element.value = binding.value;},},},});</script>

本質上二者差不多,你會發現函數式其實就是對象式中的bind和update的合并,如果在某些時候要實現一些特殊的效果,比如獲取焦點、操作節點父元素等需要等元素插入頁面后才能操作它的這些操作,只能用對象式,靠的就是inserted函數

Vue的生命周期

1、什么是生命周期

生命周期

  1. 又名:生命周期回調函數生命周期函數生命周期鉤子

  2. 是什么:Vue在關鍵時刻幫我們調用的一些特殊名稱的函數

  3. 生命周期函數的名字不可更改,但函數的具體內容是程序員根據需求編寫的。

  4. 生命周期函數中的this指向是vm 或 組件實例對象

2、生命周期中的8個鉤子

常用的生命周期鉤子:

  1. mounted: 發送ajax請求、啟動定時器、綁定自定義事件、訂閱消息等【初始化操作】。

  2. beforeDestroy: 清除定時器、解綁自定義事件、取消訂閱消息等【收尾工作】。

關于銷毀Vue實例:

  1. 銷毀后借助Vue開發者工具看不到任何信息。

  2. 銷毀后自定義事件會失效,但原生DOM事件依然有效(現在的版本好像也會失效)。(留個疑點,啥是自定義事件?啥是原生DOM事件?答:自定義事件就是定義在組件標簽上的事件,是組件通信的一種方式,原生DOM事件就是類似onclick這種的)。銷毀后所有的監視也沒了

  3. 一般不會在beforeDestroy操作數據,因為即便操作數據,也不會再觸發更新流程了。

   <!-- 準備一個容器 --><div id="hello"><h1>當前n值為:{{n}}</h1><button @click="add">點擊n+1</button></div><script>const vm = new Vue({el: '#hello',data: {n: 1},methods: {add() {this.n++;}},beforeCreate() {console.log('beforeCreate');console.log(this);// debugger;},created() {console.log('created');},beforeMount() {console.log('beforeMount');},mounted() {console.log('mounted');},beforeUpdate() {console.log('beforeUpdate');},updated() {console.log('updated');},beforeDestroy() {console.log('beforeDestroy');},destryed() {console.log('destryed');}})</script>

3、生命周期圖解(重要)

請添加圖片描述

4、生命周期案例

<!-- 準備一個容器 -->
<div id="hello"><h1 :style="{opacity: opacity}">歡迎學習Vue</h1><button @click="stop">點擊停止閃爍</button>
</div><script>const vm = new Vue({el: '#hello',data: {opacity: 1},methods: {stop() {// clearInterval(this.timer);  vm可以這么寫(類比自殺),也可以寫在beforeDestroy中(類別他殺)this.$destroy();  //vm自殺}},//掛載意思就是放在頁面上//掛載函數,Vue完成模板的解析并把*初始的(只調用一次)*真實DOM放入頁面后(完成掛載)調用mountedmounted() {this.timer = setInterval(() => {console.log('計時器調用');this.opacity -= 0.01;if (this.opacity <= 0) this.opacity = 1;  }, 16)},beforeDestroy() {console.log('vm即將被銷毀');// 為什么vm的后事需要寫在這里,是因為vm很有可能是被別人干掉的clearInterval(this.timer);},})//通過外部的定時器實現(不推薦)// setInterval(() => {//     vm.opacity -= 0.01;//     if (vm.opacity <= 0) vm.opacity = 1; // }, 16);
</script>

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/37067.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/37067.shtml
英文地址,請注明出處:http://en.pswp.cn/news/37067.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

文獻綜述|NLP領域后門攻擊、檢測與防御

前言&#xff1a;在信息安全中后門攻擊&#xff08;Backdoor Attack&#xff09;是指繞過安全控制而獲取對程序或系統訪問權的方法。而隨著深度學習以及各種神經網絡模型的廣泛應用&#xff0c;神經網絡中存在的后門問題也引起了研究人員的廣泛關注。神經網絡后門攻擊就是使網絡…

Android AOSP源碼編譯——AOSP整編(二)

切換到源碼目錄下執行下面命令 1、初始化環境 . build/envsetup.sh //清除緩存 make clobber2、選擇編譯目標 lunchAOSP 預制了很多 Product。這里為了簡單我們先不用真機&#xff0c;而是選擇模擬器的方式&#xff0c;對于 x86_64 模擬器&#xff0c;我們選擇的是 aosp_x86…

redisson配置類---SpringBoot集成、redis單機和集群模式配置

1項目配置文件&#xff1a; 1.1&#xff1a;pom.xml <dependency><groupId>org.redisson</groupId><artifactId>redisson-spring-boot-starter</artifactId><version>3.17.7</version></dependency> 1.2 application.yml配置…

深度學習筆記(kaggle課程《Intro to Deep Learning》)

一、什么是深度學習&#xff1f; 深度學習是一種機器學習方法&#xff0c;通過構建和訓練深層神經網絡來處理和理解數據。它模仿人腦神經系統的工作方式&#xff0c;通過多層次的神經網絡結構來學習和提取數據的特征。深度學習在圖像識別、語音識別、自然語言處理等領域取得了…

Opencv將數據保存到xml、yaml / 從xml、yaml讀取數據

Opencv將數據保存到xml、yaml / 從xml、yaml讀取數據 Opencv提供了讀寫xml、yaml的類實現&#xff1a; 本文重點參考&#xff1a;https://blog.csdn.net/cd_yourheart/article/details/122705776?spm1001.2014.3001.5506&#xff0c;并將給出文件讀寫的具體使用實例。 1. 官…

C++多線程場景中的變量提前釋放導致棧內存異常

多線程場景中的棧內存異常 在子線程中嘗試使用當前函數的資源&#xff0c;是非常危險的&#xff0c;但是C支持這么做。因此C這么做可能會造成棧內存異常。 正常代碼 #include <iostream> #include <thread> #include <windows.h>// 線程函數&#xff0c;用…

Fast-Newman算法和louvain算法

fast-newman算法 fast-newman算法是一種用于社區發現的算法。它是基于newman算法的改進版本&#xff0c;旨在提高算法的運行速度和效率。fast-newman算法通過將網絡劃分為多個子圖&#xff0c;并在每個子圖上進行社區劃分&#xff0c;然后再將子圖合并&#xff0c;最終得到整個…

【分布式存儲】數據存儲和檢索~LSM

在數據庫領域&#xff0c;B樹擁有無可撼動的地位&#xff0c;但是B樹的缺點就是在寫多讀少的場景下&#xff0c;需要進行大量隨機的磁盤IO讀寫&#xff0c;而這個性能是最差的。并且在刪除和添加數據的時候&#xff0c;會造成整個樹進行遞歸的合并、分裂&#xff0c;數據在磁盤…

【JVM】類裝載的執行過程

文章目錄 類裝載的執行過程1.加載2.驗證3.準備4.解析5.初始化6.使用7.卸載 類裝載的執行過程 類裝載總共分為7個過程&#xff0c;分別是 加載&#xff0c;驗證&#xff0c;準備、解析、初始化、使用、卸載 1.加載 將類的字節碼文件加載到內存(元空間&#xff09;中。這一步會…

16.3.1 【Linux】程序的觀察

既然程序這么重要&#xff0c;那么我們如何查閱系統上面正在運行當中的程序呢&#xff1f;利用靜態的 ps 或者是動態的 top&#xff0c;還能以 pstree 來查閱程序樹之間的關系。 ps &#xff1a;將某個時間點的程序運行情況擷取下來 僅觀察自己的 bash 相關程序&#xff1a; p…

Keburnetes 存儲卷 volumes

K8S 的 存儲卷 volumes emptyDir 可實現Pod中的容器之間共享目錄數據&#xff0c;但emptyDir存儲卷沒有持久化數據的能力&#xff0c;存儲卷會隨著Pod生命周期結束而一起刪除 &#xff08;一個pod中創建了docker1 docker2兩個容器&#xff0c;他們都掛載這個emptyDir&#xff0…

Gradle依賴管理:編譯時和運行時依賴的區別

&#x1f337;&#x1f341; 博主貓頭虎 帶您 Go to New World.?&#x1f341; &#x1f984; 博客首頁——貓頭虎的博客&#x1f390; &#x1f433;《面試題大全專欄》 文章圖文并茂&#x1f995;生動形象&#x1f996;簡單易學&#xff01;歡迎大家來踩踩~&#x1f33a; &a…

【LeetCode】《LeetCode 101》第十一章:妙用數據結構

文章目錄 11.1 C STL11.2 數組448. 找到所有數組中消失的數字&#xff08;簡單&#xff09;48. 旋轉圖像&#xff08;中等&#xff09;74. 搜索二維矩陣&#xff08;中等&#xff09;240. 搜索二維矩陣 II&#xff08;中等&#xff09;769. 最多能完成排序的塊&#xff08;中等…

java重寫與重載的區別

在Java中&#xff0c;重寫&#xff08;Override&#xff09;和重載&#xff08;Overload&#xff09;是兩種不同的概念&#xff1a; 重寫&#xff08;Override&#xff09;&#xff1a; 重寫是指子類重新定義&#xff08;覆蓋&#xff09;了從父類繼承而來的方法。重寫要求子類…

ROSpider機器人評測報告

ROSpider機器人評測報告 最近入手了一款ROSpider六足仿生機器人&#xff0c;ROSpider是一款基于ROS 操作系統開發的智能視覺六足機器人。 外觀 外觀上ROSpider六足機器人如同名字一樣有六只機械腿&#xff0c;整體來看像一只六腿的蜘蛛。腿上的關節處用了明亮的橙黃色很是顯…

Redis實現消息的發布和訂閱

Redis實現消息的發布和訂閱 1、在springboot項目的pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schem…

cookie和session的區別,分布式環境怎么保存用戶狀態

1、cookie數據存放在客戶的瀏覽器上&#xff0c;session數據放在服務器上。 2、cookie不是很安全&#xff0c;別人可以分析存放在本地的COOKIE并進行COOKIE欺騙&#xff0c;考慮到安全應當使用session。 3、session會在一定時間內保存在服務器上。當訪問增多&#xff0c;會比…

js和cocos creator學習筆記

1.Javascript有哪些數據類型?舉例兩個最常見的內置對象數據類型? 常用的數據類型:Number,String,Boolean,Null,Undefined,Object 常見內置對象:Array,Function2.下面代碼輸出內容是什么? let a []; a[10] 10; console.log(a.length); console.log(a[0]); a[200] undefi…

arcpy創建基本要素:折線和多邊形

目錄 創建Polyline折線要素步驟一&#xff1a;創建空間參考步驟二&#xff1a;創建屬性類步驟三&#xff1a;創建字段步驟四&#xff1a;創建記錄并插入幾何信息 創建Polygon多邊形要素步驟一&#xff1a;創建空間參考&#xff08;同上&#xff09;步驟二&#xff1a;創建要素類…

Redis使用Lua腳本和Redisson來保證庫存扣減中的原子性和一致性

文章目錄 前言1.使用SpringBoot Redis 原生實現方式2.使用redisson方式實現3. 使用RedisLua腳本實現3.1 lua腳本代碼邏輯 3.2 與SpringBoot集成 4. Lua腳本方式和Redisson的方式對比5. 源碼地址6. Redis從入門到精通系列文章7. 參考文檔 前言 背景&#xff1a;最近有社群技術交…