Vue.js中的计算属性、监视属性与生命周期详解

Vue.js中的计算属性、监视属性与生命周期详解

计算属性

什么是计算属性

计算属性(computed)是Vue.js内置的一个特殊属性,可以定义一个依赖其它属性的计算属性,而这个计算属性的值会被缓存起来,在某些需要频繁用到的属性计算中,计算属性会比直接通过方法计算效率更高,因为计算属性是有缓存的,只有在它的相关属性发生改变时才会重新计算,否则直接取缓存值。

计算属性的使用方法

计算属性的基本语法如下:

computed: {
  计算属性名: function() {
    // 计算逻辑
    return 计算结果
  }
}

举个例子,我们定义一个data属性a和一个计算属性b,b的取值依赖于a,那么我们可以这样写:

<div id="app">
  <p>data属性a的值为:{{ a }}</p>
  <p>计算属性b的值为:{{ b }}</p>
</div>
var vm = new Vue({
  el: '#app',
  data: {
    a: 1
  },
  computed: {
    b: function () {
      return this.a + 1
    }
  }
})

在此例子中,a的值为1,因此b的值就是a+1,所以b的值为2。

如果我们继续修改a的值,b的值会自动更新。例如我们执行下面的代码:

vm.a = 2
console.log(vm.b) // 输出 3

此时b的值就从之前的2变成了3。

计算属性示例

假设我们有一个商品列表列表,每个商品有价格和数量两个属性,那么一个计算属性可以计算出当前购物车的总价:

<div id="app">
  <ul>
    <li v-for="item in cart">
      {{ item.name }} - {{ item.price }}元 x {{ item.count }}个 = {{ item.totalPrice }}元
    </li>
  </ul>
  <p>总价:{{ totalPrice }}</p>
</div>
var vm = new Vue({
  el: '#app',
  data: {
    cart: [
      { id: 1, name: '商品1', price: 10, count: 3 },
      { id: 2, name: '商品2', price: 20, count: 2 },
      { id: 3, name: '商品3', price: 30, count: 1 }
    ]
  },
  computed: {
    totalPrice: function() {
      var total = 0
      for (var i = 0; i < this.cart.length; i++) {
        var item = this.cart[i]
        total += item.price * item.count
      }
      return total
    }
  }
})

在计算属性totalPrice中,我们循环遍历购物车中的每个商品,累加它们的总价,最后返回总价。在模板中使用该计算属性,便可以直接显示购物车的总价。

监视属性

什么是监视属性

监视属性(watcher)是Vue.js中的另一个重要特性,可用于监听某个属性的变化,当属性发生变化时,可以执行一段自定义的代码逻辑,例如发送一次Ajax请求、更新一次DOM、再次执行计算属性等。

监视属性的使用方法

watch属性的基本语法如下:

watch: {
  监视属性名: function (newVal, oldVal) {
    // 变化逻辑
  }
}

举个例子,假设我们有两个属性a和b,当a的值发生变化时,我们需要将b的值更新为a的两倍,我们可以这样写:

<div id="app">
  <p>a的值是:{{ a }}</p>
  <p>b的值是:{{ b }}</p>
</div>
var vm = new Vue({
  el: '#app',
  data: {
    a: 1,
    b: 2
  },
  watch: {
    a: function (newVal, oldVal) {
      this.b = newVal * 2
    }
  }
})

在此例子中,当我们修改a的值,b的值会自动更新为a的两倍。

监视属性示例

假设我们要监听一个输入框的变化,每当用户输入完毕并离开输入框时,我们需要发送一次Ajax请求,获取用户输入的关键词所匹配的结果:

<div id="app">
  <input v-model="keyword" @blur="search">
  <ul>
    <li v-for="(item, index) in searchResult" :key="index">{{ item }}</li>
  </ul>
</div>
var vm = new Vue({
  el: '#app',
  data: {
    keyword: '',
    searchResult: []
  },
  methods: {
    search: _.debounce(function () {
      // 发送Ajax请求
      var that = this
      axios.get('/api/search', {
        params: {
          keyword: that.keyword
        }
      })
      .then(function (response) {
        that.searchResult = response.data
      })
      .catch(function (error) {
        console.log(error)
      })
    }, 500)
  }
})

在此例子中,我们在输入框上监听了blur事件,当用户离开输入框时,会自动触发search方法,发送Ajax请求,并将结果保存到searchResult中,最终在模板中显示出搜索结果。

生命周期

什么是生命周期

生命周期(lifecycle)是Vue.js中的另一个重要概念,它描述了Vue.js实例从创建、运行到销毁期间经历的状态变化,以及在每个状态变化时自动执行的函数。

生命周期的阶段

Vue.js实例经历了以下生命周期阶段:

  1. 创建阶段:beforeCreate、created;
  2. 挂载阶段:beforeMount、mounted;
  3. 更新阶段:beforeUpdate、updated;
  4. 销毁阶段:beforeDestroy、destroyed。

在每个阶段,Vue.js都会自动触发一些固定名称的函数,开发者可以利用这些生命周期钩子函数在不同阶段执行一些自定义的代码。

生命周期示例

假设我们开发了一个弹出对话框的组件,当需要弹出对话框时,我们需要先将对话框组件动态创建并挂载到页面中,待用户关闭对话框后,我们又需要销毁它。生命周期函数可以帮助我们完成这个任务。

<div id="app">
  <button @click="showDialog">显示对话框</button>
  <modal v-if="show" @close="closeDialog"></modal>
