[web教学] vue数据双向绑定

[复制链接]
查看739 | 回复0 | 2023-8-23 11:42:18 | 显示全部楼层 |阅读模式 来自 中国北京
5.Vue数据双向绑定

5.1.什么是双向数据绑定

Vue.js 是一个 MVVM 框架,即数据双向绑定,即当数据发生变化的时间,视图也就发生变化,当视图发生变化的时间,数据也会跟着同步变化。这也算是 Vue.js 的精华之处了。
值得留意的是,我们所说的数据双向绑定,肯定是对于 UI 控件来说的,非 UI 控件不会涉及到数据双向绑定。单向数据绑定是利用状态管理工具的条件。如果我们利用 vuex,那么数据流也是单项的,这时就会和双向数据绑定有辩说。
5.2 怎么实现双向数据绑定

v-model

  1. v-model 指令可以在表单及元素上创建双向数据绑定。它会根据控件类型自动选取正确的方法来更新元素。它负责监听用户的输入事件以更新数据,并对一些极端场景进行一些特殊处理。
  2. 注意:v-model 会忽略所有表单元素的 value、checked、selected 特性的初始值而总是将 Vue 实例的数据作为数据来源。你应该通过 JavaScript 在组件的 data 选项中声明初始值!
复制代码
测试案例:
用非v-model方式的时间,是不能双向绑定的
  1.                
  2.         <div id="app">     
  3.         <input type="text"  :value="msg"  />
  4.         <div>{{msg}}</div>
  5.     </div>
  6.    
  7.          <script>
  8.              var app = new Vue({
  9.                  el:'#app',
  10.                  data:{
  11.                     msg:"hello"
  12.                  }
  13.              });
  14.          </script>
复制代码

改为v-model方式绑定:
  1. <div id="app">     
  2.         <input type="text"  v-model="msg"  />
  3.         <div>{{msg}}</div>
  4.     </div>
  5.    
  6.          <script>
  7.              var app = new Vue({
  8.                  el:'#app',
  9.                  data:{
  10.                     msg:"hello"
  11.                  }
  12.              });
  13.          </script>
复制代码

案例2:
  1.    <div id="app">
  2.         <select v-model="selected">
  3.             <option value="">--请选择--</option>
  4.             <option value="北京">北京</option>
  5.             <option value="上海">上海</option>
  6.             <option value="武汉">武汉</option>
  7.         </select>
  8.         <p>{{selected}}</p>
  9.     </div>
  10.      <script>
  11.          var v= new Vue({
  12.              el:"#app",
  13.              data:{selected:'' }
  14.          });
  15.      </script>
复制代码

案例3:
  1.    <div id="app">
  2.         <input type="checkbox" id="jack" value="吃饭" v-model="checkedValues">
  3.         <label for="jack">吃饭</label>
  4.         <input type="checkbox" id="john" value="睡觉" v-model="checkedValues">
  5.         <label for="john">睡觉</label>
  6.         <input type="checkbox" id="mike" value="打豆豆" v-model="checkedValues">
  7.         <label for="mike">打豆豆</label>
  8.         <div>选中的值: </div>
  9.         <ul>
  10.           <li v-for="item in checkedValues" >{{item}}</li>
  11.         </ul>   
  12.     </div>
  13.    
  14.     <script type="text/javascript">
  15.     var v = new Vue({
  16.         el: '#app',
  17.         data: {
  18.             checkedValues:[]
  19.         }
  20.     });
  21.     </script>
复制代码

6.Vue变乱绑定

v-on

  1.   v-on:事件名 = “方法名”
  2.   简写方式: @事件名 = “方法名”
  3.   事件名有哪些: click|keydown|keyup|mouseover|mouseout|自定义事件名
复制代码
测试案例1:
  1. <!DOCTYPE html>
  2. <html>
  3.         <head>
  4.                 <meta charset="UTF-8">
  5.                 <title></title>
  6.                 <script type="text/javascript" src="js/vue.js" ></script>
  7.         </head>
  8.         <body>
  9.                
  10.                 <div id="app">
  11.                        
  12.                         <input type="button" value="-"  v-on:click="sub" />
  13.                         <input type="text" v-model="num" />
  14.                         <input type="button" value="+" @click="plus" />
  15.                        
  16.                        
  17.                 </div>
  18.                
  19.                 <script>
  20.                        
  21.                         var v=new Vue({
  22.                                
  23.                                 el:"#app",
  24.                                 data:{
  25.                                         num:1
  26.                                 },
  27.                                 methods:{
  28.                                         sub:function(){
  29.                                                 if(this.num>0)
  30.                                                   this.num-=1;
  31.                                         },
  32.                                         plus:function(){
  33.                                                 this.num=parseInt(this.num)+1;
  34.                                         }
  35.                                 }
  36.                                
  37.                         })
  38.                        
  39.                 </script>
  40.                
  41.         </body>
  42. </html>
