指令

作者: 想吃热干面了 | 来源:发表于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