Vue 生命周期与属性

在开发中,常涉及的 Vue 生命周期含 created 和 mounted,常用的属性含方法属性 methods、计算属性 computed、监听属性 watch 等,因此本文仅介绍上述五个知识,完整的 Vue 生命周期可以参考该博客进行学习。

created

Vue 生命周期中的 created 是指 template 渲染成 html 前的阶段。在该阶段中,通常需要初始化某些数据值,比如向后端发送请求以获取页面信息,然后再渲染视图。

示例:进入用户设置页面,需要请求后端,获取用户名、邮箱等基础信息。

<template>
    <div>
        <p>{{ username }}</p>
        <p>{{ email }}</p>
    </div>
</template>
<script>
export default {
    data() {
        return {
            username: '',
            email: '',
        }
    },
    created() {
        // 使用 axios 向后端发送请求,后续文章将介绍到,此处仅表示该意思
        this.$axios.post(...)
        // 将返回值赋值给数据
        this.username = res.data.username;
        this.email = res.data.email;
    }
}
</script>

mounted

mounted 是在 template 渲染成 html 后的阶段。在该阶段中,也就是初始化页面完成后,通常对 html 的某些 DOM 节点进行一些操作,比如绘制图表渲染到某个节点上。这些操作由于涉及 DOM 节点,不能在 created 阶段中完成,因为该阶段还未渲染出相关节点。

HTML DOM 将 HTML 当作由各标签组成的树结构,DOM 节点可视为各标签渲染出来的结构节点

相比 created,mounted 较为少用,该阶段的操作常需要用下面命令获取 id 为 xxx 的 DOM 节点,再将图表渲染到该节点。

var x = document.getElementById("xxx");

methods

在 Vue 的 methods 属性中,常定义事件处理方法,用于绑定和处理点击、回车事件等,当然,也可以将方法作为插值直接渲染。

示例:使用 login 函数处理点击按钮事件。

<template>
    <div>
        <input v-model="msg">
        <button @click="login">登录</button>
    </div>    
</template>
<script>
export default {
  data() {
    return {
      msg: ""
    }
  },
  methods: {
    login: function() {
      if (this.msg !== '') alert("登录成功!");
      else alert("登录失败!");
    }
  }
}
</script>

computed

在 Vue 中,可以定义计算属性对数据进行处理,并返回处理结果。

下面的例子定义了 rmsg 属性,计算 msg 的反转字符串:

<template>
    <div>
      <p>{{ msg }}</p>
    <p>{{ rmsg }}</p>
    <p>{{ rmsg_by_method() }}</p>
  </div>
</template>
<script>
export default {
  data() {
    return {
      msg: "软件学院"
    }
  },
  computed: {
    rmsg: function() {
      return this.msg.split('').reverse().join('');
    }
  },
  methods: {
    rmsg_by_method: function() {
      return this.msg.split('').reverse().join('');
    }
  }
}
</script>

在上面的示例中,还定义了一个方法,实现了与计算属性一致的效果。那 computedmethods 的区别是什么?

[!NOTE|style:flat] computed 是基于依赖缓存的,只有相关依赖发生改变时才会重新计算值;而使用 methods,在重新渲染或再次调用的时候,函数总会重新调用执行,可以理解一下菜鸟教程中的示例。在没有使用依赖缓存时,推荐使用 methods,它能接受参数,使用更灵活。

目前我们只介绍了计算属性的 getter,即获取值,在需要时可以定义该属性的 setter。

下面例子为 site 属性定义了 setter,当为该属性赋值时,将调用定义的 setter。

<template>
  <div>
    <p>{{ site }}</p>
      <p>{{ name }}</p>
    <p>{{ url }}</p>
  </div>
</template>
<script>
export default {
  created() {
    this.site = "ZewanHuang blog.zewan.cc";
  },
  data() {
    return {
      name: '',
      url: '',
    }
  },
  computed: {
    site: {
      // getter
      get: function () {
        return this.name + ' ' + this.url
      },
      // setter
      set: function (newValue) {
        var names = newValue.split(' ')
        this.name = names[0]
        this.url = names[names.length - 1]
      }
    }
  },
}
</script>

watch

Vue 的监听属性 watch,可以用来监听数据、响应数据的变化。

示例一:利用 watch 实现计数器。

<template>
    <div>
      <p>计数器:{{ counter }}</p>
      <button @click="counter++">加一</button>
    </div>
</template>
<script>
export default {
  data() {
    return {
      counter: 1
    }
  },
  watch: {
    counter(newVal, oldVal) {
      alert("计数器:" + oldVal + "变为" + newVal);
    }
  }
}
</script>

示例二:实现千米和米之间的换算。

<template>
    <div>
      <div>千米:<input v-model="kilometer"></div>
      <div>米:<input v-model="meter"></div>
    </div>
</template>
<script>
export default {
  data() {
    return {
      kilometer: '',
      meter: ''
    }
  },
  watch: {
    kilometer(newVal) {
      this.meter = newVal*1000;
    },
    meter(newVal) {
      this.kilometer = newVal/1000;
    }
  }
}
</script>

Copyright © blog.zewan.cc 2022 all right reserved,powered by Gitbook该文章修订时间: 2022-03-25 03:21:11

results matching ""

    No results matching ""