VUE:雙向綁定

一帘靡、 雙向綁定:

  1. 問題: 使用傳統(tǒng)的: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. 示例: 使用雙向綁定實現(xiàn)點按鈕搜索


    圖片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 找可能發(fā)生改變的位置
  本例中: 只有文本框的內容可能發(fā)生變化,所以用:value來綁定文本框的內容聋丝。
  1.3 找觸發(fā)事件的元素
  本例中: 點按鈕觸發(fā)事件索烹,執(zhí)行搜索操作-->
  <div id="app">
    <input v-model="str">
    <button @click="search">百度一下</button>
  </div>
  <script>
    //2. 創(chuàng)建new Vue()對象, 監(jiān)視id為app的區(qū)域
    var vm=new Vue({
      el:"#app",
      //3. 創(chuàng)建模型對象: 
      //3.1 創(chuàng)建data對象
      //本例中: 因為界面中只需要一個變量,所以
      data:{
        str:"" //保存用戶在界面上文本框中輸入的內容弱睦。開局百姓,內容為""
      },
      //3.2 創(chuàng)建methods對象
      //本例中: 因為界面中只需要一個事件處理函數(shù),所以
      methods:{
        search(){
          if(this.str!==""){
            console.log(`搜索${this.str}相關的內容...`);
          }
        }
      }
    })
  </script>
</body>
</html>

運行結果:

圖片3.png

