指令

指令

v-bind

  • 属性和数据进行绑定

  • 举例: 表单的value属性和一个数据绑定

  • 说法: 绑定一个数据在某一个属性身上

    <h4>属性和数据进行绑定</h4><input type="text" v-bind:value="msg"><!-- 简写 --><input type="text" :value="msg">
        
    new Vue({
                el:'#app',
                data:{
                    msg:'请输入',
                }
    })
    
  1. v-bind 【 单项数据绑定 】

    • 绑定类名 绑定样式

      • 为什么要绑定?

      • 答: 通过操作数据就可以改变V中dom的样式,相当于操作了dom

      • 类名的绑定 【 两种写法 】

        • 数组的写法 【 推荐 】
        <h4>类名绑定 - 数组写法</h4>
             <p :class="['size','bg']">vue</p><!-- 此时的size  和 bg 不是vue设置的 -->
             <p :class="[size2,bg2]">vue</p> 
        
        new Vue({
              el:'#app',
              data:{
                 size2:'size',
                 bg2:'bg',
                  }
        })
        
        • 对象的写法
        <h4>类名绑定 - 对象写法</h4>
           <p class="size bg">原生js书写</p> 
           <p :class="{size:true,bg:true}">vue</p><!-- 此时的size  和 bg 不是vue设置的 -->
           <p :class="{[size2]:true,[bg2]:true}">vue</p>
        
        new Vue({
              el:'#app',
              data:{
                 size2:'size',
                 bg2:'bg',
                  }
        })
        
      • 样式的绑定

        • 数组的写法 【 推荐 】
         <h4>样式绑定 - 数组</h4>
             <p style="width: 100px;height:100px;background:red">原生js书写</p>
             <p v-bind:style="[{width: '100px',height:'100px'},{background:'red'}]">vue</p>
              <!-- 简写 -->
              <p :style="[style1,bg1]">vue</p>
        new Vue({
              el:'#app',
              data:{
                style1:{
                            width:'100px',
                            height:'100px'
                        },
                        bg1:{
                            background:'yellow'
                        },
                  }
        })
        
        • 对象的写法
        <h4>样式绑定 - 对象</h4>   
        <p style="width: 100px;height:100px;background:red">原生js书写</p>
        <p v-bind:style="{width:'100px',height:'100px',background:'red'}">vue</p>
        <!-- 简写 -->
        <p :style="{width: w,height:h,background:bg}">vue</p> 
        
        
        new Vue({
              el:'#app',
              data:{
                 w:'100px',
                 h:'100px',
                 bg:'red',
                  }
        })
        

    总结:

    <!--总结  -->
            <!-- 对象的写法 -->
            <p :class="{[size2]:true,[bg2]:true}">vue</p>  <!-- vue下面定义size2和bg2 -->
            <!-- 数组的写法 -->
            <p :class="[size2,bg2]">vue</p> <!-- vue下面定义size2和bg2 -->
    new Vue({
          el:'#app',
          data:{
             size2:'size',
             bg2:'bg',
              }
    })
    

    引深:

    <!-- 引深: 灵活使用 -->
        <h4> 引深 </h4>
             <p :class="{[size2]:flage,[bg2]:flage}"></p>
             <p :class="[size2, flage?bg2:color]"></p><!-- 三目运算符  控制颜色 -->
             <p :class="[size2, flage&&bg2||color]"></p><!--短路原则 -->
        new Vue({
          el:'#app',
          data:{
             size2:'size',
             bg2:'bg',
              }
    })
    

    在已经有class的dom元素上 还可以使用v-bind添加类:

    <p class="text" :class="[size2,bg2]"></p> <!-- 结果 <p class="text size bg"></p> -->
        new Vue({
          el:'#app',
          data:{
             size2:'size',
             bg2:'bg',
              }
    })
    

    可以绑定任意一个dom身上的属性:

     <img :src="img" alt="">
     new Vue({
          el:'#app',
          data:{
     								       img:'https://ss0.baidu.com/73x1bjeh1BF3odCf/it/u=1681391545,4187928589&fm=85&s=0D803C72F2A477157583DA4D0300C0EE'
              }
    })
    
  2. v-model 【 双向数据绑定 】

    • 单向 【 数据改变, 视图改变 】v-bind

    • 双向 【数据改变, 视图改变,反之,视图改变,数据改变 】

    • v-model默认绑定表单元素的value值

      • form 表单标签
      • input textarea … 表单元素

      经验: 看到表单,想要得到它的value值,直接v-model

      <div id="app">
              <input type="text" v-model='msg'>
          </div>
          <script src="lib/vue.js"></script>
          <script>
              new Vue({
                  el:'#app',
                  data:{
                      msg:'请输入'
                  }
              })
      
    • 思考: 如何使用单向数据绑定实现双向数据绑定效果

      扩展:1:input身上有哪些事件?

      ​ 1:focus 2: blu人 3:change 4:input

      ​ 2:事件有几种绑定形式

      ​ 1. js中绑定

      ​ var input = document.querySelector(‘input’)

      ​ input.oninput = function () {}

      ​ addEventList()) DOM2级事件 事件监听

      ​ 2:html结构中绑定 function load () {}

      ​ (vue中事件绑定形式选择2)

      ​ 3:事件包含哪几个部分?

      ​ 事件源

      ​ 事件类型

      ​ 事件处理程序

      ​ 4:vue中事件格式:
      ​ 举例:

     vue中事件格式: 
          举例:  <div v-on:eventType = '事件处理程序'></div>
       */ -->
      <div id="app">
        <input type="text" :value="msg" v-on:input="abc">
        <!-- 简写 -->
        <input type="text" :value="msg" @input="abc">
      </div>
    </body>
    <script src="../../lib/vue.js"></script>
    <script>
      new Vue({
        el: '#app',
        data:{
            msg:'请输入'
        },
        methods:{
            //事件处理程序
            abc:function(e){
                this.msg=e.target.value
            }
        }
      })
    
  3. v-on 事件

    • 基础事件绑定
    <div id="app">
        <button  @click="fn">点击</button>
      </div>
    </body>
    <script src="../../lib/vue.js"></script>
    <script>
      new Vue({
        el: '#app',
        methods:{
          fn(){
            alert('你好')
          }
        }
      })
    
    • 事件传参
      <!-- 
        业务: 点击button按钮,弹出input的value 
    
        经验: 看到表单,想要得到它的value值,直接v-model 
    
        vue事件传参
       -->
      <div id="app" >
        <input type="text" v-model="msg">
        <button @click="ev(msg)">点击</button>
      </div>
    </body>
    <script src="../../lib/vue.js"></script>
    <script>
      new Vue({
        el: '#app',
        data:{
          msg:''
        },
        methods:{
          ev:function(msg){
           alert(msg)
          }
        }
      })
    
    • 事件对象
     <!-- 业务: 如果我们的fn函数接收2个参数,其中一个参数是事件对象,这个时事件对象e丢失了
        解决: 在调用方法时,传入一个实际参数: $event -->
      <div id="app">
        <input type="text" v-model="msg">
        <button @click="fn(msg,$event)">点击</button>
      </div>
    </body>
    <script src="../../lib/vue.js"></script>
    <script>
      new Vue({
        el: '#app',
        data:{
          msg:''
        },
        methods:{
          // fn(e){
          //   console.log(e)
          // }
          fn(val,e){//在调用方法时,传入一个实际参数: $event   如果不传   则输出的e为undefined
            console.log(val),
            console.log(e)
          }
        }
      })
    
    • 为什么要使用?【 案例: 事件冒泡 】 ( <!-- 给每盒子添加事件,会出现事件冒泡 ,解决:给每个事件添加阻止事件冒泡, 弊端:代码重复比较啊多,性能降低,因此使用修饰符来解决)
    <div id="app">
        <div class="box1" @click="box1">
          <div class="box2" @click="box2">
            <div class="box3" @click="box3"></div>
          </div>
        </div>
      </div>
    </body>
    <script src="../../lib/vue.js"></script>
    <script>
      new Vue({
        el: '#app',
        methods:{
          box1(e){
            e.stopPropagation()
            alert('box1')
          },
          box2(e){
            e.stopPropagation()
            alert('box2')
          },
          box3(e){
            e.stopPropagation()
            alert('box3')
          }
        }
      })
    
      • 事件修饰符

      1:为什么要用修饰符:答:给每盒子添加事件 问题:会出现事件冒泡

      ​ 解决:给每个事件添加阻止事件冒泡

      ​ 弊端:代码重复比较啊多,性能降低

      ​ 因此使用修饰符来解决

      2:事件修饰符:

      ​ .stop - 调用 event.stopPropagation()。

      ​ .prevent - 调用 event.preventDefault()。

      ​ .capture - 添加事件侦听器时使用 capture 模式。

      ​ .self - 只当事件是从侦听器绑定的元素本身触发时才触发回调。

      ​ .{keyCode | keyAlias} - 只当事件是从特定键触发时才触发回调。

      ​ .native - 监听组件根元素的原生事件。

      ​ .once - 只触发一次回调。

      ​ .left - (2.2.0) 只当点击鼠标左键时触发。

      ​ .right - (2.2.0) 只当点击鼠标右键时触发。

      ​ .middle - (2.2.0) 只当点击鼠标中键时触发。

      ​ .passive - (2.3.0) 以 { passive: true } 模式添加侦听器

       <!-- 阻止事件冒泡  修饰符 .stop  或者  .self-->
        <div id="app">
          <div class="box1" @click.stop="box1">
            <div class="box2" @click.stop="box2">
              <div class="box3" @click.stop="box3"></div>
            </div>
          </div>
          <hr>
          <div class="box1" @click.self="box1">
            <div class="box2" @click.self="box2">
              <div class="box3" @click.self="box3"></div>
            </div>
          </div>
        </div>
      </body>
      <script src="../../lib/vue.js"></script>
      <script>
        new Vue({
          el: '#app',
          methods: {
            box1(e) {
              alert('box1')
            },
            box2(e) {
              alert('box2')
            },
            box3(e) {
              alert('box3')
            }
          }
        })
      
      • 按键修饰符
      <!-- 按回车键弹出input的value -->
        <div id="app">
          <!-- 原生js写法 -->
          <!-- <input type="text" @keyup="click($event,msg)"> -->
      
          <hr>
      
          <!-- vue按键修饰符写法 -->
              <!-- 当按下回车键时弹出input的value   -->
              <input type="text" v-model="msg" @keyup.13="click(msg)">
              <!-- 或者 -->
              <input type="text" v-model="msg" @keyup.enter="click(msg)">
              <!-- 当按下键盘p时弹出input的value -->
              <input type="text" v-model="msg" @keyup.p="click(msg)">
        </div>
      </body>
      <script src="../../lib/vue.js"></script>
      <script>
        new Vue({
          el: '#app',
          data:{
            msg:''
          },
          
          methods:{
            // vue按键修饰符写法
            click(val){
                  alert(val)
            },
      
            // 原生js写法
            // click(e,val){
            //   if(e.KeyCode===13){
            //     alert(val)
            //   }
            // }
          }
      
      
        })
      
    • 思考: MVVM架构思想,是将逻辑放在VM中来做,V是用来展示视图的

  4. 模板语法 mustache 【 双大括号 】

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

    扩展:数据类型有哪些?【 2种说法 】

    ​ 1. 第一种类型说法

    ​ 初始数据类型: number string null undefined boolean

    ​ 引用数据类型: object(对象一般分为对象,数组,函数(在vue中函数不可以作为摸板输出))

    ​ 2. 第二种说法

    ​ 基本数据类型L: number string boolean

    ​ 复杂数据类型: object

    ​ 特殊数据类型: null undefined

    <div id="app">
        <p>num:{{num}}</p>
        <p>srt:{{srt}}</p>
        <p>nul:{{nul&&1||3}}</p>
        <p>und:{{und&&4||5}}</p>
        <p>blol:{{blol&&6||7}}</p>
        <p>obj:{{obj.name}}</p>
        <p>arr:{{arr[1]}}</p>
        <!-- <p>fun:{{(funtion(){aleret('1')})()}}</p>    报错-->  
      </div>
    </body>
    <script src="../../lib/vue.js"></script>
    <script>
      new Vue({
        el: '#app',
        data:{
          num:12,
          srt:'nihao',
          nul:null,
          und:undefined,
          blol:true,
          obj:{
            name:'张三'
          },
          arr:[1,2,3],
        }
      })
    

