網站首頁 Vue 正文
官網解釋
所有的 prop 都使得其父子 prop 之間形成了一個單向下行綁定:父級 prop 的更新會向下流動到子組件中,但是反過來則不行。這樣會防止從子組件意外變更父級組件的狀態,從而導致你的應用的數據流向難以理解。額外的,每次父級組件發生變更時,子組件中所有的 prop 都將會刷新為最新的值。這意味著你不應該在一個子組件內部改變 prop。如果你這樣做了,Vue 會在瀏覽器的控制臺中發出警告。
單向數據流是什么
單向數據流指只能從一個方向來修改狀態。下圖是單向數據流的極簡示意:
與單向數據流對對應的是雙向數據流(也叫雙向綁定)。在雙向數據流中,Model(可以理解為狀態的集合) 中可以修改自己或其他Model的狀態, 用戶的操作(如在輸入框中輸入內容)也可以修改狀態。這使改變一個狀態有可能會觸發一連串的狀態的變化,最后很難預測最終的狀態是什么樣的。使得代碼變得很難調試。如下圖所示:
與雙向數據流比,在單向數據流中,當你需要修改狀態,完全重新開始走一個修改的流程。這限制了狀態修改的方式,讓狀態變得可預測,容易調試。
示例
我們通過一個示例來解釋單向數據流與雙向綁定,這個示例是對ant-design-vue表單組件的二次封裝
a-input原始用法
<template> <a-input v-model='data'/> </template> <script> export default { data() { return { data: '' } } } </script>
在data中聲明的屬性會通過Object.definePropty方法為其添加get和set方法,使其成為響應式數據。v-model是一個語法糖,在vue 2.2.0版本后新增了model屬性
官方解釋
允許一個自定義組件在使用?v-model?時定制 prop 和 event。默認情況下,一個組件上的?v-model?會把?value?用作 prop 且把?input?用作 event,但是一些輸入類型比如單選框和復選框按鈕可能想使用?value?prop 來達到不同的目的。使用?model?選項可以回避這些情況產生的沖突。
我們利用這個屬性來對上述input組件做二次封裝
組件代碼
<template> <a-input :value='currentValue' @change='onInputChange'/> </template> <script> export default { data() { return { currentValue: this.value } }, model: { event: 'change', prop: 'value' }, props:{ value: { type: String } }, watch: { value: { handler(newVal) { this.currentValue = newVal } } }, onInputChange(e) { this.$emit('change', e.target.value) } } </script>
在父組件中使用
<template> <my-input v-model='data' /> </template> <script> export default { data() { return { data:'' } } } </script>
上述子組件中的currentValue是實際input組件的值,他的值是根據父組件傳入的值得出的,input標簽組件的change事件來觸發父組件的change事件,從而改變傳入子組件props中value的值。這就解釋了單項數據流,父組件通過props向子組件傳遞值,子組件通過emit事件來通知父組件修改值,子組件不在自身對父組件傳遞過來的props做任何修改,都是通過父組件來更新props,從而達到子組件更新自身狀態。
使用場景
當我們在實現一個由數據渲染的復雜表單時,那么我們的設計就可以采用這種模式,通過props以及emit傳遞,保證子組件的事件觸發根節點的數據更新,從而更新子孫組件的狀態。
總結
原文鏈接:https://juejin.cn/post/7055843110353371149
相關推薦
- 2022-06-07 使用Docker容器部署rocketmq單機的全過程_docker
- 2023-04-06 Python中有哪些關鍵字及關鍵字的用法_python
- 2022-07-06 QT5實現簡單的TCP通信的實現_C 語言
- 2022-09-23 Windows?10搭建FTP服務器圖文教程_FTP服務器
- 2022-12-12 C語言中單鏈表(不帶頭結點)基本操作的實現詳解_C 語言
- 2022-04-19 C語言內存管理及初始化細節示例詳解_C 語言
- 2022-06-11 適合初學者的C語言常量類型的講解_C 語言
- 2022-06-26 Android如何使用圓形揭露動畫巧妙地隱藏或顯示View詳解_Android
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支