VUE:双向绑定

一、 双向绑定:

  1. 问题: 使用传统的:value绑定表单元素的内容时,虽然界面中更新了表单元素的内容,但是程序中的变量里却无法获得新的表单元素内容。

  2. 原因: 单向绑定: 只能将程序中的变量值,更新到页面中显示。无法实时将页面中的修改的新值,反向更新回程序中的变量里。(只能从Model->View,不会从View->Model)比如: :value就是一种单向绑定.

  3. 解决: vue中其实提供了双向绑定的方式:
    1). 什么是双向绑定: 既能将程序中的变量值,更新到页面中显示。又能实时将页面中的修改的新值,反向更新回程序中的变量里。(既能从Model->View,又能从View->Model)
    2). 何时: 今后,只要想实时获得/收集用户在界面上输入或选择的表单元素的新值时,都要用双向绑定。
    3). 如何: <表单元素 v-model="变量">
    view->model
    4). 结果: 只要界面上用户修改了表单元素的值,v-model就会立刻自动将新表单元素值更新回程序中data中的变量里保存。

  4. 示例: 使用双向绑定实现点按钮搜索


    图片1.png

    图片2.png

v-model.html

<!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="js/vue.js"></script>
</head>
<body>
  <!--VUE 3步
  1. 做界面
  1.1 唯一父元素包裹
  1.2 找可能发生改变的位置
  本例中: 只有文本框的内容可能发生变化,所以用:value来绑定文本框的内容。
  1.3 找触发事件的元素
  本例中: 点按钮触发事件,执行搜索操作-->
  <div id="app">
    <input v-model="str">
    <button @click="search">百度一下</button>
  </div>
  <script>
    //2. 创建new Vue()对象, 监视id为app的区域
    var vm=new Vue({
      el:"#app",
      //3. 创建模型对象: 
      //3.1 创建data对象
      //本例中: 因为界面中只需要一个变量,所以
      data:{
        str:"" //保存用户在界面上文本框中输入的内容。开局,内容为""
      },
      //3.2 创建methods对象
      //本例中: 因为界面中只需要一个事件处理函数,所以
      methods:{
        search(){
          if(this.str!==""){
            console.log(`搜索${this.str}相关的内容...`);
          }
        }
      }
    })
  </script>
</body>
</html>

运行结果:

图片3.png

5. 原理: 双向绑定的原理: 自动绑定input或change事件+访问器属性+虚拟DOM树
(1). v-model会自动给表单元素绑定input或change事件
(2). 每当界面中表单元素的值发生改变时,就能自动调用事件处理函数。
(3). 在事件处理函数中,可以获得当前表单元素的内容,实时赋值给data中的变量。
(4). 示例: 使用:value和事件模拟实现双向绑定:
_v-model2.html
图片4.png

<!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="js/vue.js"></script>
</head>
<body>
  <!--VUE 3步
  1. 做界面
  1.1 唯一父元素包裹
  1.2 找可能发生改变的位置
  本例中: 只有文本框的内容可能发生变化,所以用:value来绑定文本框的内容。
  1.3 找触发事件的元素
  本例中: 点按钮触发事件,执行搜索操作-->
  <div id="app">
    <!--DOM中每个文本框都有一个input事件
        每当在文本框中输入或删除了内容时就会实时触发。-->
    <input :value="str" @input="input">
    <button @click="search">百度一下</button>
  </div>
  <script>
    //2. 创建new Vue()对象, 监视id为app的区域
    var vm=new Vue({
      el:"#app",
      //3. 创建模型对象: 
      //3.1 创建data对象
      //本例中: 因为界面中只需要一个变量,所以
      data:{
        str:"" //保存用户在界面上文本框中输入的内容。开局,内容为""
      },
      //3.2 创建methods对象
      //本例中: 因为界面中只需要一个事件处理函数,所以
      methods:{
        input(e){
          //DOM中: 
                   //当前文本框的内容
               //赋值给
          //data中的str
          this.str=e.target   .value
        },
        search(){
          if(this.str!==""){
            console.log(`搜索${this.str}相关的内容...`);
          }
        }
      }
    })
  </script>
</body>
</html>

运行结果:

图片5.png

6. 按回车执行搜索: vue中的事件修饰符:
(1). 问题: @keyup可以为元素绑定键盘按下后抬起事件。但是,任何按键都可以触发这个事件。不是我们想要的!我们希望只有按回车键时才能触发事件。
(2). 解决: vue中专门定义了事件修饰符用来限制事件的行为:
比如: @keyup.13="事件处理函数"
只限于按13号键/回车键时才能触发事件。

  1. watch: (监视)
    (1). 什么是: 专门在变量值被修改时自动执行一项任务的特殊监视函数.
    (2). 何时: 今后,只要希望一个变量的值一改变,就能立刻执行一个操作时。都用watch
    (3). 如何:
   new Vue({
     el:"#app",
     data:{ 变量名: 值, ... },
     methods:{},
     watch:{
        变量名(){
          
        }
     }
   })
  1. 示例: 实现按回车搜索和一边输入一边执行搜索
    _v-model3.html
<!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="js/vue.js"></script>
</head>
<body>
  <!--VUE 3步
  1. 做界面
  1.1 唯一父元素包裹
  1.2 找可能发生改变的位置
  本例中: 希望文本框内容改变,程序中变量自动接到新值,就必须用v-model双向绑定.
  1.3 找触发事件的元素
  本例中: 点按钮触发事件,执行搜索操作-->
  <div id="app">
    <input v-model="str" @keyup.13="search">
    <button @click="search">百度一下</button>
  </div>
  <script>
    //2. 创建new Vue()对象, 监视id为app的区域
    var vm=new Vue({
      el:"#app",
      //3. 创建模型对象: 
      //3.1 创建data对象
      //本例中: 因为界面中只需要一个变量,所以
      data:{
        str:"" //保存用户在界面上文本框中输入的内容。开局,内容为""
      },
      //3.2 创建methods对象
      //本例中: 因为界面中只需要一个事件处理函数,所以
      methods:{
        search(){
          if(this.str!==""){
            console.log(`搜索${this.str}相关的内容...`);
          }
        }
      },
      //因为希望str变量值一变,立刻自动执行搜索操作
      watch:{
        str(){
          this.search();
        }
      }
    })
  </script>
