黑马程序员技术交流社区

标题: Vue - 监听数据的三种方法 [打印本页]

作者: charcoal    时间: 2021-4-11 11:16
标题: Vue - 监听数据的三种方法
举一个案例,我们要拼接一个fullname,因此要监听到文本框数据的改变,这样才能知道什么时候去拼接 出一个 fullname

案例结构如下:

<body>
  <div id="app">
      <input type="text" v-model="firstname">+
      <input type="text" v-model="lastname">=
      <input type="text" v-model="fullname">
  </div>
  <script>
    // 创建 Vue 实例,得到 ViewModel
    var vm = new Vue({
      el: '#app',
      data: {
          firstname: '',
          lastname: '',
          fullname: ''
      },
      methods: {},
    });
  </script>

页面结构:



在前两个文本框里输入字符串,最终拼接成一个整体的字符串。

一、利用keyup事件来实现

定义一个函数getFullname:

    <input type="text" v-model="firstname" @keyup="getFullname"> +
    <input type="text" v-model="lastname" @keyup="getFullname"> =
    <input type="text" v-model="fullname">


在vm中定义方法:

    var vm = new Vue({
      el: '#app',
      data: {
          firstname: '',
          lastname: '',
          fullname: ''
      },
      methods: {
          getFullname() {
              this.fullname = this.firstname + '-' + this.lastname
          }
      }
    });

结果如下:



二、使用watch

使用这个 属性,可以监视 data 中指定数据的变化,然后触发这个 watch 中对应的 function 处理函数
该方法可以不用绑定事件

<body>
  <div id="app">
      <input type="text" v-model="firstname">+
      <input type="text" v-model="lastname">=
      <input type="text" v-model="fullname">
  </div>

  

  <script>
    // 创建 Vue 实例,得到 ViewModel
    var vm = new Vue({
      el: '#app',
      data: {
          firstname: '',
          lastname: '',
          fullname: ''
      },
      methods: {},
      watch: {
          'firstname': function(newVal){
              this.fullname = newVal + '-' + this.lastname
          },
          'lastname': function(newVal){
              this.fullname = this.firstname + '-' + newVal
          }
      }
    });
  </script>
</body>

结果如下:



三、computed计算属性的使用

在 computed 中,可以定义一些 属性,这些属性,叫做 【计算属性】, 计算属性的本质,就是 一个方法,只不过我们在使用 这些计算属性的时候,是把它们的名称直接当作属性来使用的;并不会把 计算属性当作方法去调用;
computed和methods平级

注意1: 计算属性,在引用的时候,一定不要加 () 去调用,直接把它当作普通 属性去使用就好了;
注意2: 只要 计算属性,这个 function 内部,所用到的 任何 data 中的数据发送了变化,就会立即重新计算 这个 计算属性的值

<body>
  <div id="app">
      <input type="text" v-model="firstname">+
      <input type="text" v-model="lastname">=
      <input type="text" v-model="fullname">
  </div>


  <script>
    // 创建 Vue 实例,得到 ViewModel
    var vm = new Vue({
      el: '#app',
      data: {
          firstname: '',
          lastname: '',
      },
      methods: {},
      watch: {},
      computed: {
          'fullname': function(){
              return this.firstname + '-' + this.lastname
          }
      }
    });
  </script>
</body>


注意:
1.fullname没有在data中定义
2.在compute定义fullname后直接return出去就好

注意3: 计算属性的求值结果,会被缓存起来,方便下次直接使用; 如果 计算属性方法中,所有的任何数据,都没有发生过变化,则不会重新对计算属性求值;

例:我们在fullname函数中定义输出一个ok,并且在主页中调用输出fullname

<body>
  <div id="app">
      <input type="text" v-model="firstname">+
      <input type="text" v-model="lastname">=
      <input type="text" v-model="fullname">

      <p>{{ fullname }}</p>
      <p>{{ fullname }}</p>
      <p>{{ fullname }}</p>
  </div>
  <script>
    // 创建 Vue 实例,得到 ViewModel
    var vm = new Vue({
      el: '#app',
      data: {
          firstname: '',
          lastname: '',
      },
      methods: {},
      watch: {},
      computed: {
          'fullname': function(){
              console.log('ok')
              return this.firstname + '-' + this.lastname
          }
      }
    });


  </script>
</body>

打开页面:



输入值之后结果如下:



也就是说,不会因为页面中调用几次函数去执行几次,只会根据函数执行来调用函数

四、watch、computed和methods之间的对比

1、computed属性的结果会被缓存,除非依赖的响应式属性变化才会重新计算。主要当作属性来使用;
2、methods方法表示一个具体的操作,主要书写业务逻辑;
3、watch一个对象,键是需要观察的表达式,值是对应回调函数。主要用来监听某些特定数据的变化,从而进行某些具体的业务逻辑操作;可以看作是computed和methods的结合体;




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2