method 方法

  1. 用来存储事件处理程序 (有事件处理程序时用method)
<div id="app">
    <input type="text" :value="msg" v-on:input="abc">
    <!-- 简写 -->
    <input type="text" :value="msg" @input="abc">
  </div>
</body>
<script src="../../lib/vue.js"></script>
<script>
  new Vue({
    el: '#app',
    data:{
        msg:'请输入'
    },
    methods:{
        //事件处理程序
        abc:function(e){
            this.msg=e.target.value
        }
    }
  })

computed 计算属性

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

    答:V应该是用于数据展示,但是发现V做了一部分逻辑判断,违背了MVVM,所以使用计算属性。

    2:(计算属性中存放的都是方法 都有返回值 计算属性一旦确定就不可更改了 )

    • 案例: 【 字符串反向 】、
    <div id="app">
        {{msg.split('').reverse().join('')}}
        <!-- 使用计算属性    直接将方法名当做全局变量一样直接使用-->
        {{newMsg}} 
    
      </div>
    </body>
    <script src="../../lib/vue.js"></script>
    <script>
      new Vue({
        el: '#app',
        data:{
          msg:'你好吗?'
        },
        // 使用计算属性
        computed:{
          //计算属性中存放的都是方法    计算属性一旦确定就不可更改了 
          newMsg(){
            return this.msg.split('').reverse().join('')
          }
        }
      })
    
  2. 计算属性是一个 选项, 选项值是一个对象,对象中存放的是方法

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

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

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

  3. 案例联系计算属性

    • 用户名书写
    • 通过上面的案例我们知道了,计算属性还可以使用getter和setter
    <!-- 姓与名的value  添加到姓名内 姓名发生改变姓与名随之改变-->
      <div id="app">
          姓:<input type="text" v-model="xing">
          名:<input type="text" v-model="ming">
          姓名:<input type="text" v-model="name">
      </div>
    </body>
    <script src="../../lib/vue.js"></script>
    <script>
      new Vue({
        el: '#app',
        data:{
            xing:'',
            ming:''
        },
        computed:{
          name:{
            get(){
              return this.xing+this.ming
            },
            set(val){//val就是当前绑定元素的value值
              this.xing=val.slice(0,1)
              this.ming=val.slice(1)
            }
          }
    
        }
        
      })
    

watch 侦听属性

  1. 以案例来学习watch - > 用户名写入

  2. watch是一个选项, 选项值是一个对象

    • 对象中可以存放的类型有哪些
    • { [key: string]: string | Function | Object | Array }
    • 常用的是方法和对象
  3. 总结:
    由一个数据改变,引起的新的数据请求

     <div id="app">
          姓:<input type="text" v-model="xing">
          名:<input type="text" v-model="ming">
          姓名:<input type="text" v-model="name">
      </div>
    </body>
    <script src="../../lib/vue.js"></script>
    <script>
      new Vue({
        el: '#app',
        data:{
          xing:'',
          ming:'',
          name:''
        },
        watch:{
          xing(val){
            this.name=val+this.ming
          },
          ming(val){
            this.name=this.xing+val
          },
          name:{
            deep:true,
            handler: function (val) {//该回调会在任何被侦听的对象的 property 改变时被调用,不论其被嵌套多深
              this.xing=val.slice(0,1)
              this.ming=val.slice(1)
            },
          }
        }
      })
    

vue:

1:在模板中 数据类似于全局变量 直接用的 ,属性身上没有花括号的 直接使用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值