电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

Vue自定義組件雙向綁定實現原理及方法詳解

瀏覽:102日期:2022-11-29 17:28:46

前言

無論在任何的語言或框架中,我們都提倡代碼的復用性。對于Vue來說也是如此,相同的代碼邏輯會被封裝成組件,除了復用之外,更重要的是統一管理提高開發效率。我真就接手過一個項目,多個頁面都會用到的列表,沒有去封裝列表組件,只要有一點改動,每個頁面都得加上。很肯定的說,沒有用組件化開發的Vue項目是沒有靈魂的。所以如何封裝一個優雅且復用性高的組件成為我們必需的技能。

Tab自定義組件

首先來看一個Tab組件的實現,看看它存在什么問題,哪里可以改進?

效果

Vue自定義組件雙向綁定實現原理及方法詳解

組件

<template> <div class='tabs'> <div : v-for='(item,index) in tabs' :key='index' @click='tabChange(item)'> {{item}} </div> </div></template><script>export default { props:{ tabs:{ type: Array, default: ()=> [] }, activeName:{ type: String, default: ’’ } }, methods:{ tabChange(item){ this.$emit(’tabChange’,item) } },}</script>

使用

<template> <div> <Tabs :tabs='tabs' :activeName='activeName' @tabChange='tabChange' /> </div></template><script>import Tabs from ’../components/Tabs’export default { components:{ Tabs }, data(){ return{ tabs:[’黃金體驗’,’敗者食塵’,’緋紅之王’,’白金之星’,’波紋疾走’], activeName: ’黃金體驗’ } }, methods:{ tabChange(item){ this.activeName = item } },}</script>

這個組件最大的問題就是,activeName 需要使用者額外通過事件來手動更新,假如有另一個使用者接手,在不知道這種情況下使用,會出現tab沒有切換的情況。然后要去看組件內部實現,再回來修改代碼,很顯然這樣的組件是失敗的。本著所有的臟活累活都由組件實現的原則,理想的狀態應該是使用者不需要管理 activeName,而是由組件內部去更新。

如何改進修改prop?

可能有人會想到,既然要由內部管理,那在組件內部修改prop的值是不是就可以了?來看下這樣的做法是否可行修改組件tabChange方法,在點擊時更新prop的值

tabChange(item){ this.activeName = item this.$emit(’tabChange’,item)}

使用時,控制臺拋出警告

Vue自定義組件雙向綁定實現原理及方法詳解

由于prop是單向數據流,父級prop的更新會向下流動到子組件中,相反的在子組件內部直接更新狀態,會導致數據的流向不明確。例如,在父組件中有多個子組件依賴同一個屬性,其中一個子組件更新該屬性,會引發其余子組件發生改變,發生問題時不容易被找到,因此Vue不推薦我們這樣做。另外,在父組件發生更新時,子組件的prop會被刷新為最新的值。

單向數據流: https://cn.vuejs.org/v2/guide/components-props.html#%E5%8D%95%E5%90%91%E6%95%B0%E6%8D%AE%E6%B5%81

正解:model選項改進組件

組件model選項

允許一個自定義組件在使用 v-model 時定制 prop 和 event。默認情況下,一個組件上的 v-model 會把 value 用作 prop 且把 input 用作 event,但是一些輸入類型比如單選框和復選框按鈕可能想使用 value prop 來達到不同的目的。使用 model 選項可以回避這些情況產生的沖突。

model: https://cn.vuejs.org/v2/api/

在model選項里,我們可以綁定一個屬性,并為其添加事件,只需在調用方法時傳入值即可更新屬性。

