掌握vue指令之(11)v-model指令

21 篇文章 0 订阅

(11)v-model指令(双向绑定)

单向绑定: 只能将new Vue()中模型对象中变量值的修改更新到页面上显示。如果页面中元素内容发生变化,无法自动将更改更新回new Vue()中的模型对象中保存。

解决:今后只要希望自动获得用户在界面上输入或选择的新值,都只能用双向绑定。

双向绑定:既能将new Vue()中模型对象中变量值的修改更新到页面上显示。又能将页面中元素内容发生的变化,自动更新回new Vue()中的模型对象中保存。

写法:<表单元素 v-model:可能变化的属性 =“变量”>

强调 :双向绑定几乎只用在表单元素上

原理: v-model包含两部分原理

(1). 从Model->View的绑定与之前讲解的绑定元素一样: 访问器属性+虚拟DOM树
(2). 但是从View->Model的绑定是新的原理:new Vue()扫描到包含v-model的表单元素时,就自动为表单元素绑定οnchange=function(){}事件处理函数。意为当表单元素的值发生改变时,就自动触发。然后,在onchange事件处理函数内,包含自动获取当前元素值并更新回Vue中指定变量中保存的语句。

示例: 根据文本框中输入的关键词搜索相关内容

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
</head>
<body>
  <!--想点百度一下,可按关键词搜索-->
  <!--1. 先做界面: 
    问题: 哪里可能发生变化
    本例中: 当用户在文本框中输入新内容时,input的value可能发生变化,希望new Vue()中自动获得用户输入的新值,所以用该用v-model:绑定。
    问题: 哪个元素会触发事件
    本例中: 点击button执行查找操作
          用户在文本框上按回车,也能执行和按钮的click一样的查找操作!-->
  <div id="app">
    <input type="text" @keyup="search2" v-model:value="keywords"><button @click="search">百度一下</button>
  </div>
  <script>
    //2. 定义new Vue()对象
    new Vue({
      el:"#app",
      //3. 定义模型对象
      //问题: 页面中共需要几个变量
      //本例中: 页面中只需要一个变量keywords,且如果用户未输入时,keywords的默认值为""
      //问题: 页面中共需要几个事件处理函数
      //本例中: 按钮需要search函数
      //       文本框需要search2函数
      data:{
        keywords:""
      },
      methods:{
        search(){
          //如果用户输入的关键词去空格后不为空
          //if(this.keywords.trim()!==""){
            //才用关键词执行查找操作
            console.log(`查找 ${this.keywords} 相关的内容....`)
          //}
        },
        search2(e){
          //只有点在回车上,才执行search操作
          if(e.keyCode==13){
            this.search();
          }
        }
      }
    })
  </script>
</body>
</html>

运行效果
在这里插入图片描述

其他类型的表单元素如何双向绑定

问题: 不是所有表单元素修改时,更新的都是value属性。比如radio和checkbox元素更新时,更新的就不是value属性。而是value属性写死固定不变,而更新checked选中状态属性
解决: 修改表单元素时,哪个属性变化,就用v-model绑定哪个属性。比如: 如果value属性值可能发生变化,就用v-model:value=“变量”。再比如: 如果checked属性可能发生变化,就用v-model:checked=“变量”。
写法:<input type="radio" value="写死的值" v-model:checked="变量">
示例: 切换选择性别

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
 <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
</head>
<body>
  <!--请用户选择性别-->
  <!--1. 先做界面
    问题: 界面中哪里可能发生变化
    本例中: 随着用户切换选择性别,两个input的checked属性可能发生变化又因为是表单元素
    所以: 两个input都用v-model:checked="变量"
    问题: 哪个元素可能触发事件
    本例中: 点按钮输出用户选择的性别值-->
  <div id="app">
    <label><input type="radio" name="sex" value="1" v-model:checked="sex"></label>
    <label><input type="radio" name="sex" value="0" v-model:checked="sex"></label>
    <br/>
    <button @click="submit">提交</button>
  </div>
  <script>
    //2. 创建new Vue()对象
    new Vue({
      el:"#app",
      //3. 定义模型对象
      //问题: 界面上一共需要几个变量
      //本例中: 界面上只需要一个变量sex
      //问题: 界面上共需要几个事件处理函数
      //本例中: 只需要一个事件处理函数submit
      data:{
        sex:0 //假设初始时选择0
      },
      methods:{
        submit(){
          console.log(`您本次选择的性别值为${this.sex}`)
        }
      }
    })
  </script>
</body>
</html>

运行效果
在这里插入图片描述

下拉选择框: …

当用户在select内选择不同的option时,其实改的是整个select的value属性。
写法<select v-model:value="变量">
示例: 选择城市,查看城市图片(图片自行更换)

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
</head>
<body>
  <!--用户选择城市,切换不同的城市图片-->
  <!--1. 做界面
    问题: 整个界面中共有几处可能发生变化?
    本例中: select元素的value属性值和img的src属性值,两处可能发生变化
    又因为: select元素是由用户手动选择的,而img的src是根据select的选择被动接受的。所以select元素采用双向绑定,img的src采用单项绑定。
    规律: select元素选中的value值,就是img的src值,所以,select的value和img的src可共用一个变量-->
  <div id="app">
    <select v-model:value="src">
      <option value="img/bj.jpg">北京</option>
      <option value="img/sh.jpg">上海</option>
      <option value="img/hz.jpg">杭州</option>
    </select><br/>
    <img :src="src">
  </div>
  <script>
    //2. 创建new Vue()对象
    new Vue({
      el:"#app",
      //3. 创建模型对象:
      //问题: 界面上共需要几个变量
      //本例中只需要一个变量就可同时控制select和img。
      data:{
        src:"img/sh.jpg",//开局默认选中上海
      }
    })
  </script>
</body>
</html>

运行效果:
在这里插入图片描述

东哥笔记

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值