父組件prop傳向子組件的值,被子組件直接v-model綁定 功能不生效

隱式修改組件屬性會導致功能異常

實際操作中發現,即便是父組件把簡單數據通過prop傳給了子組件,子組件再使用v-model綁定,也不行,響應式還是對異常

原vue2業務中存在組件定義某個類型為Object的屬性,然后將該屬性對象的屬性值綁定給??v-model??的用法,在此種場景會導致隱式修改組件屬性,vue3中是禁止的,此種方式目前不報錯,但是響應式不正確生效,功能會不正常。請修改掉。

例子一:

針對常規將props屬性賦值給組件內如 ??input???的??v-model???,因??v-model??會雙向修改值,形成修改屬性,此場景推薦用如下方式,兩者均可:

方式1修改:

// vue2 ,vue2中會警告但是能運行正常,vue3中無法正常運行
<el-input v-model="searchValue"/>
props:{searchValue:{type:String,default:""}
}
// vue3可用如下替代方案,
// compoentA.vue
<el-input v-model="searchValueLocal"/>
props:{searchValue:{type:String,default:""}
},
computed:{searchValueLocal:{get(){return this.searchValue;},set(val){this.$emit("update:searchValue",val) // 更新searchValue值}}
}
// compoentB.vue使用 compoentA.vue
<compoent-b v-model:search-value="text"/>
data(){return{text:''}
}

方式2修改
將??v-model??語法糖拆開

??v-model??語法糖本質是綁定??modelValue??,并綁定??update:modelValue=val=>this.modelValue=val??,導致形成屬性修改,只要將語法糖拆開即可避免直接修改屬性

// compoentA.vue
<el-input :model-value="modelValue" @update:model-value="handleSelectChange"/>
props:{modelValue:{type:String,default:""}
},
methods:{handleSelectChange(val){this.$emit('update:modelValue', val); // 值更新拋給父組件,由父組件來更新修改modelValue的值}
}

例子二:

如下代碼:

1) 問題:定義了??data???組件屬性,但是將屬性綁定給??el-form???的??model???屬性,和各表單組件的??v-model???;此時形成了隱式操作組件屬性的問題,對于el-formmodel和各表單組件的??v-model??,無法形成響應式,會產生實際填寫內容但是表單校驗提示未輸入內容,表單輸入更新不及時的問題。

2) 解決:在組件內部直接修改屬性的方式改掉,改成單向數據流或者在data中定義變量中轉;同時注意,對于computed的計算屬性(理論上是只讀),也不能做值修改,會不觸發響應式原理

<template><div class="label-form"><el-form :model="data" label-position="top" :rules="rules" ref="labelForm" label-width="10rem" @submit.prevent><el-form-item :label="$t('name')" prop="Name"><el-input @click.stop="focusTag" ref="tag" v-model="data.Name" v-input-permit.name :placeholder="$t('tag_name')"></el-input></el-form-item><el-form-item :label="$t('description')" prop="Describe"><el-inputtype="textarea"@click.stop="focusDesc"ref="desc":count="128":autosize="{ minRows: 2, maxRows: 4, maxWidth: 300 }"v-model="data.Describe"v-input-permit.name:placeholder="$t('description')"></el-input></el-form-item><el-form-item class="form-buttons"><el-button type="primary" @click="onSubmit">{{ $t('btn_save') }}</el-button></el-form-item></el-form></div>
</template><script>
import rules from '@/Common/service/rule/validate-rules';
export default {name: 'LabelForm',props: {data: {type: Object,default() {return {Name: '',Describe: ''};}}},emits: ['onSubmit'],data() {return {rules: {Name: [rules.required, rules.name],Describe: [rules.textareaDescription]}};},methods: {onSubmit() {this.$refs['labelForm'].validate(async (valid) => {if (valid) {this.emit('onSubmit', this.data);} else {this.$refs['labelForm'].focusFirstField();return false;}});},reset() {this.$refs['labelForm'].resetFields();},focusTag() {const inputDom = this.$refs.tag.$el.querySelector('input');inputDom.focus();},focusDesc() {const inputDom = this.$refs.desc.$el.querySelector('textarea');inputDom.focus();}}
};
</script>// ai幫改
<template><div class="label-form"><el-form :model="formData" label-position="top" :rules="rules" ref="labelForm" label-width="10rem" @submit.prevent><el-form-item :label="$t('name')" prop="Name"><el-input @click.stop="focusTag" ref="tagRef" v-model="formData.Name" v-input-permit.name :placeholder="$t('tag_name')"></el-input></el-form-item><el-form-item :label="$t('description')" prop="Describe"><el-inputtype="textarea"@click.stop="focusDesc"ref="descRef":count="128":autosize="{ minRows: 2, maxRows: 4 }"v-model="formData.Describe"v-input-permit.name:placeholder="$t('description')"></el-input></el-form-item><el-form-item class="form-buttons"><el-button type="primary" @click="onSubmit">{{ $t('btn_save') }}</el-button></el-form-item></el-form></div>
</template><script>
import { ref, reactive, onMounted } from 'vue';
import rules from '@/Common/service/rule/validate-rules';export default {name: 'LabelForm',props: {data: {type: Object,default() {return {Name: '',Describe: ''};}}},emits: ['onSubmit'],setup(props, { emit }) {const labelForm = ref(null);const tagRef = ref(null);const descRef = ref(null);const formData = reactive({ ...props.data });const rules = {Name: [rules.required, rules.name],Describe: [rules.textareaDescription]};const onSubmit = () => {labelForm.value.validate((valid) => {if (valid) {emit('onSubmit', formData);} else {labelForm.value.focusFirstField();return false;}});};const reset = () => {labelForm.value.resetFields();};const focusTag = () => {const inputDom = tagRef.value?.$el.querySelector('input');inputDom?.focus();};const focusDesc = () => {const inputDom = descRef.value?.$el.querySelector('textarea');inputDom?.focus();};return {labelForm,tagRef,descRef,formData,rules,onSubmit,reset,focusTag,focusDesc};}
};
</script>

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

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

相關文章

c#bitconverter操作,不同變量類型轉byte數組

緣起:串口數據傳輸的基礎是byte數組&#xff0c;write(buff,0,num)或者writeline(string)&#xff0c;如果是字符串傳輸就是string變量就可以了&#xff0c;但是在modbus這類hex傳遞時&#xff0c;就要遇到轉換了&#xff0c;拼湊byte數組時需要各種變量的值傳遞&#xff0c;解…

【Redis】set 類型

set 一. set 類型介紹二. set 命令sadd、smembers、sismemberscard、spop、srandmembersmove、srem集合間操作交集&#xff1a;sinter、sinterstore并集&#xff1a;sunion、sunionstore差集&#xff1a;sdiff、sdiffstore 三. set 命令小結四. set 內部編碼方式五. set 使用場…

02-Redis常見命令

02-Redis常見命令 Redis數據結構介紹 Redis是一個key-value的數據庫&#xff0c;key一般是String類型&#xff0c;不過value的類型多種多樣&#xff1a; 貼心小建議&#xff1a;命令不要死記&#xff0c;學會查詢就好啦 Redis為了方便學習&#xff0c;將操作不同數據類型的命…

Rk3568驅動開發_GPIO點亮LED_12

需求&#xff1a; 用配置寄存器方式控制點燈非常原始&#xff0c;現在采用更方便的Linux提供的pctrl和gpio子系統編寫字符驅動 1.設備樹配置&#xff1a; 現將開發板中呼吸燈關閉掉防止占用到我需要使用的引腳 /* Narnat 2025-5-29 RK3568 GPIO 無需設置pinctrl*/gpioled{co…

阿里云ACP云計算備考筆記 (3)——云存儲RDS

目錄 第一章 云存儲概覽 1、云存儲通用知識 ① 發展歷史 ② 云存儲的優勢 2、云存儲分類 3、文件存儲業務場景 第二章 塊存儲 1、塊存儲分類 2、云盤的優勢 3、創建云盤 4、管理數據盤 ① 格式化數據盤 ② 掛載數據盤 ③ 通過 API 掛載云盤 5、管理系統盤 ① 更…

亞矩陣云手機實測體驗:穩定流暢背后的技術邏輯?

最近在測試一款云手機服務時&#xff0c;發現亞矩陣的表現出乎意料地穩定。作為一個經常需要多設備協作的開發者&#xff0c;我對云手機的性能、延遲和穩定性要求比較高。經過一段時間的體驗&#xff0c;分享一下真實感受&#xff0c;避免大家踩坑。 ??1. 云手機能解決什么問…

STM32H562----------ADC外設詳解

1、ADC 簡介 STM32H5xx 系列有 2 個 ADC,都可以獨立工作,其中 ADC1 和 ADC2 還可以組成雙模式(提高采樣率)。每個 ADC 最多可以有 20 個復用通道。這些 ADC 外設與 AHB 總線相連。 STM32H5xx 的 ADC 模塊主要有如下幾個特性: 1、可配置 12 位、10 位、8 位、6 位分辨率,…

【Android】雙指旋轉手勢

一&#xff0c;概述 本文參考android.view.ScaleGestureDetector&#xff0c;對雙指旋轉手勢做了一層封裝&#xff0c;采用了向量計算法簡單實現&#xff0c;筆者在此分享下。 二&#xff0c;實例 如下&#xff0c;使用RotateGestureDetector即可委托&#xff0c;實現旋轉手…

B站的視頻怎么下載下來——Best Video下載器

B站&#xff08;嗶哩嗶哩&#xff09;作為國內最受歡迎的視頻平臺之一&#xff0c;聚集了無數優質內容&#xff1a;動漫番劇、游戲實況、學習課程、紀錄片、Vlog、鬼畜剪輯……總有那么些視頻讓人想反復觀看、離線觀看&#xff0c;甚至剪輯創作。 但你是否遇到過這樣的煩惱&am…

基于SFC的windows系統損壞修復程序

前言 在平時使用Windows操作系統時會遇到很多因為系統文件損壞而出現的錯誤 例如:系統應用無法打開 系統窗口(例如開始菜單)無法使用 電腦藍屏或者卡死 是如果想要修復很多人只能想到重裝系統。但其實Windows有一個內置的系統文件檢查器可以修復此類錯誤。 原理 SFC命令…

智紳科技 —— 智慧養老 + 數字健康,構筑銀發時代安全防護網

在老齡化率突破 21.3% 的當下&#xff0c;智紳科技以 "科技適老" 為核心理念&#xff0c;構建 "監測 - 預警 - 干預 - 照護" 的智慧養老閉環。 其自主研發的七彩喜智慧康養平臺&#xff0c;通過物聯網、AI 和邊緣計算技術&#xff0c;實現對老年人健康與安…

用函數實現模塊化程序設計(適合考研、專升本)

函數 定義&#xff1a;本質上是一段可以被連續調用、功能相對獨立的程序段 c語言是通過“函數”實現模塊化的。根據分類標準不同函數分為以下幾類。 用戶角度&#xff1a;庫函數、自定義函數 函數形式&#xff1a;有參函數、無參函數 作用域&#xff1a;外部函數、內部函數 …

OpenCV 滑動條調整圖像亮度

一、知識點 1、int createTrackbar(const String & trackbarname, const String & winname, int * value, int count, TrackbarCallback onChange 0, void * userdata 0); (1)、創建一個滑動條并將其附在指定窗口上。 (2)、參數說明: trackbarname: 創建的…

vcs仿真產生fsdb波形的兩種方式

目錄 方法一&#xff1a; 使用verilog自帶的系統函數 方法二&#xff1a; 使用UCLI command 2.1 需要了解什么是vcs的ucli&#xff0c;怎么使用ucli&#xff1f; 2.2 使用ucli dump波形的方法 使用vcs仿真產生fsdb波形有兩種方式&#xff0c;本文參考《vcs user guide 20…

【前端】每日一道面試題6:解釋Promise.any和Promise.allSettled的使用場景及區別。

Promise.any() 和 Promise.allSettled() 是 JavaScript 中用于處理異步操作的兩種不同策略的 Promise 組合器&#xff0c;它們的核心區別在于邏輯目標與結果處理方式&#xff1a; 1. Promise.any() 使用場景&#xff1a; 需要獲取 首個成功結果&#xff08;類似競速成功優先&…

數據鏈路層__

文章目錄 數據鏈路層基本概念&#xff08;1&#xff09;鏈路管理&#xff1a;面向連接的服務&#xff08;2&#xff09;幀同步&#xff1a;成幀1、字符計數法2、字符填充法&#xff08;帶填充的首尾界符法&#xff09;3、帶填充的首位標志法4、物理層編碼違例法 &#xff08;3&…

coze智能體后端接入問題:

是否一定要按照coze官方API文檔格式調用&#xff1f; 不一定&#xff1a;以下面代碼為例(給了注釋) app.route(/compare_models, methods[POST]) def compare_models():print("收到 compare_models 請求&#xff01;") #begin-這一部分代碼作用&#xff1a;從前端接…

如何輕松、安全地管理密碼(新手指南)

很多人會為所有賬戶使用相同、易記的密碼&#xff0c;而且常常多年不換。雖然這樣方便記憶&#xff0c;但安全性非常低。 您可能聽說過一些大型網站的信息泄露事件&#xff0c;同樣的風險也可能存在于您的WordPress網站中。如果有不法分子獲取了訪問權限&#xff0c;您的網站和…

寶塔think PHP8 安裝使用FFmpeg 視頻上傳

寶塔think PHP8 安裝使用FFmpeg 一、 安裝think PHP8二、安裝 FFmpeg1&#xff0c;登錄到寶塔面板。2&#xff0c;進入“軟件商店”。3&#xff0c;搜索“FFmpeg”。4&#xff0c;選擇版本點擊安裝。5&#xff0c;檢查 FFmpeg 是否安裝成功6&#xff0c; 在 ThinkPHP 8 中使用 …

Android 輕松實現 增強版靈活的 滑動式表格視圖

表格視圖組件&#xff0c;支持&#xff1a; 1. 無標題模式&#xff1a;只有數據行也可以正常滑動 2. 兩種滑動模式&#xff1a;固定第一列 或 全部滑動 3. 全面的樣式自定義能力 4. 智能列寬計算 1. 無標題模式支持 設置無標題&#xff1a;調用 setHeaderData(null) 或 …