国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

用這招監聽 Vue 的插槽變化

開發 前端
最近,每當組件的內容(插槽、子組件等)發生變化時,我需要更新它的狀態。對于上下文,它是一個表單組件,用于跟蹤其輸入的有效性狀態。

[[421396]]

 最近,每當組件的內容(插槽、子組件等)發生變化時,我需要更新它的狀態。對于上下文,它是一個表單組件,用于跟蹤其輸入的有效性狀態。

下面的代碼片段是以Options API格式編寫的,但除了指定的地方外可以在Vue2 和 Vue2中使用。

開始

先從控制表單狀態開始,根據狀態修改一個類,孩子內容使用填充:

  1. <template> 
  2.   <form :class="{ '--invalid': isInvalid }"
  3.     <slot /> 
  4.   </form> 
  5. </template> 
  6.  
  7. <script> 
  8. export default { 
  9.   data: () => ({ 
  10.     isInvalid: false
  11.   }), 
  12. }; 
  13. </script> 

為了更新isInvalid屬性,我們需要添加一個觸發的事件,可以使用 sumit 事件 ,但我更喜用 input 事件。

  • 表單事件7個: focus, blur, input, select, change, reset, submit 等,具體詳解看這篇文章:
  • https://blog.csdn.net/qq_43797996/article/details/103066452

表單不會觸發 input 事件,但我們可以使用 "事件委托"。我們將監聽器附加到父元素(<form>)上,當事件發生在它的子元素(<input>、<select>、<textarea>等)上時就會被觸發。

任何時候在這個組件的<slot>中觸發input事件,表單將捕獲該事件。

  1. <template> 
  2.   <form :class="{ '--invalid': isInvalid }" @input="validate"
  3.     <slot /> 
  4.   </form> 
  5. </template> 
  6.  
  7. <script> 
  8. export default { 
  9.   data: () => ({ 
  10.     isInvalid: false
  11.   }), 
  12.   methods: { 
  13.     validate() { 
  14.       // 驗證邏輯 
  15.     } 
  16.   } 
  17. }; 
  18. </script> 

驗證邏輯可以是簡單或復雜的。本文為了演示,用簡單的方法,使用form.checkValidity() API 來查看表單是否基于HTML驗證屬性而有效。

為了訪問<form>元素。可以用refs或$el屬性。為了簡單起見,本文使用$el。

  1. <template> 
  2.   <form :class="{ '--invalid': isInvalid }" @input="validate"
  3.     <slot /> 
  4.   </form> 
  5. </template> 
  6.  
  7. <script> 
  8. export default { 
  9.   data: () => ({ 
  10.     isInvalid: false
  11.   }), 
  12.   methods: { 
  13.     validate() { 
  14.       this.isInvalid = !this.$el.checkValidity() 
  15.     } 
  16.   } 
  17. }; 
  18. </script> 

問題

這里有一點問題。如果表單的內容改變了,會發生什么?如果一個<input>在表單加載被添加到DOM中,會發生什么?

舉個例子,我們把這個表單組件稱為 "MyForm",在 App 中,內容如下:

  1. // App.vue 
  2. <template> 
  3.   <MyForm> 
  4.     <input 
  5.       v-model="showInput" 
  6.       id="toggle-name" 
  7.       name="toggle-name" 
  8.       type="checkbox" 
  9.     /> 
  10.     <label for="toggle-name">顯示其它 input</label>  
  11.  
  12.     <template v-if="showInput"
  13.       <label for="name">Name:</label> 
  14.       <input id="name" name="name" required /> 
  15.     </template> 
  16.  
  17.     <button type="submit">提交</button> 
  18.   </MyForm> 
  19. </template> 
  20.  
  21. <script> 
  22. import Form from "./components/form.vue"
  23. export default { 
  24.   name"App"
  25.   components: { 
  26.     MyForm: Form, 
  27.   }, 
  28.   data: () => ({ 
  29.     showInput: false
  30.   }), 
  31. }; 
  32. </script> 

