Vue 指令

一、指令—directive

1. v-bind

  • 属性和数据进行绑定
  • 举例: 表单的value属性和一个数据绑定
<input type="text" v-bind:value = "msg">
<!-- 简写 -->
<input type="text" :value = "msg">
  • 说法: 绑定一个数据在某一个属性身上

2. v-bind 【 单向数据绑定 】

  • 绑定类名 绑定样式
    • 为什么要绑定?
    • 答: 通过操作数据就可以改变V中dom的样式,相当于操作了dom
类名的绑定 【 两种写法 】
  • 数组的写法 【 兵哥推荐 】
    <h4> 类名绑定 - 数组写法 </h4>
    <p :class = "['size','bg']"></p>
    <p :class = "[size,bg]"></p>
    
  • 对象的写法
    <h3> v-bind 绑定类名 </h3>
    <h4> 类名绑定 - 对象写法 </h4>
    <p class = "size bg"> </p>
    <p :class = "{size: true,bg: true}"></p>
    <p :class = "{[size]: true,[bg]: true}"></p>
    
样式的绑定
  • 数组的写法 【 兵哥推荐 】
    <h4> 样式绑定 - 数组写法 </h4>
    <p :style = "[{width: '100px',height: '100px'},{background: 'pink'}]"></p>
    <p :style = "[ styleObj,styleColor ]"></p>
    
  • 对象的写法
    <h4> 样式绑定 - 对象  </h4>
    <p style = "width: 100px;height: 100px;background: green;"></p>
    <p :style = "{width: '100px',height: '100px',background: 'blue'}"></p>
    <p :style = "{width: w,height: h,background: backg}"></p>
    
总结

<!-- 总结:  项目中使用 -->
<p :class = "{[size]: true,[bg]: true}"></p>
<p :class = "[ size,bg ]"></p>

<!-- 引深: 灵活使用 -->
<h4> 引深 </h4>
<p :class = "{ [size]: flag,[bg]: flag}" ></p>
<p :class = "[ size, flag?bg:color ]"></p>
<p :class = "[ size, flag && bg || color ]"></p>

<h4> 更神奇的 </h4>
<p class = "text" :class = [size,bg]></p>

<h4> v-bind 可以绑定任意一个dom身上的属性 </h4>
<img :src="imgUrl" alt="">
对应的Vue实例
new Vue({
    el: '#app', //  挂载
    data: {
      imgUrl: 'https://www.baidu.com/img/bd_logo1.png',
      msg: 'hello  各位今天周四了',
      size: 'size',
      bg: 'bg',
      flag: true,
      color: 'color',
      w: '100px',
      h: '100px',
      backg: 'blue',
      styleObj: {
        width: '100px',
        height: '100px'
      },
      styleColor: {
        background: 'yellow'
      }
    }
  })

3. v-model 【 双向数据绑定 】

  • 单向 【 数据改变, 视图改变 】
  • 双向 【数据改变, 视图改变,反之,视图改变,数据改变 】
  • v-model默认绑定表单元素的value值
    • form 表单标签
    • input textarea … 表单元素
  • html代码
<h3> v-model 双向数据绑定 </h3>
<input type="text" v-model = "msg">
  • 对应的js
new Vue({
    el: '#app', //  挂载
    data: {
        msg: '老彭很帅'
    }
})
思考: 如何使用单向数据绑定实现双向数据绑定效果
  • 知识点
input身上有哪些事件?
    focus
    blur
    change
    input

事件有几种绑定形式
    1. js中绑定
    var input = document.querySelector('input')
    input.oninput = function () {}
    DOM2级事件   事件监听

    1. html结构中绑定
    function load () {}

vue中事件绑定形式选择2

事件包含哪几个部分?
    事件源
    事件类型
    事件处理程序

vue中事件格式: 
    举例:  <div v-on:eventType = '事件处理程序'></div>
  • html代码
<input type="text" :value = "msg" v-on:input = "change">
<!-- 简写 -->
<input type="text" :value = "msg" @input = "change">
  • js代码
new Vue({
    el: '#app', //  挂载
    data: {
        msg: '老彭很帅'
    },
    methods: {
        //事件处理程序
        change: function ( e ) {
        this.msg = e.target.value
        }
    }
})

4. v-on 事件

vue中写事件,记住先写逻辑在绑定

  • 基础事件绑定
