05-vue表单绑定与购物车实例

Posted Ultraman_agul

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了05-vue表单绑定与购物车实例相关的知识,希望对你有一定的参考价值。

vue表单绑定与购物车实例

1.1 v-model在复选框中的使用

在复选框中使用v-model指令,一般会作用在一个数组上。

<div id="box">
  <!-- 
      v-model="checkArray": 
      checkArray:为数组,所有选中的checkbox的value都会添加到数组中,取消选中时会自动从数组中删除该value。
      注意:这里一定要给checkbox添加上value属性
  -->
  <input type="checkbox" v-model="checkArray" value="vue"/>vue
  <input type="checkbox" v-model="checkArray" value="react"/>react
  <input type="checkbox" v-model="checkArray" value="node"/>node
  <input type="checkbox" v-model="checkArray" value="js"/>js
  <button @click="login()">提交</button>
</div>
<script>
  var vm = new Vue({
      el:"#box",
      data : {
          checkArray:[] //接收选中的checkbox的value
      },
      methods : {
          login(){
              console.log(this.checkArray);
          }
      }
  })
</script>

运行效果

1.2 v-model在单选框中的使用

在单选框中使用v-model指令,模型定义为一个字符串即可。

<div id="app">
  <form action="">
      <input type="radio" v-model='selectedValue' name="football" id="" value='足球'>足球
      <input type="radio" v-model='selectedValue' name="basketball" id="" value='篮球'>篮球
      <input type="radio" v-model='selectedValue' name="ppball" id="" value='乒乓球'>乒乓球
      <input type="radio" v-model='selectedValue' name="ymball" id="" value='羽毛球'>羽毛球
  </form>
  <button @click='showData'>按钮</button>
</div>
<script src='./js/vue.js'></script>
<script>
  new Vue({
      el: '#app',
      data: {
          selectedValue: ''
      },
      methods: {
          showData() {
              console.log(this.selectedValue)
          }
      },
  })
</script>

运行效果

1.3 综合案例:购物车

<!DOCTYPE html>
<html lang="en">
<head>
   <meta charset="UTF-8">
   <meta name="viewport" content="width=device-width, initial-scale=1.0">
   <title>Document</title>
       <!-- 引入vue.js -->
   <script src="js/vue.js"></script>
   <style>
       #box ul{
           list-style: none;
           width: 60%;
           margin: auto;
           border: 1px solid black;
           padding: 10px;
       }
       #box ul li{
           display: flex;
           justify-content: space-around;
           margin-top: 10px;
           border-bottom: 1px dashed #cccccc;
       }
       #box ul li:last-child{
           border-bottom: none;
       }
       #box ul li img{
           width: 100px;
       }
       .all{
           width: 60%;
           margin: auto;
       }
   </style>