當App.vue通過條件來隱藏顯示某些 input,我們的表單需要知道。在這種情況下,我們會想到在表單內容發生變化時跟蹤其有效性,而不僅僅是在 input 事件或mounted生命周期鉤子上。否則,可能會顯示不正確的信息。

熟悉 Vue的生命周期鉤子小伙伴,這里可能會想到使用 update 來跟蹤變化。理論上,這聽起來不錯。在實踐中,它會創造一個無限的循環,然后瀏覽器掛了。

解決方法

經過一番研究和測試,最佳解決方案是使用MutationObserver API。它是瀏覽器內置的方法,提供了監視對DOM樹所做更改的能力,如果節點的增減、屬性的變動、文本內容的變動,這個 API 都可以得到通知。

它是原生的方法,所以不受限于框架。

使用時,首先使用MutationObserver構造函數,新建一個觀察器實例,同時指定這個實例的回調函數。在每次 DOM 變動后調用,這個回調都被調用。該回調函數接受兩個參數,第一個是變動數組,第二個是觀察器實例,將我們的 form 組件改寫成如下:

  1. <template> 
  2.   <form :class="{ '--invalid': isInvalid }" @input="validate"
  3.     <slot /> 
  4.   </form> 
  5. </template> 
  6.  
  7. <script> 
  8. export default { 
  9.   data: () => ({ 
  10.     isInvalid: false
  11.   }), 
  12.   mounted() { 
  13.     const observer = new MutationObserver(this.validate); 
  14.     observer.observe(this.$el, { 
  15.       childList: true
  16.       subtree: true
  17.     }); 
  18.     this.observer = observer; 
  19.   }, 
  20.   methods: { 
  21.     validate() { 
  22.       this.isInvalid = !this.$el.checkValidity(); 
  23.     }, 
  24.   }, 
  25.   beforeUnmount() { 
  26.     this.observer.disconnect(); 
  27.   }, 
  28. }; 
  29. </script> 
  30.  
  31.  
  32. <style scoped> 
  33. </style> 

這里還需要使用 beforeUnmount生命周期事件來斷開observer的連接,這會清除它所分配的任何內存。

最后,我們將isInvalid狀態傳遞給要訪問的內容的插件槽,這也稱作用域的槽,它非常有用。

  1. <template> 
  2.   <form :class="{ '--invalid': isInvalid }" @input="validate"
  3.     <slot v-bind="{ isInvalid }" /> 
  4.   </form> 
  5. </template> 
  6.  
  7. <script> 
  8. export default { 
  9.   data: () => ({ 
  10.     isInvalid: false
  11.   }), 
  12.   mounted() { 
  13.     const observer = new MutationObserver(this.validate); 
  14.     observer.observe(this.$el, { 
  15.       childList: true
  16.       subtree: true
  17.     }); 
  18.     this.observer = observer; 
  19.   }, 
  20.   methods: { 
  21.     validate() { 
  22.       this.isInvalid = !this.$el.checkValidity(); 
  23.     }, 
  24.   }, 
  25.   beforeUnmount() { 
  26.     this.observer.disconnect(); 
  27.   }, 
  28. }; 
  29. </script> 

通過這樣的設置,可以在我們的表單組件中添加任意數量的 input,并添加任何它需要的條件渲染邏輯。只要input使用HTML驗證屬性,表單就會跟蹤它是否處于有效狀態。

此外,由于使用的是作用域槽,我們將表單的狀態提供給父級,所以父級可以對有效性的變化做出反應。

例如,在 App.vue,我們想在表單無效時 "禁用" 提交按鈕,可以這么來寫

  1. <template> 
  2.   <MyForm> 
  3.     <template slot:default="form"
  4.       <label for="name">Name:</label> 
  5.       <input id="name" name="name" required> 
  6.  
  7.       <button 
  8.         type="submit" 
  9.         :class="{ disabled: form.isInvalid }" 
  10.       > 
  11.         Submit 
  12.       </button> 
  13.     </template> 
  14.   </MyForm> 
  15. </template> 