</body>
</html>

运行结果:

图片6.png

9. 不同表单元素上的双向绑定效果:
(1). 文本框/textarea :
v-model会自动获得value属性值,并自动更新回程序中data中的变量里保存。
(2). 单选按钮(radio):
a. 特点: 一组单选按钮有多个radio组成。且每个radio的value值都是固定写死的。
b. 如何: 要在每个备选的radio中都写上v-model=sex
<input type="radio" name="sex" value="1" v-model="sex">男
<input type="radio" name="sex" value="0" v-model="sex">女
c. 原理:
1). html中,一组相同name名的radio,只能选一个
2). v-model每次只会把选中的一个radio的value值自动更新回程序中变量里。
3). 如果程序中的变量值改变,也会影响页面上radio的选中状态。v-model会取回变量值和当前radio的value值做比较。哪个radio的value值与变量值相等,哪个radio就选中。
d. 示例: 选择性别:
图片7.png

_v-model_radio.html

<!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="js/vue.js"></script>
</head>
<body>
  <div id="app">
    性别: <input type="radio" name="sex" value="1" v-model="sex">男
          <input type="radio" name="sex" value="0" v-model="sex">女
    <br/>
    <h3>您选择的性别是:{{sex}}</h3>
  </div>
  <script>
    new Vue({
      el:"#app",
      data:{
        sex:1
      }
    })
  </script>
</body>
</html>

运行结果:

image.png

(3). select:
a. 特点:
1). 一个select元素,包含多个option元素
2). select元素中每个value值也都是在每个option上写死的!
b. 如何: v-model只写在select元素上一份即可!
<select v-model="变量">
<option value="备选值1">xxx</option>
<option value="备选值2">xxx</option>
<option value="备选值3">xxx</option>
c. 原理:
1). 首次加载页面时: v-model读取出变量的当前值和每个option的value值作比较。哪个option的value值与变量值相等,select就选中哪个option
2). 每当用户切换了select下的选中项时,v-model只会将选中的一个option的value值自动更新回程序中data中变量里保存。
d. 示例:选择城市,显示城市图片
图片8.png

_v-model_select.html

<!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="js/vue.js"></script>
</head>
<body>
  <!--VUE 3步
  1. 做界面
  1.1 唯一父元素
  1.2 找可能发生变化的位置: 
  本例中: 2处: 
    select的选中项会被用户主动改变,所以,应该用双向绑定
    img元素的src属性值会被程序自动改变,所以,应该用单向绑定-->
  <div id="app">
    请选择城市: <select id="sel" v-model="src">
      <option value="img/bj.jpg">北京</option>
      <option value="img/sh.jpg">上海</option>
      <option value="img/hz.jpg">杭州</option>
    </select><br/>
    <br/>
    <br/>
    <img style="width:300px" :src="src">
  </div>
  <script>
    //2. 创建new Vue()对象
    new Vue({
      el:"#app",
      //3. 创建模型对象
      //本例中: 界面中虽然有两处变化,但是,两处变化用的是同一个变量。
      data:{
        src:"img/bj.jpg"
      }
    })
  </script>
</body>
</html>

运行结果:


图片9.png

(4). checkbox单用:
a. 特点: 没有value属性。用户选中与不选中改的是checked属性。
b. 如何: <input type="checkbox" v-model="变量">
c. 原理:
1). v-model直接操作和读取checked属性
2). 首次加载页面时,v-model读取变量值。如果变量值为true,则当前checkbox选中。如果变量值为false,则当前checkbox不选中
3). 当用户切换了选中状态,则v-model会直接将checked属性值更新回程序中data中变量里。且值还是bool类型的true或false。
d. 示例: 点同意,启用元素:


图片10.png

_v-model_checkbox.html

<!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="js/vue.js"></script>
</head>
<body>
  <!--VUE 3步
  1. 做界面
  1.1 唯一父元素
  1.2 找可能发生变化的位置: 
  本例中: 2大类情况
    checkbox自己的checked状态会被用户主动改变,所以应该用v-model绑定
    其它三个表单元素的disabled属性会被程序自动改变,所以应该用:单向绑定。
    又因为选中checkbox会影响其它元素的disabled,所以,checkbox和其它元素的disabled属性使用的是同一个变量。
  -->
  <div id="app">
    <br/>
    用户名:<input :disabled="!agree"><br/>
    <br/>
    密码:<input :disabled="!agree" type="password"><br/>
    <br/>
    <input type="checkbox" v-model="agree">同意<br/>
    <br/>
    <button :disabled="!agree">注册</button>
  </div>
  <script>
    //2. 创建new Vue()对象
    new Vue({
      el:"#app",
      //3. 创建模型对象
      //本例中: 界面上只需要一个变量agree
      data:{
        agree:false, //表示用户是否同意,开局,默认为不同意
      }
    })
  </script>
</body>
</html>

运行结果:


图片11.png

图片12.png
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,634评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,951评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,427评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,770评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,835评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,799评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,768评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,544评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,979评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,271评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,427评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,121评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,756评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,375评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,579评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,410评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,315评论 2 352

推荐阅读更多精彩内容