<script>export default { model:{ prop: ’activeName’, event: ’update’ }, props:{ tabs:{ type: Array, default: ()=> [] }, activeName:{ type: String, default: ’’ } }, methods:{ tabChange(item){ this.$emit(’update’,item) // 這里更新activeName this.$emit(’tabChange’,item) } }}</script>

注意你仍然需要在組件的 props 選項里聲明 prop。

使用

使用組件雙向綁定后,屬性在組件內部被更新時,父組件的 activeName 也會隨之更新,這樣使用者可以很明確的知道數據可能會被修改。

<Tabs :tabs='tabs' v-model='activeName' />

總結

使用組件的model選項實現自定義組件雙向綁定,在組件內部通過事件更新屬性值,這樣的自定義組件使用起來更優雅。其實通過model選項的方式去修改父級屬性,我認為有點違反了單向數據流的原則。本來單向數據流是不允許子級修改父級屬性的,只是使用v-model的語法糖,看起來會讓數據流向顯得更加明確,恰好彌補這個缺點。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持好吧啦網。

標簽: Vue
相關文章:
主站蜘蛛池模板: 西门子伺服电机维修,西门子电源模块维修,西门子驱动模块维修-上海渠利 | 杭州ROHS检测仪-XRF测试仪价格-百科 | 电采暖锅炉_超低温空气源热泵_空气源热水器-鑫鲁禹电锅炉空气能热泵厂家 | 北京签证代办_签证办理_商务签证_旅游签证_寰球签证网 | 垃圾压缩设备_垃圾处理设备_智能移动式垃圾压缩设备--山东明莱环保设备有限公司 | 嘉兴恒升声级计-湖南衡仪声级计-杭州爱华多功能声级计-上海邦沃仪器设备有限公司 | 北京软件开发_软件开发公司_北京软件公司-北京宜天信达软件开发公司 | 室内室外厚型|超薄型|非膨胀型钢结构防火涂料_隧道专用防火涂料厂家|电话|价格|批发|施工 | 贵州科比特-防雷公司厂家提供贵州防雷工程,防雷检测,防雷接地,防雷设备价格,防雷产品报价服务-贵州防雷检测公司 | 软文发布-新闻发布推广平台-代写文章-网络广告营销-自助发稿公司媒介星 | 对夹式止回阀_对夹式蝶形止回阀_对夹式软密封止回阀_超薄型止回阀_不锈钢底阀-温州上炬阀门科技有限公司 | 硫酸亚铁-聚合硫酸铁-除氟除磷剂-复合碳源-污水处理药剂厂家—长隆科技 | 杭州网络公司_百度SEO优化-外贸网络推广_抖音小程序开发-杭州乐软科技有限公司 | 不锈钢复合板|钛复合板|金属复合板|南钢集团安徽金元素复合材料有限公司-官网 | 网站优化公司_北京网站优化_抖音短视频代运营_抖音关键词seo优化排名-通则达网络 | 桥架-槽式电缆桥架-镀锌桥架-托盘式桥架 - 上海亮族电缆桥架制造有限公司 | 袋式过滤器,自清洗过滤器,保安过滤器,篮式过滤器,气体过滤器,全自动过滤器,反冲洗过滤器,管道过滤器,无锡驰业环保科技有限公司 | 上海律师事务所_上海刑事律师免费咨询平台-煊宏律师事务所 | 上海办公室设计_办公楼,写字楼装修_办公室装修公司-匠御设计 | 包塑软管|金属软管|包塑金属软管-闵彬管业 | PCB厂|线路板厂|深圳线路板厂|软硬结合板厂|电路板生产厂家|线路板|深圳电路板厂家|铝基板厂家|深联电路-专业生产PCB研发制造 | 艾默生变频器,艾默生ct,变频器,ct驱动器,广州艾默生变频器,供水专用变频器,风机变频器,电梯变频器,艾默生变频器代理-广州市盟雄贸易有限公司官方网站-艾默生变频器应用解决方案服务商 | 色谱柱-淋洗液罐-巴罗克试剂槽-巴氏吸管-5ml样品瓶-SBS液氮冻存管-上海希言科学仪器有限公司 | B2B网站_B2B免费发布信息网站_B2B企业贸易平台 - 企资网 | 杭州中策电线|中策电缆|中策电线|杭州中策电缆|杭州中策电缆永通集团有限公司 | DNA亲子鉴定_DNA基因检测中心官方预约平台-严选好基因网 | 青海电动密集架_智能密集架_密集架价格-盛隆柜业青海档案密集架厂家 | 圣才学习网-考研考证学习平台,提供万种考研考证电子书、题库、视频课程等考试资料 | 多物理场仿真软件_电磁仿真软件_EDA多物理场仿真软件 - 裕兴木兰 | 水厂污泥地磅|污泥处理地磅厂家|地磅无人值守称重系统升级改造|地磅自动称重系统维修-河南成辉电子科技有限公司 | 光栅尺厂家_数显表维修-苏州泽升精密机械| 礼仪庆典公司,礼仪策划公司,庆典公司,演出公司,演艺公司,年会酒会,生日寿宴,动工仪式,开工仪式,奠基典礼,商务会议,竣工落成,乔迁揭牌,签约启动-东莞市开门红文化传媒有限公司 | CTP磁天平|小电容测量仪|阴阳极极化_双液系沸点测定仪|dsj电渗实验装置-南京桑力电子设备厂 | 液压扳手-高品质液压扳手供应商 - 液压扳手, 液压扳手供应商, 德国进口液压拉马 | 青岛空压机,青岛空压机维修/保养,青岛空压机销售/出租公司,青岛空压机厂家电话 | 不锈钢水箱厂家,不锈钢保温水箱-山东桑特供水设备 | 防堵吹扫装置-防堵风压测量装置-电动操作显示器-兴洲仪器 | 水热合成反应釜-防爆高压消解罐-西安常仪仪器设备有限公司 | 踏板力计,制动仪,非接触多功能速度仪,逆反射系数测试仪-创宇 | 云阳人才网_云阳招聘网_云阳人才市场_云阳人事人才网_云阳人家招聘网_云阳最新招聘信息 | 轴承振动测量仪电箱-轴承测振动仪器-测试仪厂家-杭州居易电气 |