Vue-第二天

计算属性

1.指令修饰符

a.增加监听事件,也是要通过绑定的:

enter:封装了   if(e.key==='Enter')

b.格式转换:v-model.trim和v-model.number

c.v-model:去除空格和转数字

d.@click.stop:加了这个指令以后,父类方法就不会调用。

e.@click.prevent:组织默认事件(比如不让链接跳转)。

2.v-bind控制样式,数组和动态

class元素定义的时候用  。

布尔值可以用一个表达式动态渲染,这样就可以在页面中切换。

切换样式,其实就是在不断切换下标。

动态设置样式,和class相似:

适用于单个属性的控制。

JS对象不能有横杠

关于每个绑定这个可以看视频,记是记不住了

v-model:应用于其他元素

代码(更快的获取其他的值):

<!DOCTYPE html>

<html lang="en">

<head>

  <meta charset="UTF-8">

  <meta http-equiv="X-UA-Compatible" content="IE=edge">

  <meta name="viewport" content="width=device-width, initial-scale=1.0">

  <title>Document</title>

  <style>

    textarea {

      display: block;

      width: 240px;

      height: 100px;

      margin: 10px 0;

    }

  </style>

</head>

<body>

  <div id="app">

    <h3>小黑学习网</h3>

    姓名:

      <input type="text" v-model="username"> {{username}}

      <br><br>

    是否单身:

      <input type="checkbox" v-model="isSingle" @click="isSingle =!isSingle" > {{isSingle}}

      <br><br>

    <!--

      前置理解:

        1. name:  给单选框加上 name 属性 可以分组 → 同一组互相会互斥

        2. value: 给单选框加上 value 属性,用于提交给后台的数据

      结合 Vue 使用 → v-model

    -->

    性别:

      <input v-model="gender" type="radio" name = "gender" value="1">男

      <input v-model="gender" type="radio" name = "gender" value="2">女

      <br>

      {{gender}}

      <br>

    <!--

      前置理解:

        1. option 需要设置 value 值,提交给后台

        2. select 的 value 值,关联了选中的 option 的 value 值

      结合 Vue 使用 → v-model

    -->

    所在城市:

      <select v-model="cityId">

        <option value="1">北京</option>

        <option value="2">上海</option>

        <option value="3">成都</option>

        <option value="4">南京</option>

      </select>{{cityId}}

      <br><br>

    自我描述:

      <textarea v-model="desc"></textarea> {{desc}}

    <button>立即注册</button>

  </div>

  <script src="C:\Users\31127\Desktop\VueStudy\flash\vue.js"></script>

  <script>

    const app = new Vue({

      el: '#app',

      data: {

username:"",

isSingle:false,

gender:1,

cityId:1,

desc:""

      }

    })

  </script>

</body>

</html>

计算属性:

计算属性完整版

代码:

<body>

  <div id="app">

    姓:<input type="text" v-model="firstName">+

    名:<input type="text" v-model="lastName">=

    <span> {{fullName}}</span>

    <br><br>

    <button @click="changeName()">修改姓名</button>

  </div>

  <script src="C:\Users\31127\Desktop\VueStudy\flash\vue.js"></script>

  <script>

    const app = new Vue({

      el: '#app',

      data: {

   firstName:'刘',

   lastName:"备"

      },

      computed: {

          //  fullName(){

          //   return this.firstName+this.lastName

          //  }

          // 以下是完整写法  获取+设置

          fullName:{

             get(){

                    return this.firstName+this.lastName

             },

             //当fullName计算属性,被修改赋值

              set(value){

                   this.firstName= value.slice(0,1)

                   this.lastName = value.slice(1)

              }

          }

                         

      },

      methods: {

        changeName(){

          this.fullName ="吕小布"

        }

      }

    })

  </script>

</body>

3.Watch侦听器(监视器)

改我是改成功了   那这个Async有什么用???

完整写法:

代码:

4.案例:水果购物车

1.disabled

2.checked

3.every

4.reduce

代码:

