Vue学习Day2——指令补充

一、指令修饰符

1、什么是指令修饰符?

​ 所谓指令修饰符就是通过“.”指明一些指令后缀 不同的后缀封装了不同的处理操作 —> 简化代码

2、按键修饰符

  • @keyup.enter —>当点击enter键的时候才触发

代码演示:

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" />
    <link rel="stylesheet" href="./css/index.css" />
    <title>记事本title>
head>
<body>


<section id="app">
    
    <header class="header">
        <h1>小凯的记事本h1>
        <input v-model:id="toName" @keyup.enter="add" placeholder="请输入任务" class="new-todo" />
        <button @click="add" class="add">添加任务button>
    header>
    
    <section class="main">
        <ul class="todo-list">
            <li class="todo" v-for="(item,index) in list" :key="item.id">
                <div class="view">
                    <span class="index">{{ index + 1 }}.span> <label>{{ item.name }}label>
                    <button class="destroy" @click="del(item.id)">button>
                div>
            li>
        ul>
    section>
    
    <footer class="footer" v-show="list.length > 0">
        
        <span class="todo-count">合 计:<strong> {{ list.length }}strong>span>
        
        <button class="clear-completed" @click="clear">
            清空任务
        button>
    footer>
section>


<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js">script>
<script>

    const app = new Vue({
        el: '#app',
        data: {
            toName: '',
            list: [
                {id: 1,name: '微服务学习'},
                {id: 2,name: 'SpringBoot从入门到精通'},
                {id: 3,name: 'SpringCloud'}
            ]
        },
        methods: {
            del(id){
                this.list = this.list.filter(item => item.id !== id)
            },
            add(){
                if (this.toName.trim()=== ''){
                    alert('请输入内容')
                    return
                }
                this.list.unshift({
                    id: +new Date(),
                    name: this.toName
                })
                this.toName=''
            },
            clear(){
                   this.list=[]
            }
        }
    })

script>
body>
html>

3、v-model修饰符

  • v-model.trim —>去除首位空格
  • v-model.number —>转数字

4、事件修饰符

  • @事件名.stop —> 阻止冒泡
  • @事件名.prevent —>阻止默认行为
  • @事件名.stop.prevent —>可以连用 即阻止事件冒泡也阻止默认行为
 <style>
    .father {
      width: 200px;
      height: 200px;
      background-color: pink;
      margin-top: 20px;
    }
    .son {
      width: 100px;
      height: 100px;
      background-color: skyblue;
    }
  style>

 <div id="app">
    <h3>v-model修饰符 .trim .numberh3>
    姓名:<input v-model="username" type="text"><br>
    年纪:<input v-model="age" type="text"><br>

    
    <h3>@事件名.stop     →  阻止冒泡h3>
    <div @click="fatherFn" class="father">
      <div @click="sonFn" class="son">儿子div>
    div>

    <h3>@事件名.prevent  →  阻止默认行为h3>
    <a @click href="http://www.baidu.com">阻止默认行为a>
  div>

  <script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js">script>
  <script>
    const app = new Vue({
      el: '#app',
      data: {
        username: '',
        age: '',
      },
      methods: {
        fatherFn () {
          alert('老父亲被点击了')
        },
        sonFn (e) {
          // e.stopPropagation()
          alert('儿子被点击了')
        }
      }
    })
  script>

二、v-bind对样式控制的增强-操作class

为了方便开发者进行样式控制, Vue 扩展了 v-bind 的语法,可以针对 class 类名style 行内样式 进行控制 。

1、语法:

<div> :class = "对象/数组">这是一个divdiv>

2、对象语法

当class动态绑定的是对象时,键就是类名,值就是布尔值,如果值是true,就有这个类,否则没有这个类

<div class="box" :class="{ 类名1: 布尔值, 类名2: 布尔值 }">div>

​ 适用场景:一个类名,来回切换

3、数组语法

当class动态绑定的是数组时 → 数组中所有的类,都会添加到盒子上,本质就是一个 class 列表

<div class="box" :class="[ 类名1, 类名2, 类名3 ]">div>