// html代码
<button @click = "fn"> 点击 </button>

// js代码
new Vue({
    el: '#app',
    methods: {
        fn () {
            alert('老彭最帅')
        }
    }
})
  • 事件传参
    • 业务: 点击button按钮,弹出input的value
    • 经验: 看到表单,想要得到它的value值,直接v-model
    // html
    <input type="text" v-model = "val">
    <button @click = "fn( val )"> 点击 </button>
    
    //js
    new Vue({
        el: '#app',
        data: {
            val: ''
        },
        methods: {
            fn ( val ) {
                alert( val )
            }
        }
    })
    
  • 事件对象
    • 业务: 如果我们的fn函数接收2个参数,其中一个参数是事件对象,这个时候我们看一下效果
    • 问题: 事件对象e丢失了
    • 解决: 在调用方法时,传入一个实际参数: $event
    // html
    <input type="text" v-model = "val">
    <button @click = "fn( $event,val )"> 点击 </button>
    
    // js
    new Vue({
        el: '#app',
        data: {
            val: ''
        },
        methods: {
            fn ( e,val ) {
                console.log( val )
                console.log( e )
            }
        }
    })
    
  • 为什么要使用?【 案例: 事件冒泡 】
    • 业务: 给每一个盒子都加一个事件
    // html
    <div class="large" @click = "largeHandler">
        <div class="middle" @click = "middleHandler">
            <div class="small" @click = "smallHandler"></div>
        </div>
    </div>
    
    // js
    new Vue({
        el: '#app',
        methods: { //方法: 里面存放的是: 事件处理程序
            largeHandler ( e ) {
                e.stopPropagation()
                alert( 'large' )
            },
            middleHandler ( e ) {
                alert( 'middle' )
                e.stopPropagation()
            },
            smallHandler ( e ) {
                alert( 'small' )
                e.stopPropagation()
            }
        }
    })
    
    • 事件修饰符

      • 常用 .stop(阻止事件冒泡) .capture(阻止事件捕获) .self(只执行自己的事件,同.stop) .prevent(阻止默认行为)
      // html
      <div class="large" @click.stop = "largeHandler">
          <div class="middle" @click.stop = "middleHandler">
              <div class="small" @click.stop = "smallHandler"></div>
          </div>
      </div>
      <hr>
      <div class="large" @click.self = "largeHandler">
          <div class="middle" @click.self = "middleHandler">
              <div class="small" @click.self = "smallHandler"></div>
          </div>
      </div>
      
      // js
      new Vue({
          el: '#app',
          methods: { //方法: 里面存放的是: 事件处理程序
              largeHandler ( e ) {
                  alert( 'large' )
              },
              middleHandler ( e ) {
                  alert( 'middle' )
              },
              smallHandler ( e ) {
                  alert( 'small' )
              }
          }
      })
      
    • 按键修饰符

      • 业务: 按回车弹出input框的value

      • 键盘事件: keyup keydown keypress

      • 常用 .enter .tab .delete(删除以及退格) .esc .space

      • 鼠标 .left .middle .right

      • 事件对象实现

      // html
      <input type="text" @keyup = "fn( val,$event )" v-model = 'val'>
      
      // js
      fn ( val,e ) {
          if ( e.keyCode === 13 ) {
              console.log( val )
          }
      }
      
      • 按键修饰符实现
      // html
      <input type="text" @keyup.13 = "fn( val )" v-model = 'val'>
      <hr>
      <input type="text" @keyup.enter = "fn( val )" v-model = 'val'>
      <hr>
      <input type="text" @keyup.p = "fn( val )" v-model = 'val'>
      
      // js
      new Vue({
          el: '#app',
          data: {
              val: ''
          },
          methods: {
              fn ( val ) {
                  console.log( val )
              }
          }
      })
      
  • 思考: MVVM架构思想,是将逻辑放在VM中来做,V是用来展示视图的

二、模板语法 mustache 【 双大括号 】

  • 支持度

  • 支持数据类型

  • 所有的类型都是支持的,但是console.log alert这些输出语法是不支持的

  • 支持return

  • 数据类型有哪些?【 2种说法 】

    1. 第一种类型说法
      • 初始数据类型: number string null undefined boolean
      • 引用数据类型: object
    2. 第二种说法
      • 基本数据类型L: number string boolean
      • 复杂数据类型: object
      • 特殊数据类型: null undefined
  • html代码

