从“心”认识Vue(三):再谈v-model


前言

开始学习vue了,但是编程的思想还是不容易转变过来,一两周过去了,只知道个大概,知其然而不知其所以然,打算开一个系列帖,重新认识下vue。


一、v-model的基本使用

vue中使用v-model实现表单元素和数据的双向绑定。

1.v-model绑定text输入框

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Title</title>
</head>
<body>
<div id="app">
  <input type="text" v-model="msg">
  <h3>{{msg}}</h3>
</div>

<script src="node_modules/vue/dist/vue.min.js"></script>
<script>
  new Vue({
    el: "#app",
    data: {
      msg: "haha"
    }
  })
</script>
</body>
</html>

2.v-model绑定原理

仔细看上面代码,看v-model都做了什么?

  • 第一步,使用v-bind绑定了值;
  • 第二步,使用了一个input事件实现值的同步输入

那么我们可以理解为这样:先用v-bind绑定value值,然后用通过v-on使用input事件,event.target.value为事件源的值

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Title</title>
</head>
<body>
<div id="app">

 <input type="text" :value="msg" @input="valChange">

  <h3>{{msg}}</h3>
</div>

<script src="node_modules/vue/dist/vue.min.js"></script>
<script>
  new Vue({
    el: "#app",
    data: {
      msg: "haha"
    },
    methods:{
      valChange(event){
        this.msg = event.target.value
      }
    }
  })
</script>
</body>
</html>

进而,input可以写成这样,事件方法就不用写了:

<input type="text" :value="msg" @input="msg=$event.target.value">

也就是上面代码等同于下面代码:

<input type="text" v-model="msg">

二、v-model与radio

  • v-model直接与单选框value值进行绑定
  • 定义了value值时,radio也会同时选中,基于双向绑定
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Title</title>
</head>
<body>
  <div id="app">
    <label for="male">
<!--      用v-model时name值不写时它们也是互斥的-->
      <input type="radio" id="male" value="" v-model="sex"></label>
    <label for="female">
      <input type="radio" id="female" value="" v-model="sex"></label>
    <h2>你选择的是:{{sex}}</h2>
    </div>

    <script src="node_modules/vue/dist/vue.min.js"></script>
    <script>
      new Vue({
        el:"#app",
        data:{
          msg:"haha",
          //sex默认是男,同时input也会被选中,基于双向绑定
          sex:"男"
        }
      })
    </script>
</body>
</html>

三、v-model与checkbox

1.单选框

  • v-model与checked是否选中绑定,绑定boolean值
  • 此时value与v-model无关
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Title</title>
</head>
<body>
  <div id="app">
    <label for="agree">
      <input type="checkbox" id="agree" v-model="isAgree">同意协议
    </label>
    <h2>你选择的是:{{isAgree}}</h2>
    <button :disabled="!isAgree">下一步</button>

    <script src="node_modules/vue/dist/vue.min.js"></script>
    <script>
      new Vue({
        el:"#app",
        data:{
          msg:"haha",
          isAgree:false,//单选框
        }
      })
    </script>
</body>
</html>

2.多选框

  • 多选时,v-model绑定的是一个数组
  • 当被选中时,value值就会加入数组中
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Title</title>
</head>
<body>
  <div id="app">

<!--  2.多选-->
    <input type="checkbox" value="篮球" v-model="hobbies">篮球
    <input type="checkbox" value="足球" v-model="hobbies">足球
    <input type="checkbox" value="羽毛球" v-model="hobbies">羽毛球
    <input type="checkbox" value="乒乓球" v-model="hobbies">乒乓球
    <h2>你选择的是:{{hobbies}}</h2>


    <script src="node_modules/vue/dist/vue.min.js"></script>
    <script>
      new Vue({
        el:"#app",
        data:{
          msg:"haha",
          isAgree:false,//单选框
          hobbies:[],//多选框
        }
      })
    </script>
</body>
</html>

四、v-model与select下拉菜单

1.单选时

  • v-model绑定的是一个值
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Title</title>
</head>
<body>
  <div id="app">