</div>
Vue.component('modal', {
  template: `
    <div class="modal">
      <div class="modal-mask"></div>
      <div class="modal-wrapper">
        <div class="modal-container">
          <div class="modal-header">
            <h3 class="modal-title"><slot name="header"></slot></h3>
            <button class="modal-close" @click="$emit('close')">×</button>
          </div>
          <div class="modal-body"><slot></slot></div>
        </div>
      </div>
    </div>
  `,
  mounted: function () {
    document.body.appendChild(this.$el)
  },
  beforeDestroy: function () {
    this.$el.parentNode.removeChild(this.$el)
  }
})

var vm = new Vue({
  el: '#app',
  data: {
    show: false
  },
  methods: {
    showDialog: function () {
      this.show = true
    },
    closeDialog: function () {
      this.show = false
    }
  }
})

在此例子中,我们定义了一个modal组件,并在其中的mounted函数中将组件的DOM元素动态挂载到body元素中。然后在组件被销毁前,我们又在组件的beforeDestroy函数中,将其DOM元素从body元素中移除。

在Vue.js实例中,我们定义了show属性,表示对话框是否显示,在关闭对话框时,我们将show属性设置为false,从而销毁对话框组件。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Vue.js中的计算属性、监视属性与生命周期详解 - Python技术站

(0)
上一篇 2023年5月28日
下一篇 2023年5月28日

相关文章

  • 如何使用vuex实现兄弟组件通信

    熟悉Vue框架的人都知道,在Vue组件之间传递数据的方法实在是太多了,包括props、$emit、$parent、$root等等,那么这些方法是否可以满足所有的组件通信需求呢?答案是不一定,有些情况下,我们需要一些更高级的方法来进行组件通信,这时候,Vuex就成了我们事半功倍的存在。 Vuex是什么?Vuex是一个专为Vue.js应用程序开发的状态管理模式。…

    Vue 2023年5月28日
    00
  • 深入浅析Vue中的Prop

    深入浅析Vue中的Prop 1. 什么是Prop Prop(属性)是Vue中组件间通信的一种方式,它是父组件向子组件传递数据的一种方式。使用Prop,我们可以将父组件中的数据使用属性的形式传递给子组件使用。 2. Prop的使用 2.1. 在子组件中声明和使用Prop: 在子组件中一般使用props选项声明要接收的数据,接收到的数据会作为子组件的一个属性,可…

    Vue 2023年5月28日
    00
  • Vue3 源码导读(推荐)

    下面就详细讲解一下“Vue3 源码导读(推荐)”的完整攻略。 概述 在Vue.js开发过程中,我们都知道Vue.js是一个非常好用的MVVM框架,而Vue.js3的发布也备受关注。Vue.js 3.0采用完全重写的方式,核心代码相比2.x版本变化较大,提高了性能。 导读 为了能够更好地学习Vue.js 3.0,我们需要先了解Vue.js 3.0的源码结构和架…

    Vue 2023年5月27日
    00
  • 基于vue实现图片验证码倒计时60s功能

    要实现基于vue的图片验证码倒计时功能,我们可以按照以下步骤进行操作: 安装必要的依赖 首先,我们需要安装以下依赖: vue:用于构建用户界面的渐进式框架 vue-resource:用于发送http请求 vue-countdown:用于实现倒计时功能 可以使用以下命令进行依赖安装: npm install vue vue-resource vue-count…

    Vue 2023年5月29日
    00
  • vue引入css文件导致全局污染的问题

    下面是详细的讲解“Vue引入CSS文件导致全局污染的问题”的攻略。 什么是全局污染 全局污染是指在 JavaScript 中定义了一个全局变量,但是由于变量名与其他已有的全局变量或者框架中的属性名重复,导致变量被覆盖或污染,从而影响了程序的正常运行。在 Vue 中也同样会出现全局污染的问题。 Vue 引入 CSS 文件导致全局污染的问题 在 Vue 的组件化…

    Vue 2023年5月28日
    00
  • 详解vue中v-model和v-bind绑定数据的异同

    详解Vue中v-model和v-bind绑定数据的异同: 1.什么是 v-model 和 v-bind v-model 和 v-bind 是 Vue 常用的两个指令,它们都用于进行数据绑定。其中: v-model 用于实现表单控件的双向绑定。 v-bind 用于单向绑定,可动态绑定 HTML 属性。 2.v-model 与 v-bind 的区别 2.1 数据…

    Vue 2023年5月27日
    00
  • node实现socket链接与GPRS进行通信的方法

    要实现Node.js实现与GPRS进行通信的方法,需要考虑以下步骤: Node.js服务端:首先需要在Node.js服务端建立socket通信,用于接受来自GPRS设备的请求。可以使用Node.js的net模块来创建TCP连接。 数据格式:GPRS和Socket通信时,需要协商好数据的格式,因为Socket只支持字符串和Buffer两种数据类型。因此在通信前…

    Vue 2023年5月28日
    00
  • 关于vue文件中index.vue的使用方法

    当开发使用Vue.js来构建应用程序时,组件化是非常重要的获得代码可读性和可维护性的方式之一。Vue.js的项目中,我们使用.vue文件格式来创建组件。其中,index.vue是组件文件中非常常见的一个文件名。 文件介绍 在Vue的组件中,.vue文件通常包含三个部分: template、script和style,分别实现三个部分功能:视图、行为和样式。而在…

    Vue 2023年5月28日
    00
合作推广
合作推广
分享本页
返回顶部