Vue的处理用户事件

在js的时候,关于事件,DOM操作还是比较繁琐的,例如

document.getElementById("btn").addEventListener("click", function () {
  alert("Hello World");
});

上面的两步操作
第一:给元素添加点击事件
第二:给点击事件添加方法

但是在Vue里面是很简单的

1.v-on:(事件绑定)

第一:给事件添加点击事件,不过在Vue里面不叫点击事件了,叫做事件绑定

<button v-on:click="add">按钮</button>

这样就给按钮添加好了点击,当你点击按钮的时候,就会驱动add
还有一个简写模式,看上去更简单

<button @click="add">按钮</button>

2.methods(方法)

第二步:给点击事件添加方法
这一步是将js代码中 匿名方法写在Vue规定的位置
首先,将js的代码抽离出来是这样子的

let alertFn = function () {
  alert("Hello World");
};

document.getElementById("btn").addEventListener("click", alertFn);

第二步:将抽离出来的alertFn方法放在Vue中规定的位置,要注意存放的方式是键值对的方式key:value

<script>
export default{
    name:"app",
    methods:{
        alertFn:function(){
            alert("Hello World");
        }
    }
}
</script>
以上是知识点,下面是具体的一个案例

我们可以点击按钮,数字加一
vue核心代码如下:

<template>
   <p>{{counter}}</p>
   <button @click="add">点击</button>
</template>
<script>
export default{
   name:"app",
   data(){
       return {
           //初始次数
           counter:0
       };
   },
   methods:{
       add:function(){
           //这里的this指向的是当前的Vue实例
           this.counter++
       }
   }
};
</script>

这里要注意的是,如果用在data的定义的变量,就必须要在变量的前面加上this

@click="add"的完整的写法其实 是@click="add()"在括号里面其实是可以传递参数的

事件的修饰符

1.阻止冒泡事件

<div @click.stop="fn2"></div>

2.捕获事件

<div class="div2" @click.capture="fn2"></div>

3.阻止默认事件

<div class="div2" @click.prevent="fn2"></div>

一个很不错的例子
`
在这里插入图片描述
他可以实现的功能有:

1.在HTML的基础上 添加输入框和“提交”的按钮

2.给表格的每一个格子上添加点击事件,点击后获取格子内的数据

3.将获取到的数据显示在input框内

4.使用v-model双向绑定完成对数据的修改

5.将修改后的数据显示在对应的格子内

6.当input框上添加一个获取鼠标焦点事件@focus=""判断在获取焦点的时候,是否已经选中了表中的格子,如果没有选中的话,使用console.log()在控制台打印提示消息

7.在提交按钮上的添加点击事件,点击提交后,将修改后的数据显示在对应的格子上

下面是他的代码 注意只提供核心代码,Vue部分的

<template>
  <div id="app">
    <div class="list">
      <div class="title">
        <div class="name">姓名</div>
        <div class="class">班级</div>
        <div class="total-grade">总成绩</div>
      </div>
      <div class="line">
        <div class="name-data" @click="getData(0, 'name')">
          {{ list[0].name }}</div>
        <div class="class-data" @click="getData(0,'grade')">
          {{ list[0].grade }}</div>
        <div class="total-grade-data" @click="getData(0,'mark')">
          {{ list[0].mark }}</div>
      </div>
      <div class="line">
        <div class="name-data" @click="getData(1,'name')">
          {{ list[1].name }}</div>
        <div class="class-data"  @click="getData(1,'grade')">
          {{ list[1].grade }}</div>
        <div class="total-grade-data" @click="getData(1,'mark')">
          {{ list[1].mark }}</div>
      </div>
      <div class="line">
        <div class="name-data"  @click="getData(2,'name')">
          {{ list[2].name }}</div>
        <div class="class-data"  @click="getData(2,'grade')">
          {{ list[2].grade }}</div>
        <div class="total-grade-data"  @click="getData(2,'mark')">
          {{ list[2].mark }}</div>
      </div>
   
    <div class="change">
      <input 
      type="text" 
      v-model="changingData"
       placeholder="请输入……" 
       @focus="focusFn"
       />
      <div @click="changeData" class="sub">提交</div>
    </div>
  </div>
 </div>
</template>

<script>
export default {
  name: 'app',
  data() {
    return {
      list: [
        {
          name: '张三',
          grade: '三年级二班',
          mark: 290,
        },
        {
          name: '李四',
          grade: '三年级二班',
          mark: 270,
        },
        {
          name: '王五',
          grade: '三年级二班',
          mark: 270,
        },
      ],
      changingData:'',
      currentIndex:0,
      currentKey:'',
    };
  },
  methods:{
    getData:function(index,key){
      this.currentIndex=index;
      this.currentKey=key;
      this.changingData=this.list[index][key];
    },
    changeData:function(){
      if(!this.changingData){
        console.log('请选择要更改的表格');
      }
      this.list[this.currentIndex][this.currentKey]=this.changingData;
      console.log(this.list);
    },
    focusFn:function(){
      if(!this.changingData){
        console.log('请选择要更改的表格');
      }
    },
  },
};
</script>

<style lang="scss" scoped>
.list {
  background: #34405a;
  color: #ffffff;
  .title {
    display: flex;
    padding: 5px 0;
    background: #36507e;
    div {
      flex: 1;
    }
  }
  .line {
    padding: 5px 0;
    background: #222c44;
    display: flex;
    border-bottom: 1px solid #020b1a;
    div {
      flex: 1;
    }
  }
   .change {
    display: flex;
    padding: 5px 0;
    input {
      border: none;
      background: transparent;
      margin-right: 20px;
      outline: 0;
      color: #ffffff;
      padding: 5px 20px;
    }
    .sub {
      cursor: pointer;
    }
  }
}
</style>

<style>
#app {
  font-family: Avenir, Helvetica, Arial, sans-serif;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  text-align: center;
  color: #2c3e50;
}

#nav {
  padding: 30px;
}

#nav a {
  font-weight: bold;
  color: #2c3e50;
}

#nav a.router-link-exact-active {
  color: #42b983;
}
</style>
yarn 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值