复制代码


v-on: 可以简化为@
  1. <div id="app">
  2.         <input type="button" value="-" @click="sub" />
  3.         <input type="text"  v-model="count" />
  4.         <input type="button" value="+" @click="plus" />
  5. </div>
复制代码
测试案例2:
  1. <!DOCTYPE html>
  2. <html>
  3.         <head>
  4.                 <meta charset="UTF-8">
  5.                 <title></title>
  6.                 <script type="text/javascript" src="js/vue.js" ></script>
  7.         </head>
  8.         <body>
  9.                
  10.                 输入分数,按回车,显示等级
  11.                
  12.                 <div id="app">
  13.                        
  14.                         <div>等级:{{level}}</div>
  15.                        
  16.                         <input type="text"  v-on:keyup.enter="show" v-model="score" />
  17.                        
  18.                 </div>
  19.                
  20.                
  21.                  <script type="text/javascript">
  22.                 var app = new Vue({
  23.                     el: '#app',
  24.                     data: {
  25.                         level: '',
  26.                         score:''
  27.                     },
  28.                     methods: {
  29.                       
  30.                         show: function () {
  31.                           if(this.score>=0 && this.score<60)
  32.                               this.level="D";
  33.                           else if(this.score<80)
  34.                               this.level="C";   
  35.                           else if(this.score<90)
  36.                               this.level="B";
  37.                           else
  38.                               this.level="A";
  39.                         }
  40.                     }
  41.        
  42.                 })
  43.         </script>
  44.                
  45.                
  46.         </body>
  47. </html>
复制代码
测试效果:

7.综合案例

  1. 根据前面学习的vue的基础语法和事件绑定,实现一下商品的查询,添加,删除功能。
复制代码
测试案例:
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4.     <meta charset="UTF-8">
  5.     <title></title>
  6.     <script type="text/javascript" src="js/vue.js"></script>
  7. </head>
  8. <body>
  9.     <div id="app">
  10.         <div style="text-align: center;" >
  11.             <div >
  12.                 <h3 >商品操作页面</h3>
  13.             </div>
  14.                  <div  style="text-align:center">
  15.                                  序号:<input type="text"  v-model="id"/>
  16.                                  名称:<input type="text"  v-model="name"/>
  17.                                  价格:<input type="text"  v-model="price"/>
  18.                       <input type="button" value="添加" @click="add()"/><br/>
  19.                                    搜索:<input type="text" v-model="searchKey"/>
  20.                
  21.             </div>
  22.         </div>
  23.         <table style="width: 800px; margin-left: auto; margin-right: auto;" border="1">
  24.             <header>
  25.                 <tr>
  26.                     <td>序号</td>
  27.                     <td>名称</td>
  28.                     <td>价格</td>
  29.                     <td>操作</td>
  30.                 </tr>
  31.             </header>
  32.         <tbody>
  33.             <tr v-for="item in search(searchKey)" :key="item.id">
  34.                 <td>{{ item.id }}</td>
  35.                 <td>{{ item.name }}</td>
  36.                 <td>{{ item.price }}</td>
  37.                 <!-- .prevent阻止事件的默认行为,这里是阻止超链接默认的跳转功能-->
  38.                 <td><a href="" @click.prevent="del(item.id)">删除</a></td>
  39.             </tr>
  40.         </tbody>
  41.       </table>
  42.     </div>
  43.     <script type="text/javascript">
  44.         var vm = new Vue({
  45.             el : "#app",
  46.             data:{
  47.                 id:'',
  48.                 name:'',
  49.                 searchKey:'',
  50.                 list:[
  51.                     {id:1,name:'T恤',price:100},
  52.                     {id:2,name:'西装',price:500},
  53.                     {id:3,name:'连衣裙',price:200},
  54.                     {id:4,name:'衬衫',price:150}
  55.                 ]
  56.             },
  57.             methods:{
  58.                 add(){
  59.                         //将表单中的数据组装为一个商品对象
  60.                     var good = {
  61.                             id:this.id,
  62.                             name:this.name,
  63.                             price:this.price
  64.                         };
  65.                     //存入list中
  66.                     this.list.push(good);
  67.                     //将表单数据清空
  68.                     this.id = this.name = this.price='';
  69.                 },
  70.                 del(id){
  71.                         //遍历查询
  72.                     var index = this.list.findIndex( item => {
  73.                         if(id == item.id){
  74.                             return true;
  75.                         }
  76.                     });
  77.                     this.list.splice(index,1);//JavaScript中的splice(index,i)方法:从已知数组的index下标开始,删除i个元素
  78.                 },
  79.                 search(searchKey){
  80.                         //filter() 方法创建一个新的数组,新数组中的元素是数组中符合条件的所有元素组合而成
  81.                     return this.list.filter(item => {
  82.                         if(item.name.includes(searchKey)){
  83.                             return item;
  84.                         }
  85.                     });
  86.                 }
  87.             }
  88.         })
  89.     </script>
  90. </body>
  91. </html>