使用场景:批量添加或删除类

4、tab栏切换导航高亮案例

1.需求:

​ 当我们点击哪个tab页签时,哪个tab页签就高亮

2.实现






Vue学习Day2——指令补充_第1张图片

3.思路:

1.基于数据,动态渲染tab(v-for)

2.准备一个下标 记录高亮的是哪一个 tab

3.基于下标动态切换class的类名

三、v-bind对有样式控制的增强-操作style

1、语法

<div class="box" :style="{ CSS属性名1: CSS属性值, CSS属性名2: CSS属性值 }">div>

2、进度条案例

Vue学习Day2——指令补充_第2张图片

<style>
  .progress {
    height: 25px;
    width: 400px;
    border-radius: 15px;
    background-color: #272425;
    border: 3px solid #272425;
    box-sizing: border-box;
    margin-bottom: 30px;
  }
  .inner {
    width: 50%;
    height: 20px;
    border-radius: 10px;
    text-align: right;
    position: relative;
    background-color: #409eff;
    background-size: 20px 20px;
    box-sizing: border-box;
    transition: all 1s;
  }
  .inner span {
    position: absolute;
    right: -20px;
    bottom: -25px;
  }
style>

<div id="app">
  <div class="progress">
    <div class="inner" :style="{ width: percent + '%'}">
      <span>{{percent}}%span>
    div>
  div>
  <button @click="percent = 25">set25%button>
  <button @click="percent = 50">set50%button>
  <button @click="percent = 75">set75%button>
  <button @click="percent = 100">set100%button>
div>

<script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js">script>
<script>
  const app = new Vue({
    el: '#app',
    data: {
      percent: 0
    }
  })
script>

四、v-model在其他表单元素的使用

1、讲解内容:

常见的表单元素都可以用 v-model 绑定关联 → 快速 获取设置 表单元素的值

它会根据 控件类型 自动选取 正确的方法 来更新元素

输入框  input:text   ——> value
文本域  textarea	 ——> value
复选框  input:checkbox  ——> checked
单选框  input:radio   ——> checked
下拉菜单 select    ——> value
...

2、案例

Vue学习Day2——指令补充_第3张图片

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" />
  <link rel="stylesheet" href="./css/index.css" />
  <title>记事本title>
head>
<style>
  textarea {
    display: block;
    width: 240px;
    height: 100px;
    margin: 10px 0;
  }
style>
<div id="app">
  <h3>信息收集h3>
  姓名:
  <input type="text" v-model="username">
  <br><br>
  是否单身:
  <input type="checkbox" v-model="isSingle">
  <br><br>
  
  性别:
  <input v-model="gender" type="radio" name="gender" value="1"><input v-model="gender" type="radio" name="gender" value="2"><br><br>
  
  所在城市:
  <select v-model="cityId">
    <option value="101">合肥option>
    <option value="102">杭州option>
    <option value="103">苏州option>
    <option value="104">南京option>
  select>
  <br><br>
  自我描述:
  <textarea v-model="desc">textarea>
  <button>立即注册button>
div>
<script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js">script>
<script>
  const app = new Vue({
    el: '#app',
    data: {
      username: '',
      isSingle: false,
      gender: "2",
      cityId: '101',
      desc: ""
    }
  })
script>

五、computed计算属性

1、概念

基于现有的数据,计算出来的新属性依赖的数据变化,自动重新计算。

2、语法

  1. 声明在 computed 配置项中,一个计算属性对应一个函数
  2. 使用起来和普通属性一样使用 {{ 计算属性名}}

3、注意

  1. computed配置项和data配置项是同级
  2. computed中的计算属性虽然是函数的写法,但他依然是个属性
  3. computed中的计算属性不能和data中的属性同名
  4. 使用computed中的计算属性和使用data中的属性是一样的用法
  5. computed中计算属性内部的this依然指向的是Vue实例

4、案例

比如我们可以使用计算属性实现下面这个业务场景

DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Titletitle>
head>
<style>
    table {
        border: 1px solid #000;
        text-align: center;
        width: 240px;
    }
    th,td {
        border: 1px solid #000;
    }
    h3 {
        position: relative;
    }
