指令

作者: 想吃热干面了 | 来源:发表于2020-09-15 10:10 被阅读0次

    一、事件监听:v-on指令

    监听用户发生的事件,比如点击、拖拽、键盘事件等等,以便和用户交互。使用v-on指令

    v-on介绍

    • 作用:绑定事件监听器
    • 缩写:@
    • 预期: Function Inline Statement Object
    • 参数:event

    v-on的基本使用

    <div id="app">
      <h2>{{counter}}</h2>
      <button @click="increment">+</button>
      <button @click="decrement">-</button>
    </div>
    <script src="../js/vue.js"></script>
    <script>
    const app = new Vue({
      el: "#app",
      data: {
        counter: 1
      },
      methods: {
        increment: function () {
          return this.counter++
        },
        decrement: function () {
          return this.counter--
        }
      }
    })
    </script>
    

    v-on的参数传递问题

    • 第一种 无参数 正常输出字符串
      <button @click="btn1Click">按钮1</button>
       btn1Click () {
          console.log("btn1Click");
        },
      
    • 第二种 需要参数时 会有三种情况
       <!--正常传入参数-->
       <button @click="btn2Click(123)">按钮2</button>
       <!--没有传参数-->
       <button @click="btn2Click()">按钮2</button>
       <!--省略了小括号 但是方法本身需要一个参数,这个时候,Vue会默认 
      将浏览器产生的event事件对象作为参数传入到方法-->
       <button @click="btn2Click">按钮2</button>
      
        btn2Click (event) {
          console.log('......', event);
        },
      
    • 第三种 有参数,还需event对象
       <!--在事件定义时,我们需要event对象,同时有需要其他参数-->
       <!--手动获取浏览器参数的event对象:$event-->
       <button @click="btn3Click(abc,  $event)">按钮3</button>
      
        btn3Click (abc,event) {
          console.log('++++++', abc, event);
        }
      

    v-on的修饰符使用

    在某些情况下,我们拿到event事件的目的可能是进行一些事件处理
    Vue提供了修饰符来帮助我们方便处理一些事件
    • stop:调用event.stopPropagation()
    • prevent:调用event.preventDefault()
    • {keyCode|keyAlias}:只当事件是从特定键触发时才触发回调
    • native:监听组件根元素的原生事件
    • once:只触发一次回调
    1.stop修饰符的使用
    在不加.stop的时候,点击按钮时divClick事件也会触发,为了点击按钮时不触发div的事件,只触发按钮自己的事件,这时用.stop修饰符
    <div @click="divClick">
    click
    <button @click.stop="btnClick">按钮</button>
    </div>
    
    divClick(){
      console.log("divClick");
    },
    btnClick(){
      console.log("btnClick");
    }
    
    2. .prevent修饰符的使用(阻止默认事件)
    <form action="baidu">
      <input type="submit" value="提交" @click.prevent="submitClick">
    </form>
    
    submitClick(){
      console.log("submitClick");
    }
    
    3. 监听键盘某个按键按钮的点击
    <!--3. 监听某个键盘的键帽 enter 只监听输入键-->
    <input type="text" @keyup.enter="keyUp">
    
      keyUp(){
        console.log("keyUp");
      }
    
    4. .once修饰符的使用
    <!--使按钮只能触发一次,例如:投票 只能投一张-->
    
    <button @click.once="btn2Click">按钮2</button>
     btn2Click(){
        console.log("btn2Click");
      }
    

    二、条件判断

    v-if的使用

    <div id="app">
      <h2 v-if="isShow">{{message}}</h2>
    </div>
    <script src="../js/vue.js"></script>
    <script>
    const app = new Vue({
      el: "#app",
      data: {
        message: "你好啊!",
        isShow: true
      }
    })
    </script>
    

    v-if和v-else的结合使用

    <div id="app">
      <h2 v-if="isShow">{{message}}</h2>
      <h1 v-else>false时,显示我</h1>
    </div>
    <script src="../js/vue.js"></script>
    <script>
    const app = new Vue({
      el: "#app",
      data: {
        message: "你好啊!",
        isShow: true
      }
    })
    </script>
    

    v-if、v-else-if和v-else的结合使用

    <div id="app">
      <h2 v-if="score>=90">优秀</h2>
      <h2 v-else-if="score>=80">良好</h2>
      <h2 v-else-if="score>=60">及格</h2>
      <h2 v-else="score<90">补考</h2>
    </div>
    <script src="../js/vue.js"></script>
    <script>
    const app = new Vue({
      el: "#app",
      data: {
        score: 95
      }
    })
    </script>
    
    不推荐上面这种写法,最好使用计算属性
    <div>
      <h1>{{result}}</h1>
    </div>
    <script src="../js/vue.js"></script>
    <script>
    const app = new Vue({
      el: "#app",
      data: {
        score: 95
      },
      computed: {
        result(){
          let showMessage = "";
          if (this.score>=90){
            showMessage = "优秀"
          }else if (this.score>=80){
            showMessage = "良好"
          }else if (this.score>=60){
            showMessage = "及格"
          }else {
            showMessage = "补考"
          }
          return showMessage
        }
      }
    })
    </script>
    
    注:vue的input存在的小问题
    当我们在输入框中输入后,再切换登陆方式时,输入的内容还保存着
    因为vue底层有虚拟DOM会把即将显示的东西放到内存中,会优先复用已存在的input
    如果不想在切换后仍然显示,那么可以给input加key,起到标识的作用
    key是vue内置属性
    

    v-show的使用以及和v-if的区别

    <!--v-if:当条件为false时,包含v-if指令的元素,根本不会存在dom中-->
    <h2 v-if="isShow">{{message}}</h2>
    <!--v-show:当条件为false时,v-show只是给元素添加一个行内样式:display:none-->
    <h2 v-show="isShow">{{message}}</h2>
    

    三、循环遍历

    -v-for遍历数组 语法:v-for="items in item"

    <div id="app">
    <!--1.在遍历的过程汇总,没有使用索引值(下标值)-->
    <ul>
      <li v-for="name in names">{{name}}</li>
    </ul>
    <!--2.在遍历的过程中,显示索引值-->
    <ui>
      <li v-for="(name,index) in names">
        {{index+1}}.{{name}}
      </li>
    </ui>
    </div>
    <script src="../js/vue.js"></script>
    <script>
    const app = new Vue({
      el: "#app",
      data: {
        names: ["why","james","kobe","curry"]
      }
    })
    </script>
    

    v-for遍历对象

    <div id="app">
    <!--1.在遍历对象时,如果只是获取一个值,那么得到的就是value-->
    <ul>
      <li v-for="item in info">{{item}}</li>
    </ul>
    
    <!--2.获取key和value 格式:(value,key)-->
    <ui>
      <li v-for="(value,key) in info">
        {{value}}-{{key}}
      </li>
    </ui>
    
    <!--3.获取value,key,index 格式:(value,key,index)-->
    <ul>
      <li v-for="(value,key,index) in info">
        {{index}}.{{value}}-{{key}}
      </li>
    </ul>
    </div>
    <script src="../js/vue.js"></script>
    <script>
    const app = new Vue({
      el: "#app",
      data: {
        info: {
          name: "hello",
          age:  38,
          height: 1.69
        }
      }
    })
    </script>
    

    v-for绑定和非绑定key的区别

    <ul>
      <li v-for="item in letters" :key="item">{{item}}</li>
    </ul>
    

    官网推荐我们在使用v-for时,给对应的元素或组件添加一个key属性,为了更好的复用
    splice:在数组中插入数据 splice(2,0,'1') 在第二位 后一位加入1 性能低
    使用key:可以有效插入元素
    https://www.bilibili.com/video/BV15741177Eh?p=37

    扩展:哪些数组的方法是响应式的

    数组方法展示:
    <div id="app">
      <ul>
        <li v-for="item in letters">{{item}}</li>
      </ul>
      <button @click="btnClick">按钮</button>
    </div>
    <script src="../js/vue.js"></script>
    <script>
      const app = new Vue({
        el: "#app",
        data: {
          letters: ['A','B','C','D','E']
        },
        methods: {
          btnClick () {
            1.push():在数组最后面添加元素 可以添加一个或多个
            this.letters.push('m','n','l')
    
            2.pop():删除数组中的最后一位元素
            this.letters.pop();
    
            3.shift():删除数组中的第一个元素
            this.letters.shift();
    
            4.unshift():在数组最前面添加元素 可以添加一个或多个
            this.letters.unshift('aa','bb','cc');
    
            5.splice():删除元素/插入元素/替换元素
            //第一个参数是你要从第几位开始操作数组
            删除元素:第二个参数传入你要删除几个元素(如果没有传,就删除后面所有的元素)
            this.letters.splice(1,2)
            替换元素:第二个参数,表示我们要替换几个元素,后面是用于替换前面的元素(也可以理解为删除几个元素后,再插入元素)
            this.letters.splice(1, 4,'m','n','l')
            插入元素:第二个参数,或者不写第二个参数,后面跟上要插入的元素
            this.letters.splice(1,0,'m','n','l')
    
            6.sort():排序
            this.letters.sort();
    
            7.reverse():内容反转
            this.letters.reverse();
    
            注意:通过索引值改变数组中的元素是非响应式的,上面的方法都是响应式的
            this.letters[0] = 'a'
            //而想要达到上面的效果,有以下两种方式
            1.this.letters.splice(0,1,'a')
            2.set(要修改的对象,索引值,修改后的值) vue内部方法,是响应式的
            vue.set(this.letters, 0, 'a')
          }
        }
      })
    </script>
    
    非响应式.png

    四、过滤器

    可以对数据进行预处理 85——¥85.00

    td>{{item.price | showPrice}}</td>
    
    filters: {
      showPrice(price) {
        return '¥' + price.toFixed(2)
      }
    }
    

    五、表单绑定 v-model(双向绑定)

    1.v-mdoel的基本使用:实现双向绑定

    双向绑定:即输入框和message信息改变其中任意一个,另一个就会随之改变
      <div id="app">
        <input type="text" v-model="message">
        {{message}}
      </div>
      <script src="../js/vue.js"></script>
      <script>
        const app = new Vue({
          el: "#app",
          data: {
            message: "你好啊!"
          }
        })
      </script>
    

    2.v-model的原理

    v-model其实是一个语法糖,它的背后本质上包含两个操作
    • ①.v-bind绑定一个value元素
      <input type="text" v-bind:value="message">
      
    • ②.v-on指令给当前元素绑定input事件
      <input type="text" @input="message = $event.target.value">
      上面是简单写法,下面为详细写法
      <input type="text" v-on:input="valueChange">
      methods: {
        valueChange(event) {
          this.message = event.target.value;
          console.log("...");
        }
      }
      
    总结
     <input type="text" v-model="message">
      等同于
     <input type="text" :value="message" @input="message = $event.target.value">
    

    3.v-model:radio

    <div id="app">
    <label for="male">
      <input type="radio" id="male" value="男" v-model="sex">男
    </label>
    <label for="female">
      <input type="radio" id="female" value="女" v-model="sex">女
    </label>
    <h1>您选择的性别是:{{sex}}</h1>
    </div>
    <script src="../js/vue.js"></script>
    <script>
    const app = new Vue({
      el: "#app",
      data: {
        sex: "男"
      }
    })
    </script>
    
    其中sex和radio通过v-model实现了双向绑定

    4.v-model:checkbox

    单选框:协议选择 v-model是布尔值
    label好处:块级作用域,点击文字即可选择
    <div id="app">
      <label for="agree">
        <input type="checkbox" id="agree" v-model="isAgree">同意协议
      </label>
      <h2>您选择的是:{{isAgree}}</h2>
      <button :disabled="!isAgree" @click="btnClick">下一步</button>
    </div>
      <script src="../js/vue.js"></script>
    <script>
      const app = new Vue({
        el: "#app",
        data: {
          isAgree: false
        },
        methods: {
          btnClick(){
            console.log("您已同意协议");
          }
        }
      })
    </script>
    
    复选框:复选框与数组绑定
    <div id="app">
      <input type="checkbox" value="篮球" v-model="hobbies">篮球
      <input type="checkbox" value="足球" v-model="hobbies">足球
      <input type="checkbox" value="网球" v-model="hobbies">网球
      <input type="checkbox" value="排球" v-model="hobbies">排球
      <h2>您选择的是:{{hobbies}}</h2>
    </div>
      <script src="../js/vue.js"></script>
    <script>
      const app = new Vue({
        el: "#app",
        data: {
          hobbies: []
        },
      })
    </script>
    

    5.v-model:select(不常用)

    • 单选
    注意:v-model的位置
    <div id="app">
    <select name="" id="" v-model="fruit">
      <option value="香蕉">香蕉</option>
      <option value="苹果">苹果</option>
      <option value="橘子">橘子</option>
      <option value="西瓜">西瓜</option>
      <option value="鸭梨">鸭梨</option>
    </select>
    <h2>您选择的水果是:{{fruit}}</h2>
    </div>
    <script src="../js/vue.js"></script>
    <script>
    const app = new Vue({
      el: "#app",
      data: {
        fruit: '香蕉'
      }
    })
    </script>
    
    • 多选
    使用multiple就可以多选了
    <div id="app">
    <select name="" id="" v-model="fruits" multiple>
      <option value="香蕉">香蕉</option>
      <option value="苹果">苹果</option>
      <option value="橘子">橘子</option>
      <option value="西瓜">西瓜</option>
      <option value="鸭梨">鸭梨</option>
    </select>
    <h2>您选择的水果是:{{fruits}}</h2>
    </div>
    <script src="../js/vue.js"></script>
    <script>
    const app = new Vue({
      el: "#app",
      data: {
        fruit: '香蕉',
        fruits: []
      }
    })
    </script>
    

    六、值绑定

    所谓的值绑定,本质就是v-bind的应用
    <div id="app">
    <label v-for="item in originHobbies" :for="item">
      <input type="checkbox" :value="item" :id="item" v-model="hobbies">{{item}}
    </label>
    <h2>您选择的是:{{hobbies}}</h2>
    </div>
    <script src="../js/vue.js"></script>
    <script>
    const app = new Vue({
      el: "#app",
      data: {
        hobbies: [],
        originHobbies: ['篮球','足球','网球','排球']
      }
    })
    </script>
    

    七、修饰符

    1.lazy修饰符:

    • 默认情况下:v-model是在input事件中同步输入框的数据,也就是说,一旦数据发生改变对应的data中的数据就会自动发生改变
      <div id="app">
      <input type="text" v-model.lazy="message">
      <h2>{{message}}</h2>
      </div>
      <script src="../js/vue.js"></script>
      <script>
        const app = new Vue({
          el: "#app",
          data: {
            message: "你好啊!"
          }
        })
      </script>
      
    • lazy修饰符可以让数据在失去焦点或者回车时才会更新

    2.numbei修饰符

    • 默认情况下,输入框中无论输入的是字母还是数字,v-model都会将其当作字符串进行处理,但是如果希望处理的是数字类型,那么最好直接将内容当作数字处理
    • number修饰符可以让在输入框中输入的内容自动转成数字类型
        <input type="number" v-model.number="age">
        <h2>{{age}}-{{typeof age}}</h2>
      

    3.trim修饰符

    • trim修饰符可以过滤内容左右两边的空格
    mustache语法会自动去除左右空格
       <input type="text" v-model.trim="name">
       <h2>您输入的名字:{{name}}</h2>
    

    相关文章

      网友评论

          本文标题:指令

          本文链接:https://www.haomeiwen.com/subject/hkhplktx.html