复制代码
测试效果:




8.Template 标签

  1. template的作用是模板占位符,可帮助我们包裹元素,但在循环过程当中,template不会被渲染到页面上
复制代码
比如:
  1. <div v-for="value in user">{{value}}</div>
复制代码
这个循环是做在div上面的,如果须要循环的内容很多,比如span标签也要做这个循环
  1. <div v-for="value in user">{{value}}</div>
  2. <span v-for="value in user">{{value}}</span>
复制代码
则须要把循环提出来,但这样会多一个div标签
  1. <div v-for="value in user">
  2.     <div>{{value}}</div>
  3.     <span>{{value}}</span>
  4. </div>
复制代码
如果不想多一个标签,可以用template,template不会渲染到页面上
  1. <template v-for="value in user">
  2.     <div>{{value}}</div>
  3.     <span>{{value}}</span>
  4. </template>
复制代码
别的,template可以用到制作模板。
方法1:直接在vue对象中界说
  1. <!DOCTYPE html>
  2. <html>
  3.         <head>
  4.                 <meta charset="UTF-8">
  5.                 <title></title>
  6.                 <script type="text/javascript" src="js/vue.js" ></script>
  7.         </head>
  8.         <body>
  9.    <!--这里会显示template里的内容-->
  10.         <div id="app">
  11.           
  12.         </div>
  13.        
  14.         <script>
  15.             var  v = new Vue({
  16.                 el:"#app",
  17.                 data:{
  18.                     msg:"daimenglaoshi"
  19.                 },
  20.                 template:"<div>{{msg}}</div>"//模板中只能有一个根元素
  21.             });
  22.         </script>
  23.         </body>
  24. </html>
复制代码
方法2:写在template标签里
  1. <!DOCTYPE html>
  2. <html>
  3.         <head>
  4.                 <meta charset="UTF-8">
  5.                 <title></title>
  6.                 <script type="text/javascript" src="js/vue.js" ></script>
  7.         </head>
  8.         <body>
  9.                
  10.                
  11.         <!--这里会显示template标签里的内容-->
  12.         <div id="app"></div>
  13.        
  14.         <!--此处template标签必须在vue绑定的元素外面定义,并且在页面中不显示下面的template标签中的内容-->
  15.         <template id="temp">
  16.             <div>{{msg}}<div>          
  17.         </template>
  18.        
  19.         <script>
  20.             let vm = new Vue({
  21.                 el:"#app",
  22.                 data:{
  23.                     msg:"daimenglaoshi"
  24.                 },
  25.                 //通过该属性可以将自定义的template属性中的内容全部替换app的内容,并且会覆盖里面原有的内容,并且在查看dom结构时没有template标签
  26.                 template:"#temp"
  27.              
  28.             });
  29.         </script>               
  30.         </body>
  31. </html>
复制代码
方法3:写在script标签里
  1. <!DOCTYPE html>
  2. <html>
  3.         <head>
  4.                 <meta charset="UTF-8">
  5.                 <title></title>
  6.                 <script type="text/javascript" src="js/vue.js" ></script>
  7.         </head>
  8.         <body>
  9.         <div id="app"></div>
  10.        
  11.         <script type="x-template" id="temp">
  12.        <div>{{msg}}</div>
  13.    </script>
  14.        
  15.         <script>
  16.             var  v = new Vue({
  17.                 el:"#app",
  18.                 data:{
  19.                     msg:"daimenglaoshi"
  20.                 },
  21.                 template:"#temp"//模板中只能有一个根元素
  22.             });
  23.         </script>
  24.         </body>
  25. </html>
复制代码
来源:https://blog.csdn.net/daimenglaoshi/article/details/128349178
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则