v-model

news/2024/10/22 3:59:33

1,与表单进行双向数据绑定

<script setup>
import { ref } from 'vue'const msg = ref('Hello World!')
</script><template><h1>{{ msg }}</h1><input v-model="msg" />
</template>

相当于做了两件事,1,将msg绑定input的value上;2,input的value变更时,将新value赋值给msg,类似下面的::value="msg" @input="updateValue"

<script setup>
import { ref } from 'vue'

const msg = ref('Hello World!')
let updateValue = ($e)=> {
  msg.value = $e.target.value
}
</script>

<template>
  <h1>{{ msg }}</h1>
  <input :value="msg" @input="updateValue"/>  //:是v-bind的缩写,@是v-on的缩写 ,input事件:当input的value改变是触发
</template>

 2,与子组件进行双向数据绑定

<!-- Parent.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><!-- Child.vue -->
<script setup>
const model = defineModel()
</script><template><span>My input</span> <input v-model="model">
</template>//相当于下面的老版本(3.4之前)的实现方式
<!-- Parent.vue -->
<Child:modelValue="msg"@update:modelValue="$event => msg = $event"
/><!-- 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>
//注意:父组件传的值为undefined,子组件有默认值,这种情况将导致父组件的model跟子组件的model初始值不一致,不过,绑定关系还在,双方任何改动,还是会使值同步。如下
// 子组件:
const model = defineModel({ default: 1 })// 父组件
const myRef = ref()
<Child v-model="myRef"></Child>

 

defineModel:获取父元素传过来的属性值,用法如下

父:<Child v-model='aaa'> //不带参数,默认参数名称是modelValue , 相当于 <Child v-bind:modelValue='aaa' v-on:update:modelValue='value=>modelValue=value'>

1,子:let model = defineModel()

2,子带默认值:let model = defineModel({ default: 0 })

3,父必填:let model = defineModel({ required: true })

父带参数:<Child v-model:first-name='aaa' ></Child>   //不带参数,默认参数名称是modelValue

子:let model = defineModel(‘firstName’,{ default: 0 });   //first-name 可用firstName接收

父多个绑定:<Child v-model:first-name='aaa'  v-model:last-name='bbb'></Child>

子:let model = defineModel(‘firstName’); let model = defineModel(‘lastName’); 

v-model可带修饰符:trim number lazy,及自定义修饰符

//带指令基础写法
<!--Parent-->
const myText = ref('')
<Child v-model.trim="myText" />
<!--Child-->
const model = defineModel();
<input type="text" v-model="model" />

 

//自定义指令,例如capitalize,把输入的值首字母大写
<!--Parent-->
<Child v-model.capitalize="myText" />
<!--Child-->
<script setup>
//modifiers打印的值为:{ capitalize: true },与自定义修饰符保持一致
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老版本写法如下:
<!--Parent-->
let myText = ref('');
<Child v-model.capitalize='myText' />
<!--Child-->
<script setup>
const props = defineProps({modelValue: String,modelModifiers: { default: () => ({}) }
})const emit = defineEmits(['update:modelValue'])function emitValue(e) {let value = e.target.valueif (props.modelModifiers.capitalize) {value = value.charAt(0).toUpperCase() + value.slice(1)}emit('update:modelValue', value)
}
</script><template><input type="text" :value="modelValue" @input="emitValue" />
</template>

v-model可以同时添加参数及修饰符,例如 let msg = ref(''), v-model:name.trim="msg"

总结:

表单:v-model是:value="msg" @input="updateValue" 的缩写

let updateValue = ($e)=>{

  msg.value = $e.target.value

}

子组件:v-model是:modelValue="msg" @update:modelValue="$value => msg = $value " 的缩写

let msg = ref('');

<Child v-model='msg'/>  跟 <Child :modelValue="msg" @update:modelValue="$value => msg = $value " />一样

defineModel 是一个便利宏。编译器将其展开为以下内容:

  • 一个名为 modelValue 的 prop,本地 ref 的值与其同步;
  • 一个名为 update:modelValue 的事件,当本地 ref 的值发生变更时触发

及defineModel只用于子组件中, 是下面两句的缩写

const props = defineProps(['modelValue'])

const emit = defineEmits(['update:modelValue'])

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/74444.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

Apache Pig 系列 一 [PIG的安装]

1 - 系统环境2- 下载PIGwget https://github.com/apache/pig/archive/refs/tags/release-0.17.0.tar.gz 3- 解压tar -zxvf release-0.17.0.tar.gz 4-构建 构建报错, 使用其他的方式下载wget https://mirrors.tuna.tsinghua.edu.cn/apache/pig/pig-0.17.0/pig-0.17.0.tar.gz …

帝国cms伪静态设置方法

众所周知,动态页面不利于收录和排名。伪静态可以完美的解决这问题,配合百度云加速等免费CDN,可以让动态页面有静态页面一样快的访问速度。今天我给大家带来帝国CMS伪静态的详细设置方法。 1.栏目设置为动态访问修改单个栏目属性,如下图批量修改栏目属性,如下图:2.首页也设…

Termux使用的一些细节

开启ssh pkg i openssh # 启动ssh服务 sshd # 设置密码 passwd # 查看本机ip,找到wlan0或者直接找192开头的ip ifconfig默认的端口是8022。 有不少教程是写一个whoami命令,但是我实测直接使用root作为用户名即可(和root权限无关)以下是ssh配置的路径,有端口号等信息/data/…

[Linux Mint]安装搜狗输入法

造冰箱的大熊猫@cnblogs 2024/10/22, Linux Mint 1、从官网下载搜狗拼音输入法的deb包2、安装deb包sudo apt deb sogoupinyin.deb 3、设置输入法框架 - 启动Input Method,将“Input method framework”设置为fcitx - 选择“Simplified Chinese”,点击“Install the language…

chapter4

通过python process.run.py -h命令了解了process.run.py的可用的选项 题外话(关于/home目录的): /home 目录是 Linux 系统中用于存储用户个人文件的地方。每个用户在 /home 下都有一个以其用户名命名的子目录,用于存放该用户的个人数据和设置。以下是一些 /home 目录的特点…

如何以最简单的方式传输文件到开发板上-lrzsz-ZModem

在某鱼上闲逛的时候,看到树莓派A+这个型号的板子,很便宜30来块钱,有6ULL的性能。 但是既没有网口、也没有WiFi,只有一个usb,电脑和它传数据岂不是非常麻烦?其实有一个非常好用的协议叫ZModem,它的设计就是主要为了能在串口这种几乎无需配置的连接协议上传输文件。类似的…

东山Pi柒号-3-STM32MP1 引导链概述

进行移植前先看看ST官网的一些资料,了解芯片的工作方式: STM32MP1 引导链概述 https://wiki.stmicroelectronics.cn/stm32mpu/wiki/STM32MP1_boot_chain_overview启动步骤如下BROM(BL1):芯片内部程序,根据BOOT PIN读取对应启动设备里的程序到内部SYSRAM执行,工作在在Secur…

派生类

派生类 1. 派生类2. 派生类对象定义时调用构造函数的顺序 Man man;3. public、protected、private 4. 函数遮蔽