2vue指令

195 阅读5分钟

解决闪烁问题 v-cloak

  • 插值表达式 {{msg}}

  • 由于单线程逐行进行运行

  • 将network 中的online改为slow3G页面直接显示{{msg}}

  • 可以在前后放任何内容

         <div id="app">
         <p>{{msg}}</p>
         </div>
         <script src="./lib/vue.js"></script>
         <script>
         var vm = new Vue({
          el: "#app",
          data: {
              msg: "123"
          }
          })
         </script>
    

    出现页面闪烁的问题,看到了插值表达式

    解决办法:v-cloak自动移除,解决闪烁问题, css属性+js

       <head>
         <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Document</title>
         <style>
        [v-cloak]{
           display: none;
        }
      </style>
      </head>
      
      <body>
          <div id="app">
              <p v-cloak>{{msg}}</p>
          </div>
          <script src="./lib/vue.js"></script>
          <script>
              var vm = new Vue({
                  el: "#app",
                  data: {
                      msg: "123"
                  }
              })
          </script>
      </body>
    

没有闪烁问题 v-text

  • 替换标签中原本内部内容

  • 没有闪烁问题

      <head>          
        <style>
            [v-cloak]{
                display: none;
            }
        </style>
     </head>
     
     <body>
         <div id="app">
             <p v-cloak>{{msg}}</p>
             <p v-text="msg"></p>
         </div>
         <script src="./lib/vue.js"></script>
         <script>
             var vm = new Vue({
                 el: "#app",
                 data: {
                     msg: "123"
                 }
             })
         </script>
     </body>
    

将标签渲染到div中去 v-html

     <div id="app">
            <p v-cloak>{{msg}}</p>
            <p v-text="msg"></p>
            <div v-html="msg2"></div>        
        </div>
        <script src="./lib/vue.js"></script>
        <script>
            var vm = new Vue({
                el: "#app",
                data: {
                    msg: "123",
                    msg2:"<h1>我爱你</h1>"
                }
            })
        </script>

将属性值放到属中,绑定属性指令 v-bind:title="mytitle" 缩写v-bind<=>:

  • v-bind 会将mytitle当作js解析代码执行 mytitle是变量

  • v-bind:title="mytitle + '123'" 表达式来执行字符串的连接符

  • 内部可以写合法js表达式

     <div id="app">
         <input type="button" value="按钮" v-bind:title="mytitle">       
     </div>
     <script src="./lib/vue.js"></script>
     <script>
         var vm = new Vue({
             el: "#app",
             data: {
                 mytitle:"我是hover的属性"
             }
         })
     </script>
    

v-on: <=>@ 时间绑定机制 常见的事件都可以应用

  • v-on:click="alert('hello')"中间是表达式,不能出来弹框会报错

  • 需要用方法来代替,methods属性实现该功能

      <div id="app">
          <input type="button" value="点击事件" v-bind:title="mytitle" v-on:click="show">          
      </div>
      <script src="./lib/vue.js"></script>
      <script>
          var vm = new Vue({
              el: "#app",
              data: {
              },
              methods:{
                  // 这个定义方法
                  show:function(){
                      alert("我喜欢你")
                  }
              }
          })
      </script>
    
  • 在vm实例中,想要调用data中的数据,调用methods中方法用this.属性名或者this.方法名

  • this指new中创建的vm实例对象

  • 事件修饰符

    • .stop阻止冒泡 从里向外,写在里面
    • .prevent阻止默认行为 a链接的跳转
    • .capture 添加事件监听时,事件捕获模式 从外向里写在外面
    • .self 当事件在该元素本身触发时触发回调(自身触发),点击本身时的冒泡行为
    • .once 事件触发一次 只阻止一次事件触发
  • stop

        <div id="app"> 
            <div class="inner" @click="divHandler">
                <input type="button" value="戳他" v-bind:title="mytitle" @click.stop="btnHandler">  
            </div>   
        </div>
        <script src="./lib/vue.js"></script>
        <script>
            var vm = new Vue({
                el: "#app",
                data: { 
                },
                methods:{
                    // 这个定义方法
                    divHandler:function(){
                        alert("div的我喜欢你")
                    },
                    btnHandler:function(){
                        alert("btn的我喜欢你")
                    }
                }
            })
        </script>
    
  • prevent

无顺序的问题 .prevent.stop

      <div id="app"> 
            <div class="inner" @click="divHandler">
                <!-- <input type="button" value="戳他" v-bind:title="mytitle" @click.stop="btnHandler">   -->
                <a href="www.baidu.com" @click.prevent.stop="baidu">不跳转到百度</a>
            </div>   
        </div>
        <script src="./lib/vue.js"></script>
        <script>
            var vm = new Vue({
                el: "#app",
                data: { 
                },
                methods:{
                    // 这个定义方法
                    divHandler:function(){
                        alert("div的我喜欢你")
                    },
                    baidu:function(){
                        alert("百度不跳转")
                    }
                }
            })
        </script>
  • capture 捕获外层向里

         <div id="app"> 
             <div class="inner" @click.capture="divHandler">
                 <input type="button" value="戳他" v-bind:title="mytitle" @click="btnHandler">   
             </div>   
         </div>
         <script src="./lib/vue.js"></script>
         <script>
             var vm = new Vue({
                 el: "#app",
                 data: { 
                 },
                 methods:{
                     // 这个定义方法
                     divHandler:function(){
                         alert("div的我喜欢你")
                     },
                     btnHandler:function(){
                         alert("btn的我喜欢你")
                     }
                 }
             })
         </script>
    
  • .self 点击时才触发本身的事件

                   <div id="app"> 
                     <div class="inner" @click.self="divHandler">
                         <input type="button" value="戳他" v-bind:title="mytitle" @click="btnHandler">  
                         <!-- <a href="www.baidu.com" @click.prevent.stop="baidu">不跳转到百度</a> -->
                     </div>   
                 </div>
                 <script src="./lib/vue.js"></script>
                 <script>
                     var vm = new Vue({
                         el: "#app",
                         data: { 
                         },
                         methods:{
                             // 这个定义方法
                             divHandler:function(){
                                 alert("div的我喜欢你")
                             },
                             btnHandler:function(){
                                 alert("btn的我喜欢你")
                             }
                         }
                     })
                 </script>
    
  • .once 阻止一次

       <div id="app">  
                     <a href="http://www.baidu.com" @click.prevent.once="baidu">不跳转到百度</a> 
             </div>
             <script src="./lib/vue.js"></script>
             <script>
                 var vm = new Vue({
                     el: "#app",
                     data: { 
                     },
                     methods:{
                         // 这个定义方法 
                         baidu:function(){
                             alert("百度不跳转")
                         }
                     }
                 })
             </script>
    

v-model 数据的双向绑定

  • 属性挂在到vm实例中,this.msg调用

  • 可以直接赋值修改,vm.msg="爱您"。单向数据绑定

  • 双向数据绑定,利用表单元素与用户交互

      <input type="text" name="" id="" value="msg">//不对
    
  • 属性绑定 v-bind只能实现数据的单项绑定,从m自动保存到v中去,无法实现双向绑定

      <input type="text" name="" id="" v-bind:value="msg">
    
  • v-model 双向绑定 可以实现数据表单元素和model中数据的双向绑定

      <input type="text" name="" id="" v-model:value="msg">
    

radio text address email select checkbox textarea....