2019-06-22名称案例

2019-06-22  本文已影响0人  啊_6424

我们要天监听到文本框数据的改变,这样才能知道什么时候才能拼接出一个fullname
如何监听到文本框数据的改变:用keyup事件,或者操作原生节点(ref属性),或者用computed属性,或者监听

  <div id="app">
    <input type="text" v-model:value="firstname" @keyup.enter="getFullName">+
    <input type="text" v-model:value="lastname" @keyup.enter="getFullName">=
    <input type="text" v-model:value="fullname">
  </div>
.......
var vm = new Vue({
  el: "#app",
  data:{
    firstname:"",
    lastname: "",
    fullname: "",
  },
  methods:{
    getFullName(){
      console.log("执行了函数!");
      this.fullname = this.firstname + "-" + this.lastname;
    },
  }
});

如果把@keyup.enter换成了@keyup的话,那么每点击一下键盘就执行一次函数,会有失误。

    <!-- watch监听 -->
    <input type="text" v-model:value="firstname">+
    <input type="text" v-model:value="lastname">=
    <input type="text" v-model:value="fullname">
......
var vm = new Vue({
  el: "#app",
  data:{
    firstname:"",
    lastname: "",
    fullname: "",
  },
  watch: {
    firstname: function(){
      //当firstname变化了的时候,会触发这个函数。
      //firstname也可以写成“firstname”,如果名称为first-name则必须写为“first-name”形式,不能省去引号
      this.fullname = this.firstname + "-" + this.lastname;
    },
    "lastname": function(newVal, oldVal){
      this.fullname = this.firstname + "-" + newVal;
    }
  },
});

看了这个案例,会觉得wacth太复杂了,不如methods方式好。但,watch有专属于自己的用途,即是当我们的数据是非DOM元素的数据;我们没办法给它一个事件去监听它的改变的时候,就可以使用watch监听。
比如说我们登陆/注册组件切换案例中,用方法没法监听到路由的改变,进到登陆页面输出“欢迎进入登陆界面”,进入注册界面输出“欢迎进入注册界面”。这时我们可以采用watch监听。

  <div id="app">
   <!-- watch监听路由地址的改变 -->
    <div class="container">
        <router-link to="/login" tag="span">登陆</router-link>
        <router-link to="/register" tag="span">注册</router-link>
    </div>
    <router-view></router-view>
  </div>

  <template id="login">
    <div class="container">
      <div class="h1">登陆</div>
      <form action="" class="form form-inline">
        <label for="">用户名:<input type="text" class="form-control"></label>
        <label for="">密码:<input type="paassowrd" class="form-control"></label>
      </form>
    </div>
  </template>
  <template id="register">
    <div class="container">
      <div class="h1">注册</div>
      <form action="" class="form form-inline">
        <label for="">用户名:<input type="text" class="form-control"></label>
        <label for="">密码:<input type="password" class="form-control"></label>
        <label for="">确认密码:<input type="password" class="form-control"></label>
      </form>
    </div>
  </template>
</body>
</html>
<script>
  //( 路由)模板对象
var myLogin = {
  template: "#login",
}
var myRegister = {
  template: "#register",
}
//路由对象,以及路由匹配规则
var router = new VueRouter({
  routes:[
    {path:"/login",component:myLogin},
    {path:"/register",component:myRegister},
  ]
});

var vm = new Vue({
  el: "#app",
  data:{
    firstname:"",
    lastname: "",
    fullname: "",
  },
  watch: {
    "$route.path": function(newVal, oldVal){
        if(newVal === "/login"){
          console.log("欢迎进入登陆界面");
        } else {
          console.log("欢迎进入注册界面");
        }
    }
  },
  //注册到Vue实例身上去
  router
});
</script>
    <input type="text" v-model:value="firstname">+
    <input type="text" v-model:value="lastname">=
    <input type="text" v-model:value="fullname">
......
var vm = new Vue({
  el: "#app",
  data:{
    firstname:"",
    lastname: "",
    // fullname: "",
  },
  computed:{
    "fullname": function(){
     return this.firstname + "-" + this.lastname;
    }
  },
}
计算属性的特性:

1.在引用的时候,一定不要加小括号,就当成属性去引用。
2.计算属性内部所依赖的data里边的数据发生了变化,就会立即重新计算计算属性的值。
3.计算属性的求职结果会被缓存起来,方便下次直接调用。如果我们计算属性里的值都没有发生变化,不管在页面中调用了多少次计算属性,都不会被重新计算。这样提高了程序运行效率

methods ,watch,computed三者之间的比较

只要是watch或者计算属性,都是一个function;但计算属性无论如何都要返回一个值出去并且缓存起来,而watch不用;
methods里也是一个function,但它里面的函数更侧重于业务逻辑的处理;而watch的键是需要观察的表达式,值是对应的回调函数,回调函数有两个值(newVal,oldVal),主要用于监听到某些特定数据变化后,执行特性的业务逻辑, 像是conputed和methods的结合体。

上一篇 下一篇

猜你喜欢

热点阅读