<p> number: {{ num }} </p>
<p> string: {{ str }} </p>
<p> boolean: {{ bool && 1 || 2 }}</p>
<p> null: {{ nul && 3 || 4 }}</p>
<p> undefined: {{ und && 5 || 6 }}  </p>
<p> array: {{ arr[1] }}</p>
<p> object: {{ obj.name }}</p>
<!-- <p> function: {{ ( function() { console.log('fn')} )() }}</p> -->
  • js代码
new Vue({
    el: '#app',
    data: {
        num: 10,
        str: 'Gabriel Yan',
        bool: true,
        nul: null,
        und: undefined,
        arr: [1,2,3],
        obj: {
        name: '老彭'
        }
    }
})

三、method 方法

  1. 用来存储事件处理程序

四、computed 计算属性

  1. 为什么要有这个选项?

    • 案例: 【 字符串反向 】
    • 业务:将msg这个字符串 反向 输出
    • 思路: 反向 reverse 数组
    • 思考: V应该是用于数据展示,但是我们这么处理,发现V做了一部分逻辑判断,又违背了MVVM
    • 解决: 计算属性
    • html代码
    // 普通实现
    {{ msg.split('').reverse().join('') }}
    // 计算属性实现 逻辑和数据分离
    <p> {{ newMsg }} </p>
    
    • js代码
    new Vue({
        el: '#app',
        data: {
            msg: 'I Love eat 葡萄 '
        },
        computed: {
            //计算属性中存放的都是方法
            newMsg () {
            return this.msg.split('').reverse().join('')
            }
        }
    })
    
  2. 计算属性是一个 选项, 选项值是一个对象,对象中存放的是方法

    • 方法必须要有返回值
  3. 计算属性的使用

    • 直接将方法名当做全局变量一样直接使用
      <p> {{ newMsg }} </p>
  4. 总结: 什么时候使用计算属性?

    • 满足两个条件即可
      • 必须有逻辑处理,还有返回值
      • 我们使用的结果,要当做全局变量一样使用
  5. 计算属性一旦确定就不可更改了

  6. 案例联系计算属性

    • 用户名书写
    • 通过上面的案例我们知道了,计算属性还可以使用getter和setter
        computed: {
        fullName: {
            get () { //getter
            return this.firstName + this.lastName
            },
            set ( val ) { //val就是当前绑定元素的value值
            // val  彭少华
            this.firstName = val.slice( 0,1 )
            this.lastName = val.slice( 1 )
            }
        }
        }
    
    • 或者
    new Vue({
        el: '#app',
        data: {
            firstName: '',
            lastName: ''
        },
        computed: {
            fullName () {
                return this.firstName + this.lastName
            }
        }
    })
    

五、watch 侦听属性

计算属性优于侦听器

  1. 以案例来学习watch - > 用户名写入
  2. watch是一个选项, 选项值是一个对象
    • 对象中可以存放的类型有哪些
    • { [key: string]: string | Function | Object | Array }
    • 常用的是方法和对象
  3. 总结:
    由一个数据改变,引起的新的数据请求
  • js代码如下
new Vue({
    el: '#app',
    data: {
        firstName: '',
        lastName: '',
        fullName: ''
    },
    watch: { // 侦听 谁?      谁 -> 指的是data中的数据
        // watch中可以存放方法 
        firstName ( val ) {
        // console.log('firstname改变了')
        this.fullName = val + this.lastName
        },
        lastName ( val ) {
        this.fullName = this.firstName + val
        },
        // fullName ( val ) {
        //   this.firstName = val.slice( 0,1 )
        //   this.lastName = val.slice( 1 )
        // }
        fullName: {
        deep: true, //深度监听
        handler ( val ) { // 处理程序
            this.firstName = val.slice( 0,1 )
            this.lastName = val.slice( 1 )
        }
        }
    }
})

    this.fullName = val + this.lastName
        },
        lastName ( val ) {
        this.fullName = this.firstName + val
        },
        // fullName ( val ) {
        //   this.firstName = val.slice( 0,1 )
        //   this.lastName = val.slice( 1 )
        // }
        fullName: {
        deep: true, //深度监听
        handler ( val ) { // 处理程序
            this.firstName = val.slice( 0,1 )
            this.lastName = val.slice( 1 )
        }
        }
    }
})

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值