vue3的深入組件-組件 v-model

組件 v-model
基本用法?

v-model 可以在組件上使用以實現雙向綁定。

從 Vue 3.4 開始,推薦的實現方式是使用 defineModel() 宏:

<script setup>
const model = defineModel()function update() {model.value++
}
</script><template><div>Parent bound v-model is: {{ model }}</div><button @click="update">Increment</button>
</template>

父組件可以用 v-model 綁定一個值:

<script setup lang="ts">
import { useAppStore } from '@/store/modules/app'
const appStore =  useAppStore()
import modelChild from './components/test/modelChild.vue'
const textColor = computed(() => appStore.getTextColor)
appStore.initTheme()
const countModel = ref(10)
</script><template><ConfigGlobal><p :style="{'color':textColor}"  >p標簽</p>{{ countModel }}<modelChild v-model="countModel"></modelChild></ConfigGlobal></template>

顯示如下:
在這里插入圖片描述

defineModel() 返回的值是一個 ref。它可以像其他 ref 一樣被訪問以及修改,不過它能起到在父組件和當前變量之間的雙向綁定的作用:

  • 它的 .value 和父組件的 v-model 的值同步;
  • 當它被子組件變更了,會觸發父組件綁定的值一起更新。
    這意味著你也可以用 v-model 把這個 ref 綁定到一個原生 input 元素上,在提供相同的 v-model 用法的同時輕松包裝原生 input 元素:
child.vue<script setup>
const model = defineModel()
</script><template><span>My input</span> <input v-model="model">
</template>
// app.vue
<script setup>
import Child from './Child.vue'
import { ref } from 'vue'const msg = ref('Hello World!')
</script><template><h1>{{ msg }}</h1><Child v-model="msg" />
</template>
底層機制

defineModel 是一個便利宏。編譯器將其展開為以下內容:

  • 一個名為 modelValue 的 prop,本地 ref 的值與其同步;
  • 一個名為 update:modelValue 的事件,當本地 ref 的值發生變更時觸發。
<!-- Child.vue -->
<script setup>
const props = defineProps(['modelValue'])
const emit = defineEmits(['update:modelValue'])
</script><template><input:value="modelValue"@input="emit('update:modelValue', $event.target.value)"/>
</template><!-- Parent.vue -->
<template><ConfigGlobal><p :style="{'color':textColor}"  >p標簽</p>{{ foo }}<modelChild :modelValue="foo"@update:modelValue="$event => (foo = $event)"></modelChild></ConfigGlobal></template>

因為 defineModel 聲明了一個 prop,你可以通過給 defineModel 傳遞選項,來聲明底層 prop 的選項:
子組件

<script setup>
const model = defineModel({required:true, default: 1 }) // 對應 model 參數
</script><template><input v-model="model" type="text"><!-- <input v-model="age" type="number"> -->
</template>

父組件

<script setup lang="ts">
const countModel = ref()
console.log(countModel.value,'countModel'); // undefined
</script>
<template><ConfigGlobal>{{ countModel }}<modelChild v-model="countModel"></modelChild></ConfigGlobal></template>

如果為 defineModel prop 設置了一個 default 值且父組件沒有為該 prop 提供任何值,會導致父組件與子組件之間不同步。在下面的示例中,父組件的 countModel 是 undefined,而子組件的 model 是 1:

v-model 的參數
//子組件
<script setup>
const title = defineModel('title')
</script><template><input type="text" v-model="title" />
</template>// 父組件
<script setup>
import { ref } from 'vue'
import MyComponent from './MyComponent.vue'const bookTitle = ref('v-model argument example')
</script><template><h1>{{ bookTitle }}</h1><MyComponent v-model:title="bookTitle" />
</template>
不同屬性綁定多個 v-model

父組件?

<UserForm v-model:username="user.name"v-model:age="user.age"
/>

子組件

<script setup>
const username = defineModel('username') // 對應 username 參數
const age = defineModel('age') // 對應 age 參數
</script><template><input v-model="username" type="text"><input v-model="age" type="number">
</template>
處理 v-model 修飾符

父組件
使用內置修飾符(如 .trim):

<Child v-model.trim="text" />

子組件

<script setup>
const [model, modifiers] = defineModel() // 解構出修飾符// 根據修飾符調整值
const processedModel = computed({get: () => model.value,set: (value) => {if (modifiers.trim) {model.value = value.trim()} else {model.value = value}}
})
</script><template><input v-model="processedModel" />
</template>
  • 使用自定義修飾符 .capitalize:
    創建一個自定義的修飾符 capitalize,它會自動將 v-model 綁定輸入的字符串值第一個字母轉為大寫

父組件

<Child v-model.capitalize="text" />

子組件??
通過 set 選項處理修飾符邏輯