</head>
<body>
   <div id="box">
       <div class="all" v-if="list.length === 0">购物车空空如也</div>
       <template v-else>
           <div class="all"><input type="checkbox" v-model="isChecked" @change="allCheck()">全选|全不选</div>
               <ul>
                   <li v-for="(item,index) in list" :key="item.id">
                       <div>
                           <!-- 将事件商品对象item绑定到value中,当选中当前商品时,item作为元素保存在checkGroup数组中,方便后面计算时使用 -->
                           <input type="checkbox" v-model="checkGroup" :value="item" @change="isAllCheck()"/>
                       </div>
                       <div>
                           <img :src="item.pic" alt="">
                       </div>
                       <div>
                           <div>名称:{{item.name}}</div>
                           <div>价格:¥{{item.price}}</div>
                       </div>
                       <div>
                           <button @click="item.number--" :disabled="item.number===1">-</button>
                           <span>{{item.number}}</span>
                           <button @click="item.number++" :disabled="item.number===item.limit">+</button>
                       </div>
                       <div>
                           <button @click="deleteGood(index,item.id)">删除</button>
                       </div>
                   </li>
               </ul>
               <div class="all">总金额: {{totalPrice()}}</div>
       </template>      
   </div>
   <script>
       var vm = new Vue({
           el:"#box",
           data:{
               isChecked:false,
               checkGroup:[],
               list:[
                   {
                       name:"商品1",
                       price:10,
                       number:1,
                       id:1,
                       limit:5,//限购
                       pic:"https://ss2.bdstatic.com/70cFvnSh_Q1YnxGkpoWK1HF6hhy/it/u=1689157983,3552298815&fm=26&gp=0.jpg"
                   },
                   {
                       name:"商品2",
                       price:20,
                       number:5,
                       id:2,
                       limit:8,//限购
                       pic:"https://ss2.bdstatic.com/70cFvnSh_Q1YnxGkpoWK1HF6hhy/it/u=1689157983,3552298815&fm=26&gp=0.jpg"
                   },
                   {
                       name:"商品3",
                       price:30,
                       number:10,
                       id:3,
                       limit:15,//限购
                       pic:"https://ss2.bdstatic.com/70cFvnSh_Q1YnxGkpoWK1HF6hhy/it/u=1689157983,3552298815&fm=26&gp=0.jpg"
                   },
                   {
                       name:"商品4",
                       price:8,
                       number:6,
                       id:4,
                       limit:18,//限购
                       pic:"https://ss2.bdstatic.com/70cFvnSh_Q1YnxGkpoWK1HF6hhy/it/u=1689157983,3552298815&fm=26&gp=0.jpg"
                   },
                   {
                       name:"商品5",
                       price:14,
                       number:2,
                       id:5,
                       limit:7,//限购
                       pic:"https://ss2.bdstatic.com/70cFvnSh_Q1YnxGkpoWK1HF6hhy/it/u=1689157983,3552298815&fm=26&gp=0.jpg"
                   }
               ]
           },
           methods:{
               totalPrice(){
                   var total = 0;
                   this.checkGroup.forEach((ele)=>{
                       total += ele.price * ele.number;
                   })
                   return total
               },
               //删除商品
               deleteGood(index,goodId){
                   //删除原商品
                   this.list.splice(index,1);
                   //更新选中的商品
                   this.checkGroup = this.checkGroup.filter(ele => ele.id !== goodId)
                   //删除单个商品时也要检测是否全部被选中
                   this.isAllCheck();
               },
               //全选全不选
               allCheck(){
                   if(this.isChecked){
                       this.checkGroup = this.list
                   }else{
                       this.checkGroup = [];
                   }
               },
               //选择单个商品时,判断是否为全部选中
               isAllCheck(){
                   if(this.checkGroup.length === this.list.length){
                       this.isChecked = true;
                   }else{
                       this.isChecked = false;
                   }
               }
           }
       })
   </script>
</body>
</html>

1.4 表单修饰符:

  • .lazy:失去焦点时再更新数据
<div id="box">
    <!-- .lazy:失去焦点后才更新myVal的值 -->
    <input type="text" v-model.lazy="myVal">|{{myVal}}|
    <button @click="handelTest()">test</button>
</div>
<script>
    var vm = new Vue({
        el:"#box",
        data:{
            myVal : 8
        },
        methods:{
            handelTest(){
                console.log(this.myVal);
                console.log(typeof this.myVal);
            } 
        }
    })
</script>

  • .number:将value转换成number类型的值
 <div id="box">
      <!-- .number修饰符,将input的value转换成了数字 -->
      <input type="text" v-model.number="myVal">|{{myVal}}|
      <button @click="handelTest()">test</button>
  </div>
  • .trim:去年value前后空格
  <div id="box">
      <input type="text" v-model.trim="myVal">|{{myVal}}|
      <button @click="handelTest()">test</button>
  </div>

以上是关于05-vue表单绑定与购物车实例的主要内容,如果未能解决你的问题,请参考以下文章

05-vue表单绑定与购物车实例

05.vue-charp-05 内置指令

05Vue 之 实例详解与生命周期

05《Vue 入门教程》Vue 动态样式绑定

Vue实现购物小球抛物线的方法实例

AngularJS入门学习笔记一