Vue学习第二天

235 阅读2分钟

指令修饰符

通过‘.’指明一些指令后缀,不同后缀封装了不同的处理操作——>简化代码

  1. 按键修饰符

@keyup.enter="",键盘回车监听

keyup键盘弹起,加上enter就是回车弹起

  1. v-model修饰符
  • v-model.trim,去除首尾空格
  • v-model.number,转数字
  1. 事件修饰符 冒泡是默认存在的(点击子盒子,父盒子也会触发)
  • @事件名.stop,阻止冒泡
  • @事件名.prevent,阻止默认行为

v-bind操作class和style

可针对 class类名 和 style行内样式 进行控制

操作class

  • :class="传对象/数组"

  • 传对象:适用于一个类名,来回切换
  • 传数组:适用于批量添加或删除类

传对象:京东导航栏点击高亮显示

<div id="app">
    <ul>
      <li v-for="(item,index) in list" :key="item.id" @click="activeIndex=index"><a :class="{active:index===activeIndex}" href="#">{{item.name}}</a></li>
    </ul>
  </div>
  <script src="./vue.js"></script>
  <script>
    const app = new Vue({
      el: '#app',
      data: {
        activeIndex:0,
        list: [
          { id: 1, name: '京东秒杀' },
          { id: 2, name: '每日特价' },
          { id: 3, name: '品类秒杀' }
        ]

      }
    })

操作style

  • :style="样式对象"

  • 适用于:某个具体属性的动态设置

进度条样式

<div id="app">
    <div class="progress">
      <div class="inner" :style="{width:percent+'%'}">
        <span>{{percent}}%</span>
      </div>
    </div>
    <button @click="percent=25">设置25%</button>
    <button @click="percent=50">设置50%</button>
    <button @click="percent=75">设置75%</button>
    <button @click="percent=100">设置100%</button>
  </div>
  <script src="./vue.js"></script>
  <script>
    const app = new Vue({
      el: '#app',
      data: {
        percent:30
      }
    })
  </script>

计算属性

计算属性默认的简写

  • 基于现有的数据,计算出来的新属性。当其中依赖的数据变化,自动重新计算。
  • 语法:
    • 1.声明在computed配置项中,一个计算属性对应一个函数
      • 计算属性这个函数内部,可以直接通过this访问到data里实例
    • 2.使用起来和普通属性一样使用{{计算属性名}} ​
computed:{
        totalCount(){
          // 需求:对this.list数组里的num进行求和,用reduce
          let total=this.list.reduce((sum,item)=>sum+item.num,0)
        }
      }

计算属性的完整写法

计算属性默认简写,只能读取访问,不能“修改”

  • 默认简写是将属性写成了一个方法,而完整写法则需将属性写成一个对象 ​

一旦修改赋值,执行set,set括号里要传参

综合案例——成绩表单

<div id="app" class="score-case">
      <div class="table">
        <table>
          <thead>
            <tr>
              <th>编号</th>
              <th>科目</th>
              <th>成绩</th>
              <th>操作</th>
            </tr>
          </thead>
          <tbody v-if="list.length>0">
            <tr v-for="(item,index) in list" :key="item.id">
              <td>{{index+1}}</td>
              <td>{{item.subject}}</td>
              <td :class="{red:item.score<60}">{{item.score}}</td>
              <td><a href="#" @click.prevent="del(item.id)">删除</a></td>
            </tr>
            
          </tbody>
          <tbody v-else>
            <tr>
              <td colspan="5">
                <span class="none">暂无数据</span>
              </td>
            </tr>
          </tbody>

          <tfoot>
            <tr>
              <td colspan="5">
                <span>总分:{{totalCount}}</span>
                <span style="margin-left: 50px">平均分:{{average}}</span>
              </td>
            </tr>
          </tfoot>
        </table>
      </div>
      <div class="form">
        <div class="form-item">
          <div class="label">科目:</div>
          <div class="input">
            <input
              type="text"
              placeholder="请输入科目"
              v-model.trim="subject"
            />
          </div>
        </div>
        <div class="form-item">
          <div class="label">分数:</div>
          <div class="input">
            <input
              type="text"
              placeholder="请输入分数"
              v-model.number="score"
            />
          </div>
        </div>
        <div class="form-item">
          <div class="label"></div>
          <div class="input">
            <button class="submit"  @click="add">添加</button>
          </div>
        </div>
      </div>
    </div>
    <script src="../vue.js"></script>

    <script>
      const app = new Vue({
        el: '#app',
        data: {
          list: [
            { id: 1, subject: '语文', score: 50 },
            { id: 7, subject: '数学', score: 95 },
            { id: 12, subject: '英语', score: 70 },
          ],
          subject: '',
          score: ''
        },
        methods:{
          del(id){
            this.list=this.list.filter(item=>item.id != id)
          },
          add(){
            if(!this.subject){
              alert("请输入科目")
              return
            }
            if(typeof this.score !=='number'){
              alert("请输入正确的成绩")
            }
            this.list.unshift({
              id:+new Date(),
              subject:this.subject,
              score:this.score
            })
            this.subject=''
            this.score=''
          }
        },
        computed:{
          totalCount(){
          return this.list.reduce((sum,item)=>sum+item.score,0)
        },
        average(){
          if(this.list.length===0){
            return 0
          }
          return (this.totalCount/this.list.length).toFixed(2)
        }
        }
      })
    </script>

watch侦听器(监视器)

  • 作用:监视数据变化,执行一些业务逻辑或异步操作
  • 语法结构:
    • 简单写法
      • 如果只需要新值,也可以只写一个参数
      • 需要监视谁,就往watch里写谁
      • 如果需要监视一个子属性,在watch里打点的时候就必须用引号括住 ​
    • 完整写法——>添加额外配置项
      • deep:true,对复杂类型深度监视
      • immediate:true,立刻执行,初始化立刻执行一次handler方法 ​