style>

<div id="app">
    <h3>礼物清单h3>
    <table>
        <tr>
            <th>名字th>
            <th>数量th>
        tr>
        <tr v-for="(item, index) in list" :key="item.id">
            <td>{{ item.name }}td>
            <td>{{ item.num }}个td>
        tr>
    table>

    
    <p>礼物总数:{{ totalCount }} 个p>
div>
<script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js">script>
<script>
    const app = new Vue({
        el: '#app',
        data: {
            // 现有的数据
            list: [
                { id: 1, name: '篮球', num: 1 },
                { id: 2, name: '玩具', num: 2 },
                { id: 3, name: '铅笔', num: 5 },
            ]
        },
        computed: {
            totalCount(){
                let total =  this.list.reduce((sum,item) => sum + item.num,0)
                return total
            }
        }
    })
script>
html>

Vue学习Day2——指令补充_第4张图片

六、computed计算属性 与 methods方法的比较

1、computed计算属性

作用:封装了一段对于数据的处理,求得一个结果

语法:

  1. 写在computed配置项中
  2. 作为属性,直接使用
    • js中使用计算属性: this.计算属性
    • 模板中使用计算属性:{{计算属性}}

2、methods计算属性

作用:给Vue实例提供一个方法,调用以处理业务逻辑

语法:

  1. 写在methods配置项中
  2. 作为方法调用
    • js中调用:this.方法名()
    • 模板中调用 {{方法名()}} 或者 @事件名=“方法名”

3、计算属性的优势

  1. 缓存特性(提升性能)

    计算属性会对计算出来的结果缓存,再次使用直接读取缓存,依赖项变化了,会自动重新计算 → 并再次缓存

  2. methods没有缓存特性

  3. 通过代码比较

4、总结

1.computed有缓存特性,methods没有缓存

2.当一个结果依赖其他多个值时,推荐使用计算属性

3.当处理业务逻辑时,推荐使用methods方法,比如事件的处理函数

七、计算属性的完整写法

既然计算属性也是属性,能访问,应该也能修改了?

  1. 计算属性默认的简写,只能读取访问,不能 “修改”
  2. 如果要 “修改” → 需要写计算属性的完整写法

Vue学习Day2——指令补充_第5张图片




    
    改名卡


姓: + 名: = {{ fullName }}

八、watch侦听器(监视器)

1、作用:

监视数据变化,执行一些业务逻辑或异步操作

2、语法:

  1. watch同样声明在跟data同级的配置项中

  2. 简单写法: 简单类型数据直接监视

  3. 完整写法:添加额外配置项

    data: { 
      words: '苹果',
      obj: {
        words: '苹果'
      }
    },
    
    watch: {
      // 该方法会在数据变化时,触发执行
      数据属性名 (newValue, oldValue) {
        一些业务逻辑 或 异步操作。 
      },
      '对象.属性名' (newValue, oldValue) {
        一些业务逻辑 或 异步操作。 
      }
    }
    

3、watch侦听器

完整写法 —>添加额外的配置项

  1. deep:true 对复杂类型进行深度监听
  2. immdiate:true 初始化 立刻执行一次
data: {
  obj: {
    words: '苹果',
    lang: 'italy'
  },
},

watch: {// watch 完整写法
  对象: {
    deep: true, // 深度监视
    immdiate:true,//立即执行handler函数
    handler (newValue) {
      console.log(newValue)
    }
  }
}

1.简单写法

watch: {
  数据属性名 (newValue, oldValue) {
    一些业务逻辑 或 异步操作。 
  },
  '对象.属性名' (newValue, oldValue) {
    一些业务逻辑 或 异步操作。 
  }
}

2.完整写法

watch: {// watch 完整写法
  数据属性名: {
    deep: true, // 深度监视(针对复杂类型)
    immediate: true, // 是否立刻执行一次handler
    handler (newValue) {
      console.log(newValue)
    }
  }
}

你可能感兴趣的:(前端,vue.js,学习,javascript)