4. 绑定事件

2018-11-20  本文已影响0人  dwy_interesting

v-on:
v-on:change ---- 失去焦点
v-on:input ---- 输入
方法写入new Vue({methods:{method1,method2,......}})

例一:在input框输入后显示输入内容在输入框后
方法一:

<body>
<div id="app">
  <!-- v-on: 可以缩写为@ -->
  <input
    type="text"
    :value="inputValue"
    v-on:input="handleInputChange"
  >
  {{inputValue}}
</div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script> 
<script>
const vm = new Vue({
  el: '#app',
  data: {
    inputValue: ''
  },
  // 方法都写到这里来吧
  methods: {
    handleInputChange(e) {
      console.log(e,e.data)
      this.inputValue += e.data;
    }
  }
})
</script>
</body>

方法二:

<body>
<div id="app">
  <!-- v-on: 可以缩写为@ -->
  <input
    type="text"
    v-model="inputValue"
  >
  {{inputValue}}
</div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script> 
<script>
const vm = new Vue({
  el: '#app',
  data: {
    inputValue: ''
  }
})
</script>
</body>

例二:点击按钮实现数字加减

<body>
<div id="app">

  <!-- v-on:XXXX 后面直接可以使用表达式 -->
  <button
    @click="number--"
  >-</button>
  {{number}}
  <button
    @click="number++"
  >+</button>

  <!-- 调用事件的时候,可以不加括号, 这时候Vue会自动把event参数传递过去 -->
  <button
    @click="reduce"
  >-</button>
  {{number1}}
  <!-- 调用事件的时候,也可以加括号, 这时候已经没有event了, 必须必须必须传递$event为方法的参数 -->
  <button
    @click="add(5, $event)"
  >+</button>

</div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script> 
<script>
const vm = new Vue({
  el: '#app',
  data: {
    number: 10,
    number1: 20
  },
  methods: {
    // es6增强对象字面量
    reduce(e) {
      console.log(e)
      this.number1--
    },
    add(count, e) {
      console.log(e, count)
      this.number1+=count
    }
  }
})
</script>
</body>

事件修饰符stop:点击b不会触发点击a

<body>
<div id="app">
  <div class="a" @click="handleAClick">
    <!-- 事件修饰符 -->
    <!--.stop 阻止单击事件继续传播 (相当于阻止事件冒泡)-->
    <div class="b" @click.stop="handleBClick">点一下试试</div>
  </div>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script> 
<script>
const vm = new Vue({
  el: '#app',
  methods: {
    handleAClick(e){
      console.log('a被点击了', e)
    },
    handleBClick(e){
      console.log('b被点击了', e)
    }
  }
})
</script>
</body>

按键事件keyup:

<body>
<div id="app">
  <!-- keyup事件是按键触发事件,当按下且释放后才会触发 -->
  <input type="text" v-model="inputValue" @keyup.f12="handleKeyup">
</div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script> 
<script>
// f12的按键编码是123
//可以通过全局 config.keyCodes 对象自定义按键修饰符别名
Vue.config.keyCodes.f12 = 123;
const vm = new Vue({
  el: '#app',
  data: {
    inputValue: ''
  },
  methods: {
    handleKeyup(e) {
      console.log(e.keyCode)
      alert('F12被按下又起来了')
    }
  }
})
</script>
</body>

键盘事件keyup链式调用

<body>
<div id="app">
  按下ctrl+enter
  <!-- vue的按键修饰符,可以链式调用 -->
  <input type="text" v-model="inputValue" @keyup.ctrl.enter="handleKeyup">
</div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script> 
<script>
const vm = new Vue({
  el: '#app',
  data: {
    inputValue: ''
  },
  methods: {
    handleKeyup(e) {
      alert('哈也没有啊,你按啥?')
    }
  }
})
</script>
</body>

例:输入框内输入数据点击按钮/按enter键可提交显示到有序列表中

<body>
<div id="todolist">
  <!-- 键盘点击enter触发添加事件 -->
  <input
    v-model="inputTodo"
    type="text"
    @keyup.enter="handleAdd"
  >
  <!-- 鼠标点击触发添加事件 -->
  <button @click="handleAdd">添加</button>
  <!-- 添加元素区域 -->
  <ol>
    <li
      v-for="todo of todos"
      :key="todo.id"
    >
    <!-- 读取todos内的每个todo.text,渲染出来 -->
      {{todo.text}}
    </li>
  </ol>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script> 