5. 原理: 雙向綁定的原理: 自動綁定input或change事件+訪問器屬性+虛擬DOM樹
(1). v-model會自動給表單元素綁定input或change事件
(2). 每當界面中表單元素的值發(fā)生改變時况木,就能自動調用事件處理函數(shù)垒拢。
(3). 在事件處理函數(shù)中旬迹,可以獲得當前表單元素的內容,實時賦值給data中的變量求类。
(4). 示例: 使用:value和事件模擬實現(xiàn)雙向綁定:
_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 找可能發(fā)生改變的位置
  本例中: 只有文本框的內容可能發(fā)生變化奔垦,所以用:value來綁定文本框的內容。
  1.3 找觸發(fā)事件的元素
  本例中: 點按鈕觸發(fā)事件尸疆,執(zhí)行搜索操作-->
  <div id="app">
    <!--DOM中每個文本框都有一個input事件
        每當在文本框中輸入或刪除了內容時就會實時觸發(fā)椿猎。-->
    <input :value="str" @input="input">
    <button @click="search">百度一下</button>
  </div>
  <script>
    //2. 創(chuàng)建new Vue()對象, 監(jiān)視id為app的區(qū)域
    var vm=new Vue({
      el:"#app",
      //3. 創(chuàng)建模型對象: 
      //3.1 創(chuàng)建data對象
      //本例中: 因為界面中只需要一個變量,所以
      data:{
        str:"" //保存用戶在界面上文本框中輸入的內容寿弱。開局犯眠,內容為""
      },
      //3.2 創(chuàng)建methods對象
      //本例中: 因為界面中只需要一個事件處理函數(shù),所以
      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. 按回車執(zhí)行搜索: vue中的事件修飾符:
(1). 問題: @keyup可以為元素綁定鍵盤按下后抬起事件症革。但是筐咧,任何按鍵都可以觸發(fā)這個事件。不是我們想要的地沮!我們希望只有按回車鍵時才能觸發(fā)事件嗜浮。
(2). 解決: vue中專門定義了事件修飾符用來限制事件的行為:
比如: @keyup.13="事件處理函數(shù)"
只限于按13號鍵/回車鍵時才能觸發(fā)事件羡亩。

  1. watch: (監(jiān)視)
    (1). 什么是: 專門在變量值被修改時自動執(zhí)行一項任務的特殊監(jiān)視函數(shù).
    (2). 何時: 今后摩疑,只要希望一個變量的值一改變,就能立刻執(zhí)行一個操作時畏铆。都用watch
    (3). 如何:
   new Vue({
     el:"#app",
     data:{ 變量名: 值, ... },
     methods:{},
     watch:{
        變量名(){
          
        }
     }
   })
  1. 示例: 實現(xiàn)按回車搜索和一邊輸入一邊執(zhí)行搜索
    _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 找可能發(fā)生改變的位置
  本例中: 希望文本框內容改變雷袋,程序中變量自動接到新值,就必須用v-model雙向綁定.
  1.3 找觸發(fā)事件的元素
  本例中: 點按鈕觸發(fā)事件辞居,執(zhí)行搜索操作-->
  <div id="app">
    <input v-model="str" @keyup.13="search">
    <button @click="search">百度一下</button>
  </div>
  <script>
    //2. 創(chuàng)建new Vue()對象, 監(jiān)視id為app的區(qū)域
    var vm=new Vue({
      el:"#app",
      //3. 創(chuàng)建模型對象: 
      //3.1 創(chuàng)建data對象
      //本例中: 因為界面中只需要一個變量楷怒,所以
      data:{
        str:"" //保存用戶在界面上文本框中輸入的內容。開局瓦灶,內容為""
      },
      //3.2 創(chuàng)建methods對象
      //本例中: 因為界面中只需要一個事件處理函數(shù)鸠删,所以
      methods:{
        search(){
          if(this.str!==""){
            console.log(`搜索${this.str}相關的內容...`);
          }
        }
      },
      //因為希望str變量值一變,立刻自動執(zhí)行搜索操作
      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的選中狀態(tài)芹啥。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 找可能發(fā)生變化的位置: 
  本例中: 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. 創(chuàng)建new Vue()對象
    new Vue({
      el:"#app",
      //3. 創(chuàng)建模型對象
      //本例中: 界面中雖然有兩處變化蚯涮,但是治专,兩處變化用的是同一個變量。
      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). 當用戶切換了選中狀態(tài)饶深,則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 找可能發(fā)生變化的位置: 
  本例中: 2大類情況
    checkbox自己的checked狀態(tài)會被用戶主動改變,所以應該用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. 創(chuàng)建new Vue()對象
    new Vue({
      el:"#app",
      //3. 創(chuàng)建模型對象
      //本例中: 界面上只需要一個變量agree
      data:{
        agree:false, //表示用戶是否同意,開局箭窜,默認為不同意
      }
    })
  </script>
</body>
</html>

運行結果:


圖片11.png

圖片12.png
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末毯焕,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌纳猫,老刑警劉巖婆咸,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異芜辕,居然都是意外死亡尚骄,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進店門侵续,熙熙樓的掌柜王于貴愁眉苦臉地迎上來倔丈,“玉大人,你說我怎么就攤上這事状蜗⌒栉澹” “怎么了?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵轧坎,是天一觀的道長宏邮。 經(jīng)常有香客問我,道長缸血,這世上最難降的妖魔是什么蜜氨? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮捎泻,結果婚禮上飒炎,老公的妹妹穿的比我還像新娘。我一直安慰自己族扰,他們只是感情好厌丑,可當我...
    茶點故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布定欧。 她就那樣靜靜地躺著渔呵,像睡著了一般。 火紅的嫁衣襯著肌膚如雪砍鸠。 梳的紋絲不亂的頭發(fā)上扩氢,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天,我揣著相機與錄音爷辱,去河邊找鬼录豺。 笑死,一個胖子當著我的面吹牛饭弓,可吹牛的內容都是我干的双饥。 我是一名探鬼主播,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼弟断,長吁一口氣:“原來是場噩夢啊……” “哼咏花!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤昏翰,失蹤者是張志新(化名)和其女友劉穎苍匆,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體棚菊,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡浸踩,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了统求。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片检碗。...
    茶點故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖码邻,靈堂內的尸體忽然破棺而出后裸,到底是詐尸還是另有隱情,我是刑警寧澤冒滩,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布微驶,位于F島的核電站,受9級特大地震影響开睡,放射性物質發(fā)生泄漏因苹。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一篇恒、第九天 我趴在偏房一處隱蔽的房頂上張望扶檐。 院中可真熱鬧,春花似錦胁艰、人聲如沸款筑。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽奈梳。三九已至,卻和暖如春解虱,著一層夾襖步出監(jiān)牢的瞬間攘须,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工殴泰, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留于宙,地道東北人。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓悍汛,卻偏偏與公主長得像捞魁,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子离咐,可洞房花燭夜當晚...
    茶點故事閱讀 42,792評論 2 345

推薦閱讀更多精彩內容