<script setup>
const [model, modifiers] = defineModel({set(value) {if (modifiers.capitalize) {return value.charAt(0).toUpperCase() + value.slice(1)}return value}
})
</script><template><input type="text" v-model="model" />
</template>
帶參數的 v-model 修飾符

父組件

<UserForm v-model:username.trim="user.name"v-model:age.number="user.age"
/>

子組件??
分別處理每個參數的修飾符:

<script setup>
const [username, usernameModifiers] = defineModel('username')
const [age, ageModifiers] = defineModel('age')// 處理 username 的 trim 修飾符
const processedUsername = computed({get: () => username.value,set: (val) => {username.value = usernameModifiers.trim ? val.trim() : val}
})// 處理 age 的 number 修飾符
const processedAge = computed({get: () => age.value,set: (val) => {age.value = ageModifiers.number ? Number(val) : val}
})
</script><template><input v-model="processedUsername" /><input v-model="processedAge" type="number" />
</template>

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

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

相關文章

15.thinkphp的上傳功能

一&#xff0e;上傳功能 1. 如果要實現上傳功能&#xff0c;首先需要建立一個上傳表單&#xff0c;具體如下&#xff1a; <form action"http://localhost/tp6/public/upload"enctype"multipart/form-data" method"post"><input type&…

word文檔基本操作: 編輯頁眉頁腳和插入目錄

文章目錄 引言I 編輯頁眉頁腳II 插入目錄III 知識擴展基于axure畫架構圖基于Knife4j導出接口文檔基于PDManer導出數據庫設計文檔引言 背景: 信息安全認證需要準備相關文件用于審核 一般的開發設計包含總體設計、概要設計、詳細設計、接口設計、數據庫設計、部署結構設計、原型…

Qt 通過控件按鈕實現hello world + 命名規范(7)

文章目錄 使用編輯框來完成 hello world通過編輯圖形化界面方式通過純代碼方式 通過按鈕的方式來創建 hello world通過編輯圖形化界面方式通過純代碼方式 總結Qt Creator中的快捷鍵如何使用文檔命名規范 簡介&#xff1a;這篇文章著重點并不在于創建hello world程序&#xff0c…

實時網絡流量監控與防御:Python實現DDoS攻擊檢測

1. 需求分析 DDoS攻擊通過海量請求耗盡服務器資源。本文使用 Python Scapy 實時監控流量&#xff0c;自動觸發IP封禁。 2. 核心代碼實現 2.1 依賴安裝 pip install scapy psutil2.2 流量監控腳本&#xff08;ddos_detector.py&#xff09; import time from scapy.all im…

電賽經驗分享——模塊篇

1、前言 打算在這一個專欄中&#xff0c;分享一些本科控制題電賽期間的經驗&#xff0c;和大家共同探討&#xff0c;也希望能幫助剛剛參加電賽的同學&#xff0c;了解一些基本的知識。一些見解和看法可能不同或有錯誤&#xff0c;歡迎批評指正。 在本文中&#xff0c;主要介紹筆…

【LLM】Open WebUI 使用指南:詳細圖文教程

Open WebUI 是一個開源的、可擴展且用戶友好的自托管 AI 平臺,專為生成式人工智能模型交互而設計。 Open WebUI 旨在為用戶提供一個簡單易用、功能強大且高度定制化的界面,使其能夠輕松與各種 AI 模型(如文本生成、圖像生成、語音識別等)進行交互。 一、安裝與初始化配置 擴…

HarmonyOS Next~HarmonyOS應用測試全流程解析:從一級類目上架到二級類目專項測試

HarmonyOS Next&#xff5e;HarmonyOS應用測試全流程解析&#xff1a;從一級類目上架到二級類目專項測試 引言&#xff1a;HarmonyOS生態下的質量保障挑戰 在萬物互聯的智能時代&#xff0c;HarmonyOS作為分布式操作系統&#xff0c;為開發者帶來了前所未有的創新空間&#x…

一種機載掃描雷達實時超分辨成像方法——論文閱讀

一種機載掃描雷達實時超分辨成像方法 1. 專利的研究目標與產業意義1.1 研究目標與實際問題1.2 產業意義2. 專利的創新方法:滑窗遞歸優化與實時更新2.1 核心模型與公式2.2 與傳統方法對比優勢3. 實驗設計與驗證3.1 仿真參數3.2 實驗結果4. 未來研究方向與挑戰4.1 學術挑戰4.2 技…

滾筒洗衣機拆解學習

本文圖片來自于B站視頻&#xff0c;鏈接在文末&#xff0c;不涉及任何公司及實驗室產品 對小米滾筒洗衣機進行拆解&#xff0c;并收集了用戶對這款產品的評價&#xff0c;認識了關鍵部件。下一步重點學習對各個電機的控制邏輯和供電系統。 整機拆解學習&#xff1a; 功能面板…