<script>
  const vm = new Vue({
    el: '#todolist',
    data: {
      // inoutTodo----输入框内输入的值
      inputTodo: '',
      todos: [{
        id: Math.random(),
        text: '学习'
      }, {
        id: Math.random(),
        text: '挂科'
      }, {
        id: Math.random(),
        text: '打游戏'
      }]
    },
    methods: {
      handleAdd() {
        // 输入为空时,不触发事件
        if(this.inputTodo === '') {
          return false;
        };
        //将输入的数据添加到todos中
        this.todos.push({
          id: Math.random(),
          text: this.inputTodo
        });
        //最后初始化输入为空,也就是输入框置空
        this.inputTodo = '';
      }
    }
  })
</script>
</body>

html符号

computed:根据现有的状态计算出新的状态
数据有缓存(所依赖的属性不变化,值不变化)
根据现有的值,计算出新的值
可以直接使用其函数,无需再执行
有get(取值)和set(设置值)两种方法
例:在输入框输入姓名获取全名,在得知全名情况下分解出姓和名

<body>
<div id="app">
<label>姓<input type="text" v-model="xing"></label>
<label>名<input type="text" v-model="ming"></label>
<div>你好!{{fullname}}</div>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script> 
<script>
const vm = new Vue({
  el: '#app',
  data: {
    xing: '',
    ming: ''
  },
  computed: {
    // computed里面的方法有两种写法
    // 第一种,一个方法直接返回一个值
    // fullname() {
    //   return this.xing + this.ming;
    // }

    // 第二种,定义为一个对象,里面分别有get和set两个方法
    // 在调用的时候,自动执行get()
    fullname: {
      get() {
        return this.xing + this.ming;
      },
    // 在赋值的时候,会自动执行set(value)
    // 比如执行: this.fullname = '张三'
    // 得到结果为
    // this.xing = '张'
    // this.ming = '三'
      set(v) {
        this.xing = v.slice(0, 1);
        this.ming = v.slice(1);
      }
    }
  }
})
</script>
</body>

methods:
需要重新执行才能渲染出结果
无缓存(在视图层执行)

watch:监听现有数据
例:无论是姓改变还是名改变,全名随之而变

<body>
<div id="app">
<label>姓<input type="text" v-model="xing"></label>
<label>名<input type="text" v-model="ming"></label>
<div>你好!{{fullname}}</div>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script> 
<script>
const vm = new Vue({
  el: '#app',
  data: {
    xing: '',
    ming: '',
    fullname: '',
  },
  // 监听某个data-item的变化, 当此item的value发生改变的时候,就会自动执行某个方法
  // 能不用尽量不用
  watch: {
    xing() {
      this.fullname = this.xing + this.ming
    },
    ming() {
      this.fullname = this.xing + this.ming
    }
  }
})
</script>
</body>

filters:多个地方需要用同一个方法处理数据时
例:对数据进行保留两位小数处理

<body>
<div id="app">
<!-- |后面直接跟filter -->
{{num | tofix}} {{num1 | tofix}}
</div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script> 
<script>
const vm = new Vue({
  el: '#app',
  data: {
    num: 3.14159265,
    num1: 6.42546456578
  },
  // filters用于处理某些同一类型的值,需要做一些格式化操作的时候
  // 有点类似于咱们平常所用到的一个方法库的意思
  filters: {
    tofix(v) {
      return v.toFixed(2);
    }
  }
})
</script>
</body>

moment.js:时间处理插件

<body>
<div id="app">
{{now | formatTime}}
</div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script src="https://cdn.jsdelivr.net/npm/moment@2.22.2/moment.js"></script>
<script>
const vm = new Vue({
  el: '#app',
  data: {
    now: new Date()
  },
  filters: {
    formatTime(t) {
      return moment(t).format('YYYY年MM月DD日 DDDo ddd Wo')
    }
  }
})
</script>
</body>
上一篇下一篇

猜你喜欢

热点阅读