美文网首页
4. 绑定事件

4. 绑定事件

作者: dwy_interesting | 来源:发表于2018-11-20 09:36 被阅读0次

    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>
    

    相关文章

      网友评论

          本文标题:4. 绑定事件

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