nice~.

希望本文能對你未來的開必有所幫助。

 

責任編輯:姜華 來源: 今日頭條
相關推薦

2023-06-02 07:32:34

localStorage?監聽

2020-05-25 17:03:47

Vue嵌套插槽開發

2021-05-08 07:37:32

Vue 命名插槽

2023-12-14 08:25:14

WatchVue.js監聽數據

2021-04-14 07:52:00

Vue 作用域插槽

2025-03-07 10:10:48

Vue插槽slot

2025-05-29 01:00:00

文件監聽函數

2020-08-10 08:30:35

Vue 數據插槽

2021-12-29 07:51:21

Vue3 插件Vue應用

2025-10-24 10:47:25

Vue3前端插槽

2016-09-29 08:45:12

vueAPIWeb

2022-07-01 12:00:56

Kubernete網絡模型

2024-04-10 10:15:16

監聽

2022-07-15 08:45:07

slotVue3

2024-06-03 10:00:51

Vue 3語法插槽

2024-09-10 10:04:47

2021-04-26 07:53:06

DOM前端框架

2019-10-15 09:05:07

域插槽組件前端

2013-08-02 15:23:11

2013-08-02 10:39:59

AndroidAPPOS
點贊
收藏

51CTO技術棧公眾號

久久精品国产综合精品| 2020国产精品视频| 91午夜国产| 久久丝袜美腿综合| 久久天天东北熟女毛茸茸| 精品91视频| 久久久久成人精品免费播放动漫| 91欧美在线| 国产精品成久久久久三级| 伊人精品一区| 国产精品揄拍一区二区| 91超碰国产精品| 成人av.网址在线网站| 不卡av一区二区| 国产精品久久久久久超碰| 欧美色图首页| 日本黄网站免费| 亚洲国产精品99久久久久久久久| 小泽玛利亚视频在线观看| 日韩欧美国产成人| 精品欧美一区二区三区在线观看 | 日本一区二区在线视频观看| 妖精一区二区三区精品视频| 亚洲美女自拍视频| 污网站免费在线观看| 欧美国产综合一区二区| 国产a级片免费看| 久久婷婷丁香| 欧洲亚洲一区二区| 肉肉av福利一精品导航| 91嫩草国产在线观看| 欧美福利影院| 国产精品久久国产精品| 手机亚洲手机国产手机日韩| 欧洲国内综合视频| 国产精品免费一区二区三区观看| 国内精品久久久久久久97牛牛| 久久久无码中文字幕久...| 日本免费专区| 亚洲图片你懂的| av毛片在线| 国产高清在线不卡| 成人动漫精品一区二区| 九一国产在线| 国产综合在线视频| 麻豆国产一区二区| 少妇性bbb搡bbb爽爽爽欧美| 久久久www成人免费精品| 亚洲专区一区| 四虎影视2018在线播放alocalhost| www.亚洲免费av| 精品在线观看一区二区| 成人深夜直播免费观看| 日韩精品一区国产| 伊人亚洲福利一区二区三区| 久操视频在线观看| 在线播放/欧美激情| www.精品在线| 91丨porny丨国产| 成人羞羞国产免费网站| av无码精品一区二区三区| www.欧美日韩| 97影院理论片在线播放| 亚洲热线99精品视频| 久久这里只有精品首页| 五月天婷婷综合社区| 欧美成人一级视频| 日韩在线观看一区二区三区| 国产精品日韩在线| 热久久国产精品| 上原亚衣加勒比在线播放| 日韩欧美主播在线| www国产精品| 亚洲最大av网站| 销魂美女一区二区三区视频在线| 久久香蕉综合色| 国产精品一区二区三区乱码| 欧美精品一区二区三区三州| 午夜视频在线观看一区二区| 蜜桃麻豆av在线| 国产成人午夜视频网址| 精品在线免费视频| 在线免费黄色毛片| 亚洲美女喷白浆| 一区二区三区在线| 欧美福利精品| 蜜臀av国产精品久久久久| 国产手机精品在线| 久久精品高清| 亚洲色图在线看| 天堂中文а√在线| 国模精品一区二区三区色天香| 91精品一区国产高清在线gif| 欧美日韩电影一区二区| 亚洲欧美激情四射在线日| 亚洲不卡一区二区三区| 中文字幕在线观看第三页| 欧美在线一区二区| jizz性欧美2| 一区二区三区四区免费视频| 加勒比色综合久久久久久久久| 欧美男男同志| 成人做爰www免费看视频网站| 美女一区二区视频| a级网站在线播放| 国产精品影音先锋| 国产成人综合美国十次| 亚洲精品久久久久中文字幕欢迎你 | 日本熟妇人妻中出| 欧美一级精品大片| 成人在线免费观看视频| 老司机性视频| 91黑丝在线观看| 97caopron在线视频| 无码人妻丰满熟妇区毛片| 欧美日韩高清影院| 99久久精品费精品国产风间由美 | 精品日本高清在线播放| 日本久久一二三四| 在线黄色.com| 3d蒂法精品啪啪一区二区免费| 7777精品伊人久久久大香线蕉最新版| 一区二区中文字幕在线观看| 亚洲一区二区四区| 日韩精品一区二区视频| 国产精品69久久久久水密桃| 国产一区二区精品调教| 国产 国语对白 露脸| 亚洲欧美中文字幕在线一区| 奇米一区二区三区四区久久| 精品国产91久久久久久浪潮蜜月| 久久久99精品视频| 久久综合伊人77777| 久久亚洲美女| 豆国产97在线| 亚洲网站在线看| 成人小视频免费观看| 黑人久久a级毛片免费观看| 高清成人av| 日韩精品一区二区三区免费观看| 欧美韩国日本在线| 亚洲最大成人网色| 日韩在线观看你懂的| 成人欧美一区二区三区白人| 中文字幕日韩欧美精品高清在线| 国产理论在线| 夜色资源站国产www在线视频| 女同性恋一区二区| www.久久爱.cn| 欧美巨大黑人极品精男| 91国产在线免费观看| 婷婷久久伊人| 亚洲精品国精品久久99热一| 欧美成人福利| 日韩欧美一二三| 久久深夜福利| 国产亚洲成av人片在线观看| 日本三级福利片| 中文字幕日韩免费视频| 久久久久久9999| 九九免费精品视频在线观看| 无圣光视频在线观看| 精品人伦一区二区三区| 亚洲电影免费观看高清完整版在线观看| 国产尤物一区二区在线| 亚洲精品一区二区三区在线| 亚洲第一在线综合在线| 国产日韩欧美视频在线| av成人在线电影| 成人区精品一区二区| 欧美日本高清一区| 亚洲午夜精品久久久久久性色| 亚洲欧美激情在线| a亚洲天堂av| 亚洲区成人777777精品| 国产伦精品一区二区三区免费视频| 一区二区三区欧美| 男人亚洲天堂| av在线dvd| 国产有色视频色综合| 亚洲最新中文字幕| 夜夜嗨av一区二区三区四季av| 亚洲激情另类| 五月激情久久| 理论片在线观看理伦片| 日本一区视频在线| 欧美成人精品一区| 在线观看一区不卡| 久久这里只有精品首页| 欧美精品福利| 欧美高清一级片| 黄色小网站在线观看| 欧美三级理论片| 精品国产一区二区三区免费| 久久精品国亚洲| 欧美一区在线视频| 亚洲色图清纯唯美| 成人性生交大片免费看视频在线| 国产一区二区三区自拍| 极品一区美女高清|