<!--      1.选择一个-->
    <select name="fruit" id="" v-model="fruit">
      <option value="苹果">苹果</option>
      <option value="香蕉">香蕉</option>
      <option value="草莓">草莓</option>
    </select>
	<h2>你选择的是:{{fruit}}</h2>

    <script src="node_modules/vue/dist/vue.min.js"></script>
    <script>
      new Vue({
        el:"#app",
        data:{
          msg:"haha",
          fruit:"香蕉"
        }
      })
    </script>
</body>
</html>

2.多选时

  • 此时v-model绑定一个数组
  • 按住shift或ctrl多选时,value值会加入到数组中
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Title</title>
</head>
<body>
  <div id="app">

    <select name="fruit" id="" v-model="fruits" multiple>
      <option value="苹果">苹果</option>
      <option value="香蕉">香蕉</option>
      <option value="草莓">草莓</option>
    </select>
    <h2>你选择的是:{{fruits}}</h2>
    </div>

    <script src="node_modules/vue/dist/vue.min.js"></script>
    <script>
      new Vue({
        el:"#app",
        data:{
          msg:"haha",
          fruits:[]
        }
      })
    </script>
</body>
</html>

五、v-model的值绑定

  • 从data获取数据后,动态给value赋值
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Title</title>
</head>
<body>
  <div id="app">

<!--    3.值绑定-->
    <label v-for="item in originHobbies" :for="item">
      <input type="checkbox" :value="item" :id="item" v-model="hobbies">{{item}}
    </label>
    <h2>你选择的是:{{hobbies}}</h2>
  </div>

    <script src="node_modules/vue/dist/vue.min.js"></script>
    <script>
      new Vue({
        el:"#app",
        data:{
          msg:"haha",
          originHobbies:['篮球','足球','羽毛球','乒乓球','台球']
        }
      })
    </script>
</body>
</html>

六、v-model的修饰符

1.lazy

  • 默认情况下input输入框与v-model绑定值是同步输入的
  • lazy可以避免数据的频繁刷新,即只有失去焦点或者回车后数据才会进行更新
<input type="text" v-model.lazy="msg">
<h2>{{msg}}</h2>

2.number

  • 默认情况下v-model总是把输入的变量自动转换为字符串
  • number可以让输入的内容转换为number类型
    <input type="number" v-model.number="age">
    <h2>{{age}}--{{typeof age}}</h2>

3.trim

  • trim修饰符可以过滤内容左右两边的空格
   <input type="text" v-model.trim="name">
   <h2>名字:{{name}}</h2>

不加trim时网页渲染时显示不出来空格,实际上是有空格,在控制台里可以查看,如果不想出现空格,就加上trim。


总结

    1. v-model与input输入框绑定时双向绑定值;
    1. 与radio单选框绑定时绑定是否选中布尔值;
    1. 与checkbox多选框绑定时绑定值;
    1. 与select下拉菜单绑定时绑定值;
    1. v-model的值绑定是基于v-bind动态赋值value;
    1. v-model有修饰符。
Vue3中,v-model可以用在组件上,当v-model用在组件上时,v-model会被展开为一个自定义的形式。例如,使用v-model绑定一个名为searchText的变量时,展开形式如下: ``` <CustomInput :modelValue="searchText" @update:modelValue="newValue => searchText = newValue" /> ``` 这的CustomInput是一个自定义组件,它接收一个名为modelValue的prop,并在值发生变化时通过update:modelValue事件来更新searchText的值。这样,我们在父组件中可以使用v-model语法来双向绑定searchText变量。 此外,在Vue3中,我们还可以通过v-model.name来自定义修饰符。自定义的修饰符需要在子组件中用props接收modelModifiers对象,这个对象下面会有自定义属性,值为true。例如,我们可以在子组件中使用以下方式来接收名为a的自定义修饰符: ``` <template> <son-component v-model.a='msg' /> </template> export default { props:['modelValue', 'modelModifiers'], emits: ['update:modelValue'], created() { console.log(this.modelModifiers.a) // 值为true } } ``` 这样,在父组件中使用v-model.a修饰符时,会触发update:modelValue事件,并在子组件中将modelModifiers.a设为true。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [3分钟认识Vue3的v-model](https://blog.csdn.net/weixin_48115935/article/details/124907016)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [Vue3: v-model](https://blog.csdn.net/Everglow___/article/details/130222058)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值