【金倉數據庫征文】金倉數據庫 KingbaseES 在電商平臺數據庫遷移與運維中深入復現剖析

【金倉數據庫征文】金倉數據庫 KingbaseES 在電商平臺數據庫遷移與運維中深入復現剖析 前言 在當今數字化商業蓬勃發展的時代&#xff0c;電商平臺的數據量呈爆發式增長&#xff0c;對數據庫性能、穩定性和擴展性提出了極高要求。本文章基于大型電商平臺原本采用 MySQL 數據庫&…

iPhone手機連接WiFi異常解決方法

iPhone手機連接WiFi異常解決方法 一、問題現象二、iPhone連不上可能的原因三、基礎排查與快速修復第一步:重啟大法第二步:忽略網絡,重新認證第三步:關閉“私有無線局域網地址”第四步:修改DNS服務器第五步:還原網絡設置四、路由器端排查及設置關閉MAC地址過濾或添加到白名…

Android NDK版本迭代與FFmpeg交叉編譯完全指南

在Android開發中&#xff0c;使用NDK(Native Development Kit)進行原生代碼開發是一項常見需求&#xff0c;特別是當我們需要集成FFmpeg這樣的多媒體處理庫時。本文將深入分析Android NDK的版本迭代分界線&#xff0c;詳細講解FFmpeg交叉編譯的注意事項&#xff0c;并提供完整的…

typecho中的Widget設計文檔

組成系統的最基本元素 什么是Widget Widget是組成Typecho的最基本元素&#xff0c;除了已經抽象出來的類庫外&#xff0c;其它幾乎所有的功能都會通過Widget來完成。在實踐中我們發現&#xff0c;在博客這種小型但很靈活的系統中實施一些大型框架的思想是不合適的&#xff0c…

Python序列Day3

序列 序列是一種數據存儲方式&#xff0c;用方括號標注&#xff0c;逗號分隔的一組值。在內存中&#xff0c;序列就是一塊用來存放多個值的連續的內存空間。 常見序列結構有&#xff1a;字符串、列表、元組、字典、集合 列表 用于存儲任意數目&#xff0c;任意類型的數據集…

私服與外掛:刑事法律風險的深度剖析

首席數據官高鵬律師團隊編著 在當今數字化時代&#xff0c;網絡游戲產業蓬勃發展&#xff0c;然而與之相伴的私服與外掛現象卻屢禁不止&#xff0c;且其背后隱藏著嚴重的刑事法律風險。作為一名律師&#xff0c;有必要在此對私服與外掛相關的刑事問題進行深入解讀&#xff0c;以…

Linux云計算訓練營筆記day04(Rocky Linux中的命令)

mv 移動(剪切) 源數據會消失 格式: mv 源文件 目標路徑 touch /opt/a.txt 創建文件 mv /opt/a.txt /root 移動文件&#xff0c;沒有改名 mkdir gongli 創建目錄 mv gongli /opt/ 移動目錄&#xff0c;沒有改名 mv /opt/gongli tedu 移動目錄&#xff0c;改名了 …

藍橋杯青少 圖形化編程——“星星”點燈

藍橋杯青少 圖形化編程——“星星”點燈 編程實現&#xff1a; 有10盞燈&#xff0c;從1到10按順序依次編號&#xff0c;初始時全部燈處于開啟狀態。有10個人也從1到10依次編號。第一個人&#xff08;1號&#xff09;將燈全部關閉&#xff0c;第二個人&#xff08;2號&#x…

conda配置好的pytorch在jupyter中如何配置

配置 其實不用再配置了 如下圖&#xff08;主要是激活pytorch環境&#xff0c;再jupyter notebook&#xff09; jupyter運行快捷鍵shiftenter 新建文件夾folder&#xff0c;新建notebook 使用 幫助文檔&#xff08;兩種方式&#xff09; ctrl/ 注釋

COLT_CMDB_aix_diskinfo.sh

#!/bin/ksh #IT_BEGIN #IT_TYPE3 #IT SYSTEM_AIX_AGENTDISKDISCOVER|discovery.diskInfo[disc] #原型指標 #IT_RULE SYSTEM_AIX_IP|ipAddress[{#DISKNAME}] #IT_RULE SYSTEM_AIX_AGENTDISKPATH|diskPath[{#DISKNAME}] #IT_RULE SYSTEM_AIX_DISKNAME|diskName[{#DISKNAME}] #IT_…

IBM BAW(原BPM升級版)使用教程第五講

結前篇&#xff01; 一、服務&#xff1a;外部服務 在 IBM Business Automation Workflow (BAW) 中&#xff0c;外部服務&#xff08;External Services&#xff09;是指在流程中調用和集成外部系統或服務的組件。外部服務允許IBM BAW與其他業務系統、應用程序或第三方服務進行…