• Vue 中v-model的完整用法(v-model的实现原理)


    目录

    一、 v-model的基本使用

    二、 v-model的原理

    三、 v-model结合radio类型使用

    4. v-model结合复选框类型使用

    单选

    多选

    值的绑定

    5. v-model结合select

    6. v-model的修饰符的使用


     

    一、 v-model的基本使用

    v-model双向绑定,既输入框的value改变,对应的message对象值也会改变,修改message的值,input的value也会随之改变。无论改变那个值,另外一个值都会变化。

    1. html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8">
    5. <title>Titletitle>
    6. head>
    7. <body>
    8. <div id="app">
    9. <input type="text" v-model="message">{{message}}
    10. div>
    11. <script src="../js/vue.js">script>
    12. <script>
    13. const app = new Vue({
    14. el: '#app',
    15. data: {
    16. message: "hello"
    17. }
    18. })
    19. script>
    20. body>
    21. html>

    二、 v-model的原理

    先来一个demo实现不使用v-model实现双向绑定。

    实现双向绑定需要是用v-bind和v-on,使用v-bind给input的value绑定message对象,此时message对象改变,input的值也会改变。但是改变input的value并不会改变message的值,此时需要一个v-on绑定一个方法,监听事件,当input的值改变的时候,将最新的值赋值给message对象。获取事件对象,target获取监听的对象dom,value获取最新的值。v-model = v-bind + v-on$event

    1. html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8">
    5. <title>Titletitle>
    6. head>
    7. <body>
    8. <div id="app">
    9. <input type="text" :value="message" @input="changeValue">{{message}}
    10. div>
    11. <script src="../js/vue.js">script>
    12. <script>
    13. const app = new Vue({
    14. el: '#app',
    15. data: {
    16. message: "hello world"
    17. },
    18. methods: {
    19. changeValue(event){
    20. console.log("值改变了");
    21. this.message = event.target.value
    22. }
    23. }
    24. })
    25. script>
    26. body>
    27. html>

    三、 v-model结合radio类型使用

    radio单选框的属性是互斥的,如果使用v-model,可以不使用name就可以互斥。

    v-model绑定`sex`属性,初始值为“男”,选择女后`sex`属性变成“女”,因为此时是双向绑定。

    1. <div id="app">
    2. <label for="male">
    3. <input type="radio" id="male" name="sex" value="男" v-model="sex">
    4. label>
    5. <label for="female">
    6. <input type="radio" id="female" name="sex" value="女" v-model="sex">
    7. label>
    8. <div>你选择的性别是:{{sex}}div>
    9. div>
    10. <script src="../js/vue.js">script>
    11. <script>
    12. const app = new Vue({
    13. el:"#app",
    14. data:{
    15. message:"zzz",
    16. sex:"男"
    17. },
    18. })
    19. script>
     

    四、 v-model结合复选框类型使用

    checkbox可以结合v-model做单选框,也可以多选框。

    checkbox结合v-model实现单选框,定义变量初始化为,点击checkbox的值为,也是。isAgree false true isAgree true

    checkbox结合v-model实现多选框,定义数组对象,用于存放爱好,将与checkbox对象双向绑定,此时选中,一个多选框,就多一个true,就添加一个对象。hobbies hobbies hhobbies

    单选

    1. html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8">
    5. <title>Titletitle>
    6. head>
    7. <body>
    8. <div id="app">
    9. <h2>单选框h2>
    10. <label for="agree">
    11. <input type="checkbox" id="agree" v-model="isAgree">同意协议
    12. label>
    13. <h3>您的选选择是:{{isAgree}}h3>
    14. <button :disabled="!isAgree">下一步button>
    15. div>
    16. <script src="https://cdn.jsdelivr.net/npm/vue@2.6.10/dist/vue.js">script>
    17. <script>
    18. const app = new Vue({
    19. el: '#app',
    20. data: {
    21. isAgree: true
    22. }
    23. })
    24. script>
    25. body>
    26. html>

    多选

    1. html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8">
    5. <title>Titletitle>
    6. head>
    7. <body>
    8. <div id="app">
    9. <h2>多选框h2>
    10. <input type="checkbox" name="hobby" value="篮球" v-model="hobbies">篮球
    11. <input type="checkbox" name="hobby" value="足球" v-model="hobbies">足球
    12. <input type="checkbox" name="hobby" value="羽毛球" v-model="hobbies">羽毛球
    13. <input type="checkbox" name="hobby" value="乒乓球" v-model="hobbies">乒乓球
    14. <h2>你的爱好是:{{hobbies}}h2>
    15. div>
    16. <script src="https://cdn.jsdelivr.net/npm/vue@2.6.10/dist/vue.js">script>
    17. <script>
    18. const app = new Vue({
    19. el: '#app',
    20. data: {
    21. hobbies: []
    22. }
    23. })
    24. script>
    25. body>
    26. html>

    值的绑定

    1. html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8">
    5. <title>Titletitle>
    6. head>
    7. <body>
    8. <div id="app">
    9. <h2>多选框h2>
    10. <label :for="item" v-for="(item,index) in hhobbies" :key="index">
    11. <input type="checkbox" name="hobby" :value="item" :id="item" v-model="hobbies">{{item}}
    12. label>
    13. <h2>你的爱好是:{{hobbies}}h2>
    14. div>
    15. <script src="https://cdn.jsdelivr.net/npm/vue@2.6.10/dist/vue.js">script>
    16. <script>
    17. const app = new Vue({
    18. el: '#app',
    19. data: {
    20. hobbies: [],
    21. hhobbies: ["篮球","足球","乒乓球","羽毛球"]
    22. }
    23. })
    24. script>
    25. body>
    26. html>

    五、 v-model结合select

    v-model结合select可以单选也可以多选。

    1. html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8">
    5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
    6. <meta http-equiv="X-UA-Compatible" content="ie=edge">
    7. <title>v-model结合select类型title>
    8. head>
    9. <body>
    10. <div id="app">
    11. <select name="fruit" v-model="fruit">
    12. <option value="苹果">苹果option>
    13. <option value="香蕉">香蕉option>
    14. <option value="西瓜">西瓜option>
    15. select>
    16. <h2>你选择的水果是:{{fruit}}h2>
    17. <select name="fruits" v-model="fruits" multiple>
    18. <option value="苹果">苹果option>
    19. <option value="香蕉">香蕉option>
    20. <option value="西瓜">西瓜option>
    21. select>
    22. <h2>你选择的水果是:{{fruits}}h2>
    23. div>
    24. <script src="../js/vue.js">script>
    25. <script>
    26. const app = new Vue({
    27. el:"#app",
    28. data:{
    29. fruit:"苹果",
    30. fruits:[]
    31. },
    32. })
    33. script>
    34. body>

    六、 v-model的修饰符的使用

     

    lazy:默认情况下是实时更新数据,加上,从输入框失去焦点,按下enter都会更新数据

    number:默认是字符串类型,使用复制为数字类型

    trim:用于自动过滤用户输入的首尾空白字符

    1. html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8">
    5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
    6. <meta http-equiv="X-UA-Compatible" content="ie=edge">
    7. <title>v-model修饰符title>
    8. head>
    9. <body>
    10. <div id="app">
    11. <h2>v-model修饰符h2>
    12. <h3>lazy,默认情况是实时更新数据,加上lazy,从输入框失去焦点,按下enter都会更新数据h3>
    13. <input type="text" v-model.lazy="message">
    14. <div>{{message}}div>
    15. <h3>修饰符number,默认是string类型,使用number赋值为number类型h3>
    16. <input type="number" v-model.number="age">
    17. <div>{{age}}--{{typeof age}}div>
    18. <h3>修饰符trim:去空格h3>
    19. <input type="text" v-model.trim="name">
    20. div>
    21. <script src="https://cdn.jsdelivr.net/npm/vue@2.6.10/dist/vue.js">script>
    22. <script>
    23. const app = new Vue({
    24. el:"#app",
    25. data:{
    26. message:"zzz",
    27. age:18,
    28. name:"ttt"
    29. },
    30. })
    31. script>
    32. body>
    33. html>

     

  • 相关阅读:
    使用Optional和直接返回null,哪个更好?
    原来老板口中的亏了是这个意思
    Spring Cloud Config 使用 JDBC 方式
    stm32——hal库学习笔记(外部中断)
    K8S MetalLB工作原理详解:地址分配、广播模式(Layer2模式、BGP模式)、工作過程
    3年测试经验跳槽成功拿下30W+年薪
    Nginx 可视化管理平台:nginx-proxy-manager
    格林公式挖洞法中内曲线顺时针的直观解释
    qemu 内核调试环境搭建
    leetcode 332. Reconstruct Itinerary(重构行程)
  • 原文地址:https://blog.csdn.net/yzq0820/article/details/126142123