<body>

  <div class="app-container" id="app">

    <!-- 顶部banner -->

    <div class="banner-box"><img src="C:\Users\31127\Desktop\VueStudy\img\fruit.jpg" alt="" /></div>

    <!-- 面包屑 -->

    <div class="breadcrumb">

      <span>🏠</span>

      /

      <span>购物车</span>

    </div>

    <!-- 购物车主体 -->

    <div class="main" v-if="fruitList.length>0">

      <div class="table">

        <!-- 头部 -->

        <div class="thead">

          <div class="tr">

            <div class="th">选中</div>

            <div class="th th-pic">图片</div>

            <div class="th">单价</div>

            <div class="th num-th">个数</div>

            <div class="th">小计</div>

            <div class="th">操作</div>

          </div>

        </div>

        <!-- 身体 -->

        <div class="tbody">

          <div v-for="(fruit,index) in fruitList" :key="fruit.id" class="tr" :class="{ active:fruit.isChecked }">

            <div class="td"><input type="checkbox" v-model="fruit.isChecked" /></div>

            <div class="td"><img :src=fruit.icon alt="" /></div>

            <div class="td">{{fruit.price}}</div>

            <div class="td">

              <div class="my-input-number">

                <!-- :disabled  不让其作用 -->

                <button class="decrease" :disabled="fruit.num<=1" @click="dec(fruit.id)"> - </button>

                <span class="my-input__inner">{{fruit.num}}</span>

                <button class="increase" @click="add(fruit.id)"> + </button>

              </div>

            </div>

            <div class="td">{{fruit.num*fruit.price}}</div>

            <div class="td"><button @click="del(fruit.id)">删除</button></div>

          </div>


 

        </div>

      </div>

      <!-- 底部 -->

      <div class="bottom">

        <!-- 全选 -->

        <label class="check-all">

          <input type="checkbox" v-model="isAll" />

          全选

        </label>

        <div class="right-box">

          <!-- 所有商品总价 -->

          <span class="price-box">总价&nbsp;&nbsp;:&nbsp;&nbsp;¥&nbsp;<span class="price">{{totalPrice}}</span></span>

          <!-- 结算按钮 -->

          <button class="pay">结算( {{totalCount}})</button>

        </div>

      </div>

    </div>

    <!-- 空车 -->

    <div class="empty" v-else>🛒空空如也</div>

  </div>

  <script src="C:\Users\31127\Desktop\VueStudy\flash\vue.js"></script>

  <script>

    const defaultFruits = [

      {

        id: 1,

        icon: 'C:\\Users\\31127\\Desktop\\VueStudy\\img\\火龙果.png',

        isChecked: false,

        num: 2,

        price: 6,

      },

      {

        id: 2,

        icon: 'C:\\Users\\31127\\Desktop\\VueStudy\\img\\荔枝.png',

        isChecked: false,

        num: 7,

        price: 20,

      },

      {

        id: 3,

        icon: 'C:\\Users\\31127\\Desktop\\VueStudy\\img\\榴莲.png',

        isChecked: false,

        num: 3,

        price: 40,

      },

      {

        id: 4,

        icon: 'C:\\Users\\31127\\Desktop\\VueStudy\\img\\鸭梨.png',

        isChecked: true,

        num: 10,

        price: 3,

      },

      {

        id: 5,

        icon: 'C:\\Users\\31127\\Desktop\\VueStudy\\img\\樱桃.png',

        isChecked: false,

        num: 20,

        price: 34,

      }

    ]

    const app = new Vue({

      el: '#app',

      data: {

        // 水果列表,一旦数组为空,则将其设为默认值。

        fruitList: JSON.parse(localStorage.getItem('list')).length == 0 ? defaultFruits : JSON.parse(localStorage.getItem('list')),

      },

      methods: {

        del(id) {

          this.fruitList = this.fruitList.filter(fruit => fruit.id != id)

        },

        dec(id) {

          const fruit = this.fruitList.find(fruit => fruit.id === id)

          fruit.num--

        },

        add(id) {

          const fruit = this.fruitList.find(fruit => fruit.id === id)

          fruit.num++

        },

      },

      watch: {

        fruitList: {

          deep: true,

          handler(newValue) {

            // 变化后的值存入本地,但是要转JSON

            localStorage.setItem('list', JSON.stringify(newValue))

          }

        }

      },

      computed: {

        // 完整写法 = get+set

        totalCount() {

          return this.fruitList.reduce((sum, fruit) => {

            if (fruit.isChecked) {

              return sum + fruit.num

            } else {

              return sum

            }

          }, 0)

        },

        totalPrice() {

          return this.fruitList.reduce((sum, fruit) => {

            if (fruit.isChecked) {

              return sum + fruit.num * fruit.price

            } else {

              return sum

            }

          }, 0)

        },

        isAll: {

          //必须所有的小选框都选中,才选中全选。--->every

          get() { return this.fruitList.every(fruit => fruit.isChecked) },

          // 基于拿到的布尔值同步小选框

          set(value) { return this.fruitList.forEach(fruit => fruit.isChecked = value) },


 

        }

      },

    })

  </script>

</body>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值