zoukankan      html  css  js  c++  java
  • vue 计算属性和侦听器

    1. 计算属性     用于简单运算的。在模板中放入太多的逻辑会让模板过重且难以维护  (fullname  instead of  {{ a+b}}   or   {{a}}{{b}})

    计算属性是基于它们的响应式依赖进行缓存的。只在相关响应式依赖发生改变时它们才会重新求值   ( 效率高,节省性能 )

    调用方法将总会再次执行函数   ( 效率低、灵活 )

    同时,插入方式不一样,计算属性只需插入函数名,方法则需要调用执行。

    计算属性 computed  内部属性不可与 data 冲突,即二者存其一

    <!DOCTYPE html>
    <html lang="en">
    
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <meta http-equiv="X-UA-Compatible" content="ie=edge">
      <title>Document</title>
    </head>
    
    <body>
      <div id="example">
        <p>Original message: "{{ message }}"</p>
        <p>Computed reversed message: "{{ reversedMessage() }}"</p>
      </div>
    
    
      <script src="vue.js"></script>
      <script>
        var vm = new Vue({
          el: '#example',
          data: {
            message: 'Hello'
          },
          // computed: {
          //   // 计算属性的 getter
          //   reversedMessage: function () {
          //     // `this` 指向 vm 实例
          //     return this.message.split('').reverse().join('')
          //   }
          // },
          methods: {
            reversedMessage: function () {
              return this.message.split('').reverse().join('')
            }
          }
        })
      </script>
    
    
    
    </body>
    
    </html>
    View Code

    2.侦听器

    watch 方法监听  (可监听数据属性和计算属性

    <!DOCTYPE html>
    <html lang="en">
    
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <meta http-equiv="X-UA-Compatible" content="ie=edge">
      <title>Document</title>
    </head>
    
    <body>
      <div id="demo">{{ fullName }}</div>
    
    
      <script src="vue.js"></script>
      <script>
    
        var vm = new Vue({
          el: '#demo',
          data: {
            firstName: 'Foo',
            lastName: 'Bar',
            fullName: 'Foo Bar'
          },
          watch: {
            firstName: function (val) {
              this.fullName = val + ' ' + this.lastName
            },
            lastName: function (val) {
              this.fullName = this.firstName + ' ' + val
            }
          }
        })
    
        
      </script>
    
    
    
    </body>
    
    </html>
    View Code

    计算属性 方式监听  ( 简洁、不能提前定义数据 )

    <!DOCTYPE html>
    <html lang="en">
    
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <meta http-equiv="X-UA-Compatible" content="ie=edge">
      <title>Document</title>
    </head>
    
    <body>
      <div id="demo">{{ fullName }}</div>
    
    
      <script src="vue.js"></script>
      <script>
        var vm = new Vue({
          el: '#demo',
          data: {
            firstName: 'Foo',
            lastName: 'Bar'
          },
          computed: {
            fullName: function () {
              return this.firstName + ' ' + this.lastName
            }
          }
        })
      </script>
    
    
    
    </body>
    
    </html>
    View Code

    计算属性默认只有 getter ,不过在需要时你也可以提供一个 setter :

    <!DOCTYPE html>
    <html lang="en">
    
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <meta http-equiv="X-UA-Compatible" content="ie=edge">
      <title>Document</title>
    </head>
    
    <body>
      <div id="demo">{{ fullName }}</div>
    
    
      <script src="vue.js"></script>
      <script>
        var vm = new Vue({
          el: '#demo',
          data: {
            firstName: 'Foo',
            lastName: 'Bar'
          },
          computed: {
            fullName: {
              // getter
              get: function () {
                return this.firstName + ' ' + this.lastName
              },
              // setter
              set: function (newValue) {
                var names = newValue.split(' ')
                this.firstName = names[0]
                this.lastName = names[names.length - 1]
              }
            }
          }
        })
      </script>
    
    
    
    </body>
    
    </html>
    View Code

    异步或者消耗大时自定义的监听器

    <!DOCTYPE html>
    <html lang="en">
    
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <meta http-equiv="X-UA-Compatible" content="ie=edge">
      <title>Document</title>
    </head>
    
    <body>
      <div id="watch-example">
        <p>
          Ask a yes/no question:
          <input v-model="question">
        </p>
        <p>{{ answer }}</p>
      </div>
    
    
      <script src="vue.js"></script>
      <script src="https://cdn.jsdelivr.net/npm/axios@0.12.0/dist/axios.min.js"></script>
      <script src="https://cdn.jsdelivr.net/npm/lodash@4.13.1/lodash.min.js"></script>
    
      <script>
        var watchExampleVM = new Vue({
          el: '#watch-example',
          data: {
            question: '',
            answer: 'I cannot give you an answer until you ask a question!'
          },
          watch: {
            // 如果 `question` 发生改变,这个函数就会运行
            question: function (newQuestion, oldQuestion) {
              this.answer = 'Waiting for you to stop typing...'
              this.debouncedGetAnswer()
            }
          },
          created: function () {
            // `_.debounce` 是一个通过 Lodash 限制操作频率的函数。
            // 在这个例子中,我们希望限制访问 yesno.wtf/api 的频率
            // AJAX 请求直到用户输入完毕才会发出。想要了解更多关于
            // `_.debounce` 函数 (及其近亲 `_.throttle`) 的知识,
            // 请参考:https://lodash.com/docs#debounce
            this.debouncedGetAnswer = _.debounce(this.getAnswer, 500)
          },
          methods: {
            getAnswer: function () {
              if (this.question.indexOf('?') === -1) {
                this.answer = 'Questions usually contain a question mark. ;-)'
                return
              }
              this.answer = 'Thinking...'
              var vm = this
              axios.get('https://yesno.wtf/api')
                .then(function (response) {
                  vm.answer = _.capitalize(response.data.answer)
                })
                .catch(function (error) {
                  vm.answer = 'Error! Could not reach the API. ' + error
                })
            }
          }
        })
      </script>
    
    
    
    </body>
    
    </html>
    View Code

    3. 相关链接

  • 相关阅读:
    STL简介
    Java语言实现简单FTP软件------>上传下载队列窗口的实现(七)
    c++模板
    10891
    错误处理:java.lang.NoSuchMethodException: org.apache.catalina.deploy.WebXml addFilter
    Linux crontab 语法和具体的例子
    LoadImage()使用
    matplotlib简单的新手教程和动画
    三白话经典算法系列 Shell排序实现
    AccountManager教程
  • 原文地址:https://www.cnblogs.com/justSmile2/p/10893300.html
Copyright © 2011-2022 走看看